powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Замена для Tuple
25 сообщений из 28, страница 1 из 2
Замена для Tuple
    #38984115
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)

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

За: ещё скорость (x10) / Против: Не со всеми типами проходит. (object)
Откуда такие сведения?
...
Рейтинг: 0 / 0
Замена для Tuple
    #38984243
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединяюсь к вопросу: x5-x10 по сравнению с чем и в каких операциях?
...
Рейтинг: 0 / 0
Замена для Tuple
    #38984275
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Замена для Tuple
    #38984297
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как обычно, обращу внимание на задачу, которую решает ТС: "хочется Tuple, только свой православный".
Основной минус Tuple - отсутствие декларативного смысла передаваемых данных.

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


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



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

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

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


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


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

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

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

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

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

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

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

Я передавал в ado.net набор пар имя-значение для записи в бд, например. Для простых рутинных задач тапл подходит
...
Рейтинг: 0 / 0
Замена для Tuple
    #38986075
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например функция меняющая местами элементы в кортеже в 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
Замена для Tuple
    #38991599
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Замена для Tuple
    #38991650
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation
изобретение велосипеда
чем не устроил KeyValuePair<,>?
Может прежде чем писать, стоит заглянуть в msdn?
...
Рейтинг: 0 / 0
Замена для Tuple
    #38991815
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНапример функция меняющая местами элементы в кортеже в 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
Замена для Tuple
    #38991896
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhВажно, чтобы читабельность была.
Чем меньше букв, тем лучше читабельность.
...
Рейтинг: 0 / 0
Замена для Tuple
    #38991898
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЧем меньше букв, тем лучше читабельность. https://ru.wikipedia.org/wiki/Brainfuck
...
Рейтинг: 0 / 0
Замена для Tuple
    #38991910
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕвгенийВЧем меньше букв, тем лучше читабельность. https://ru.wikipedia.org/wiki/Brainfuck
...
Рейтинг: 0 / 0
Замена для Tuple
    #38991970
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВWinnipuhВажно, чтобы читабельность была.
Чем меньше букв, тем лучше читабельность.

о!

не всегда
...
Рейтинг: 0 / 0
Замена для Tuple
    #38991971
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Замена для Tuple
    #38991976
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhо!

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

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

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


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