Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Замена для Tuple / 25 сообщений из 28, страница 1 из 2
15.06.2015, 16:54
    #38984115
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Микрософт по непонятным причинам реализовала Tuple<[,]> как класс.
Так-как часто сталкиваюсь с этим недоразумением и такое положение дел меня не устраивает решил написать замену как struct и так-же на дженеках. (i.e. struct STuple<T1,T2>)

Теперь теоретические вопросы:

Стоит ли определять интерфейс IComparable<T> для структуры? (struct STuple<T1,T2> : IComparable<STuple<T1,T2>>)
За: скорость(x5) / Против: Не всегда уместно.

Стоит ли прописывать ограничения для герик аргументов?
(struct STuple<T1,T2> : IComparable<STuple<T1,T2>> where T1 : IEquatable<T1>, IComparable<T1>)
За: ещё скорость(x10) / Против: Не со всеми типами проходит. (object)

Интересуют соображения сообщества по вопросам.
...
Рейтинг: 0 / 0
15.06.2015, 19:12
    #38984221
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
mikronЗа: скорость (x5) / Против: Не всегда уместно.

За: ещё скорость (x10) / Против: Не со всеми типами проходит. (object)
Откуда такие сведения?
...
Рейтинг: 0 / 0
15.06.2015, 19:48
    #38984243
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Присоединяюсь к вопросу: x5-x10 по сравнению с чем и в каких операциях?
...
Рейтинг: 0 / 0
15.06.2015, 20:43
    #38984275
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Pallaris, Нахлобуч

по результатам теста. Точные цифры не столь важны, я их дал только для приблизительной оценки. Интересно было бы услышать аргументы за/против. Тест тоже можно обсудить, но не о нём в первую очередь речь.


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
        [TestMethod]
        public void TestComparePerformance()
        {
            const int LOOP = 10000000;
            int sumCmp = 0;
            var stopwatch = new Stopwatch();

            var ft1 = FTuple.New(1, 2, 3, 4);
            var ft2 = FTuple.New(1, 2, 3, 4);

            stopwatch.Restart();
            for (int i = LOOP; --i >= 0; )
                sumCmp += ft1.CompareTo(ft2);
            stopwatch.Stop();
            Assert.AreEqual(0, sumCmp);
            System.Diagnostics.Debug.WriteLine("Time for FTuple {0}", stopwatch.Elapsed);


            var st1 = STuple.New(1, 2, 3, 4);
            var st2 = STuple.New(1, 2, 3, 4);

            stopwatch.Restart();
            for (int i = LOOP; --i >= 0; )
                sumCmp += st1.CompareTo(st2);
            stopwatch.Stop();
            Assert.AreEqual(0, sumCmp);
            System.Diagnostics.Debug.WriteLine("Time for STuple {0}", stopwatch.Elapsed);

            // Using of the interface is not necessary but I admit it a fair test 
            stopwatch.Restart();
            var sc1 = (IComparable) st1;
            for (int i = LOOP; --i >= 0; )
                sumCmp += sc1.CompareTo(st2);
            stopwatch.Stop();
            Assert.AreEqual(0, sumCmp);
            System.Diagnostics.Debug.WriteLine("Time for STuple#2 {0}", stopwatch.Elapsed);


            // Current DotNet implementation
            var t1 = Tuple.Create(1, 2, 3, 4);
            var t2 = Tuple.Create(1, 2, 3, 4);

            stopwatch.Restart();
            for (int i = LOOP; --i >= 0; )
                sumCmp += ((IComparable) t1).CompareTo(t2);
            stopwatch.Stop();
            Assert.AreEqual(0, sumCmp);
            System.Diagnostics.Debug.WriteLine("Time for Tuple {0}", stopwatch.Elapsed);

            stopwatch.Restart();
            var c1 = (IComparable) t1;
            for (int i = LOOP; --i >= 0; )
                sumCmp += c1.CompareTo(t2);
            stopwatch.Stop();
            Assert.AreEqual(0, sumCmp);
            System.Diagnostics.Debug.WriteLine("Time for Tuple#2 {0}", stopwatch.Elapsed);
        }


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Test Name:	TestComparePerformance
Test Outcome:	Passed
Result StandardOutput:	
Debug Trace:
Time for FTuple 00:00:00.2247311
Time for STuple 00:00:00.5000002
Time for STuple#2 00:00:00.6000168
Time for Tuple 00:00:02.7431526
Time for Tuple#2 00:00:02.7659769


...
Рейтинг: 0 / 0
15.06.2015, 21:53
    #38984297
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Как обычно, обращу внимание на задачу, которую решает ТС: "хочется Tuple, только свой православный".
Основной минус Tuple - отсутствие декларативного смысла передаваемых данных.

Стоит сравнить по читабельности:
Код: c#
1.
public void Foo(MyOperationRequest request)


и
Код: c#
1.
public void Foo(Tuple<int, string> request)



На мой взгляд, выбор очевиден: первый вариант банально ближе к литературному программированию, потому он правильный.

Итого, мое ИМХО: Tuple и ему подобные конструкции - вирусный антипаттерн

С Уважением
...
Рейтинг: 0 / 0
15.06.2015, 22:12
    #38984304
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
zz118Стоит сравнить по читабельности:
Код: c#
1.
public void Foo(MyOperationRequest request)


и
Код: c#
1.
public void Foo(Tuple<int, string> request)


На мой взгляд, выбор очевиден

Плодить сомнительный класс ради пары int-string? Еще и перегружать самому GetHashCode и Equals? Да, выбор очевиден.
...
Рейтинг: 0 / 0
15.06.2015, 22:16
    #38984306
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
zz118На мой взгляд, выбор очевиден: первый вариант банально ближе к литературному программированию, потому он правильный.
где деньги, Зин?
...
Рейтинг: 0 / 0
16.06.2015, 13:48
    #38984780
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
zz118
Итого, мое ИМХО: Tuple и ему подобные конструкции - вирусный антипаттерн

Это типичный кортеж из ФЯП.
...
Рейтинг: 0 / 0
16.06.2015, 14:45
    #38984867
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
PallarisПлодить сомнительный класс ради пары int-string? Еще и перегружать самому GetHashCode и Equals? Да, выбор очевиден.

Чужие проэкты поддерживали? когда передаются кучи параметров через запятую, и не знаешь, кто кому принадлежит...
Если надо передать аргументы - то вон даже в стандартных эвентах сделали EventArgs ...

В контексте сказанного -
Чем Тупл лучше, чем stringly-typed development?
Так еще и типы будут разные....

За 10 лет ни разу не столкнулся с надобностью кортежа. Хотя как раз большая часть работы была - интеграция и кооперация...
...
Рейтинг: 0 / 0
16.06.2015, 15:43
    #38984943
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
D129В контексте сказанного -
Чем Тупл лучше, чем stringly-typed development?
Так еще и типы будут разные....
Его можно по месту, а не отдельно. В языках, где есть например, сопоставление с образом - штука не заменимая.

D129За 10 лет ни разу не столкнулся с надобностью кортежа. Хотя как раз большая часть работы была - интеграция и кооперация...
Это только привычка.
...
Рейтинг: 0 / 0
16.06.2015, 17:53
    #38985111
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
D129За 10 лет ни разу не столкнулся с надобностью кортежа.

Я передавал в ado.net набор пар имя-значение для записи в бд, например. Для простых рутинных задач тапл подходит
...
Рейтинг: 0 / 0
17.06.2015, 17:20
    #38986075
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Например функция меняющая местами элементы в кортеже в C# выглядит
Код: c#
1.
2.
3.
4.
public static Tuple<T2, T1> Swp<T1, T2>(T1 t1, T2 t2)
        {
            return Tuple.Create(t2, t1);
        }


В F#
Код: c#
1.
let swp (a, b) = (b, a)


много меньше буков благодаря более мощному механизму вывода типов
...
Рейтинг: 0 / 0
24.06.2015, 13:34
    #38991599
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
mikronМикрософт по непонятным причинам реализовала Tuple<[,]> как класс.
Так-как часто сталкиваюсь с этим недоразумением и такое положение дел меня не устраивает решил написать замену как struct и так-же на дженеках. (i.e. struct STuple<T1,T2>)

Теперь теоретические вопросы:

Стоит ли определять интерфейс IComparable<T> для структуры? (struct STuple<T1,T2> : IComparable<STuple<T1,T2>>)
За: скорость(x5) / Против: Не всегда уместно.

Стоит ли прописывать ограничения для герик аргументов?
(struct STuple<T1,T2> : IComparable<STuple<T1,T2>> where T1 : IEquatable<T1>, IComparable<T1>)
За: ещё скорость(x10) / Против: Не со всеми типами проходит. (object)

Интересуют соображения сообщества по вопросам.

изобретение велосипеда
чем не устроил KeyValuePair<,>?
...
Рейтинг: 0 / 0
24.06.2015, 14:12
    #38991650
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
pation
изобретение велосипеда
чем не устроил KeyValuePair<,>?
Может прежде чем писать, стоит заглянуть в msdn?
...
Рейтинг: 0 / 0
24.06.2015, 16:24
    #38991815
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
ЕвгенийВНапример функция меняющая местами элементы в кортеже в C# выглядит
Код: c#
1.
2.
3.
4.
public static Tuple<T2, T1> Swp<T1, T2>(T1 t1, T2 t2)
        {
            return Tuple.Create(t2, t1);
        }


В F#
Код: c#
1.
let swp (a, b) = (b, a)


много меньше буков благодаря более мощному механизму вывода типов

Имхую, что прошло то время, когда считали буквы и байты памяти.
Важно, чтобы читабельность была.
...
Рейтинг: 0 / 0
24.06.2015, 17:44
    #38991896
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
WinnipuhВажно, чтобы читабельность была.
Чем меньше букв, тем лучше читабельность.
...
Рейтинг: 0 / 0
24.06.2015, 17:48
    #38991898
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
ЕвгенийВЧем меньше букв, тем лучше читабельность. https://ru.wikipedia.org/wiki/Brainfuck
...
Рейтинг: 0 / 0
24.06.2015, 18:03
    #38991910
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Shocker.ProЕвгенийВЧем меньше букв, тем лучше читабельность. https://ru.wikipedia.org/wiki/Brainfuck
...
Рейтинг: 0 / 0
24.06.2015, 19:00
    #38991970
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
ЕвгенийВWinnipuhВажно, чтобы читабельность была.
Чем меньше букв, тем лучше читабельность.

о!

не всегда
...
Рейтинг: 0 / 0
24.06.2015, 19:01
    #38991971
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Shocker.ProЕвгенийВЧем меньше букв, тем лучше читабельность. https://ru.wikipedia.org/wiki/Brainfuck
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//типы данных:
х: сомнительное целое;
а: мало_похоже_на массив [x..y а_может_быть z] каких_нибудь символов;
L: безнадежно_поврежденный список слишком_маленьких целых;
//присвоение значения переменной:
x ТОЧНО 3;
x ЧЕСТНОЕ_СЛОВО 3;
x МАМОЙ_КЛЯНУСЬ 3;
//условия:
ЕСЛИ y ЧТО_ТО_ОКОЛО 8 ...
ПРИ_МАЛЕЙШЕМ_ПОДОЗРЕНИИ_ЧТО x < 100...
//вызов процедуры:
СБЕГАЙ_КА_ПОИЩИ имяпроцедуры;
...
Рейтинг: 0 / 0
24.06.2015, 19:04
    #38991976
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Winnipuhо!

не всегда
если человек конечно способен к абстрактному мышлению.
...
Рейтинг: 0 / 0
25.06.2015, 09:39
    #38992281
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
ЕвгенийВWinnipuhо!

не всегда
если человек конечно способен к абстрактному мышлению.

любой человек способен к абстрактному мышлению, собака - нет ;-)
...
Рейтинг: 0 / 0
25.06.2015, 10:20
    #38992331
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
Тема окончательно скатилась во флуд=)
...
Рейтинг: 0 / 0
25.06.2015, 10:57
    #38992371
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
mikronИнтересуют соображения сообщества по вопросам.
zz118Тема окончательно скатилась во флуд=)
не вижу противоречия
...
Рейтинг: 0 / 0
25.06.2015, 15:23
    #38992805
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена для Tuple
ЕвгенийВpationизобретение велосипеда
чем не устроил KeyValuePair<,>?
Может прежде чем писать, стоит заглянуть в msdn?
и что?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Замена для Tuple / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]