Re: самые элитные сортировщики гномов
От: sergii.p  
Дата: 12.10.21 06:06
Оценка: +5 :)
Здравствуйте, Codealot, Вы писали:

C>Всякое я раньше видел, но это как-то особенно пробрало.

C>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку? Всё одинаково плохо для такого простого примера. KIS как он есть.
Re[2]: самые элитные сортировщики гномов
От: Ночной Смотрящий Россия  
Дата: 12.10.21 08:05
Оценка: +4
Здравствуйте, sergii.p, Вы писали:

SP>а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку?


Ну, хотя бы так:
private static DataFrameColumn CreateColumn(Type kind, string[] columnNames, int columnIndex)
{
    var colName = GetColumnName(columnNames, columnIndex);
    return kind switch
    {
        typeof (bool) => new BooleanDataFrameColumn(colName),
        typeof (int) => new Int32DataFrameColumn(colName),
        ...
        _ => throw new NotSupportedException()
    };
}
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Отредактировано 12.10.2021 8:06 Ночной Смотрящий . Предыдущая версия .
Re: самые элитные сортировщики гномов
От: Kolesiki  
Дата: 12.10.21 11:05
Оценка: +1 -1 :)
Здравствуйте, Codealot, Вы писали:

C>Всякое я раньше видел, но это как-то особенно пробрало.


Я не понял... тебя "пробрало", но при этом ты тупо фэйспалмишь, ничего не объясняя. И главное, не предлагая правильной альтернативы! Походу ты сам пока джун и увидел тупо простыню кода и считаешь, что это неправильно. Хотя после 10 лет ковыряния в "интыпрайзе" и чёрт-ногу-сломит фабриках и "шаблонах четырёх", ты придёшь к одному выводу — "чем проще выглядит код, тем лучше". Лучше для сопровождения, для отладки, для объяснения другим, для документации и т.п.

В принципе, этот код неплох, но я бы сделал чутка короче: словарь "тип -> конструктор колонки" и далее constr[type].Invoke... (ну или Activator.CreateInstance).
Re[3]: самые элитные сортировщики гномов
От: vdimas Россия  
Дата: 12.10.21 12:57
Оценка: 1 (1) +1
Здравствуйте, Ночной Смотрящий, Вы писали:

SP>>а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку?

НС>Ну, хотя бы так:

Тогда уже через TypeCode
самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 00:30
Оценка: -1
Всякое я раньше видел, но это как-то особенно пробрало.
https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123
Ад пуст, все бесы здесь.
Re[4]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 13:56
Оценка: -1
Здравствуйте, Teolog, Вы писали:

T>если GetColumnName(columnNames, columnIndex) выдаст исключение, оно трегернет первым до проверки типа колонки. Причем уже в другом методе.


ЩИТО?
Ад пуст, все бесы здесь.
Re[3]: самые элитные сортировщики гномов
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 13.10.21 06:37
Оценка: +1
Здравствуйте, yenik, Вы писали:

G>>3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.


Y>Этак можно и NullReferenceException бросать, работать-то будет.

Нельзя. NRE это runtime exeption, а не usage. Человек, увидев NRE, не поймет что произошло.


Y>Нет, если ты выкладываешь код с пространством имён Microsoft, то надо соблюдать соглашения о кодировании Microsoft. Тут похоже, что автор "угадал" назначение NotSupportedException по названию, вместо того, чтобы заглянуть в документацию. А это неправильно.

Может они stack overflow читали https://stackoverflow.com/questions/12669805/when-to-use-invalidoperationexception-or-notsupportedexception
Re: самые элитные сортировщики гномов
От: yenik  
Дата: 13.10.21 07:37
Оценка: +1
C>Всякое я раньше видел, но это как-то особенно пробрало.
C>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

На самом деле, первый метод в классе — самый стёбный.
Re[2]: самые элитные сортировщики гномов
От: white_znake  
Дата: 14.10.21 14:52
Оценка: +1
Здравствуйте, Kolesiki, Вы писали:


K>Ну так вы и не понимаете именно в силу вот таких new NotSupportedException!!

K>Ошибки всегда надо сопровождать локльным контекстом и/или кратким адекватным комментом — "при создании колонки использован неизвестный тип ДаОткудаТыВзялсяТварь".

Я как понял, то устроили порку библиотечному коду.
Так, вот, все исключения типа: NotSupportedException, ArgumentException и тд. — это исключения, возникающие из-за нарушения контракта.
В отлаженном и хорошо написанном пользовательском продукте, использующим данную библиотеку, все эти исключения не должны возникнуть.
Так, что пользователь не должен увидить библиотечные исключения. Так, что throw new ArgumentNullException(nameof({myParameter})) — это норм для библиотечного кода
Re: самые элитные сортировщики гномов
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.10.21 04:22
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Всякое я раньше видел, но это как-то особенно пробрало.

C>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123
Там рядом случайно T4 шаблон не лежит? Выглядит как автогенерённый код.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 05:30
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Там рядом случайно T4 шаблон не лежит? Выглядит как автогенерённый код.


Только для других файлов. Очевидно, они и так справились.
Ад пуст, все бесы здесь.
Re: самые элитные сортировщики гномов
От: yenik  
Дата: 12.10.21 07:05
Оценка:
C>Всякое я раньше видел, но это как-то особенно пробрало.

А что конкретно особенно пробрало?

UPD:
NotSupportedException — это, конечно, ляпсус.

https://docs.microsoft.com/en-us/dotnet/api/system.notsupportedexception?view=net-5.0

The NotSupportedException exception indicates that a method has no implementation and that you should not call it.


Надо ArgumentException.

The exception that is thrown when one of the arguments provided to a method is not valid.


И сообщение более внятное.
Отредактировано 12.10.2021 11:31 yenik . Предыдущая версия .
Re[2]: самые элитные сортировщики гномов
От: vsb Казахстан  
Дата: 12.10.21 07:18
Оценка:
Здравствуйте, sergii.p, Вы писали:

C>>Всякое я раньше видел, но это как-то особенно пробрало.

C>>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

SP>а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку? Всё одинаково плохо для такого простого примера. KIS как он есть.


Причём фабрика-шмабрика, а в конце концов всё равно будет

dataFrameFactory.register(boolean.class, BooleanDataFrameColumnFactory.INSTANCE);
dataFrameFactory.register(int.class, Int32DataFrameColumnFactory.INSTANCE);
...


Ну и какой в этом смысл. Фабрика нужна, если набор динамический. А для статического набора — ну единственный минус, такое линейный поиск имеет сложность O(N), а хеш-таблица имеет сложность O(1). Но скорей всего реально разницы не будет.
Re: самые элитные сортировщики гномов
От: Sharov Россия  
Дата: 12.10.21 07:33
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Всякое я раньше видел, но это как-то особенно пробрало.

C>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

Что не так? Ну возможно можно через switch, хотя не факт.
Кодом людям нужно помогать!
Re[2]: самые элитные сортировщики гномов
От: 4058  
Дата: 12.10.21 07:45
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Codealot, Вы писали:


C>>Всякое я раньше видел, но это как-то особенно пробрало.

C>>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

S>Что не так?


Можно вызов:

GetColumnName(columnNames, columnIndex)

однократно прописать перед блоком if-ов, на производительность не повлияет, но будет меньше копипасты.

То что он будет лишний раз вызван для:

throw new NotSupportedException(nameof(kind));

уже роли особой не играет, на фоне накладных расходов связанных с throw.
Re[3]: самые элитные сортировщики гномов
От: yenik  
Дата: 12.10.21 07:54
Оценка:
4>Можно вызов:

4>
4>GetColumnName(columnNames, columnIndex)
4>

4>однократно прописать перед блоком if-ов, на производительность не повлияет, но будет меньше копипасты.

4>То что он будет лишний раз вызван для:


4>
4>throw new NotSupportedException(nameof(kind));
4>

4>уже роли особой не играет, на фоне накладных расходов связанных с throw.

Ещё можно от переменной ret избавиться (как в методе MaxKind). Но это же всё несущественно.
Re[3]: самые элитные сортировщики гномов
От: Teolog  
Дата: 12.10.21 08:28
Оценка:
4>Можно вызов:

4>
4>GetColumnName(columnNames, columnIndex)
4>

4>однократно прописать перед блоком if-ов, на производительность не повлияет, но будет меньше копипасты.

От этого поведение чуток измениться, если GetColumnName(columnNames, columnIndex) выдаст исключение, оно трегернет первым до проверки типа колонки. Причем уже в другом методе.
Вероятно это и послужило причиной того что сначала проверка, а потом уже GetColumnName
Re: самые элитные сортировщики гномов
От: Kolesiki  
Дата: 12.10.21 11:21
Оценка:
Вот что мне совсем не нравится в обезьяньем коде, так это вот такие "обработчики проблем": (https://github.com/dotnet/machinelearning/blob/main/src/Microsoft.Data.Analysis/DataFrame.IO.cs#L183)

else
{
    throw new NotSupportedException(nameof(kind));
}


Это ублюдство работает до поры до времени, пока прогер сидит локально в CreateColumn(Type kind, string[] columnNames, int columnIndex) и ему "всё понятно". Но когда исключение вылезет эдак на 10 уровней выше, удивлённая индусятина обнаружит "not supported ComplexType" и даже не поймёт, кто кого и зачем должен поддерживать. А ведь ИМЕННО ЭТИ ошибки вылезают у юзера в самый ненужный момент и всё, что предлагает микрософт — "отошлите нам годичную телеметрию, МЫ САМИ НИ ЧЕРТА НЕ ПОНИМАЕМ В СВОЁМ КОДЕ!".
Ну так вы и не понимаете именно в силу вот таких new NotSupportedException!!
Ошибки всегда надо сопровождать локльным контекстом и/или кратким адекватным комментом — "при создании колонки использован неизвестный тип ДаОткудаТыВзялсяТварь".

Собственно, MS потому и прячет всё своё говно под коврик, что они сами не понимают, что за проблема у юзера. Писали бы они нормальные комменты к иксепшынам, распоследний юзер мог бы им НОРМАЛЬНО рапортовать: "ребят, вот такой месыдж, чините!", а не отправлять мегабайты телеметрии, чтобы обезьяна копалась весь день в логах. Аштрисёт!! (ц)
Re: самые элитные сортировщики гномов
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.10.21 12:23
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Всякое я раньше видел, но это как-то особенно пробрало.

C>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

А чем этот код плох?
1) Можно было был if превратить в switch, но видимо код был написан до появления этой фичи в языке.
2) Заменить if\switch на "фабрики" или просто таблицу — сильно просадит перформанс. Тем более сейчас мэтчинг оптимизирован под популярные типы (мы же знаем что переходы вперед предсказываются как ложные).
3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.

Остается только GetColumnName не надо вызывать в каждой ветке, можно вызвать до if. Скорее всего тупо копипаста, в целом неопасная, так как ни вызов GetColumnName, ни его содержимое меняться не будет.
Re[3]: самые элитные сортировщики гномов
От: Mihas  
Дата: 12.10.21 12:48
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Ну, хотя бы так:

Этот код, небось, копируется со времен царя Гороха, когда switch выглядел немногим лучше if else if
Re[2]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 13:54
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку? Всё одинаково плохо для такого простого примера. KIS как он есть.


Предлагаю помнить про DRY и не копипастить GetColumnName(columnNames, columnIndex) в каждую строку. Да и вообще идея тащить в метод весь массив имен, где он нафиг не нужен — она очень странная, мягко говоря.
Странно, что такие азы надо объяснять.
Ад пуст, все бесы здесь.
Re[2]: самые элитные сортировщики гномов
От: IT Россия linq2db.com
Дата: 12.10.21 22:01
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку? Всё одинаково плохо для такого простого примера. KIS как он есть.


Для примитивных типов, которые там примерно все, можно использовать Type.GetTypeCode.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 23:44
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Я не понял... тебя "пробрало", но при этом ты тупо фэйспалмишь, ничего не объясняя.


Если ты с первого взгляда не заметил там тупейшую копи-пасту, то у меня для тебя очень плохие новости.
Ад пуст, все бесы здесь.
Re[2]: самые элитные сортировщики гномов
От: yenik  
Дата: 13.10.21 06:21
Оценка:
G>3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.

Этак можно и NullReferenceException бросать, работать-то будет. Нет, если ты выкладываешь код с пространством имён Microsoft, то надо соблюдать соглашения о кодировании Microsoft. Тут похоже, что автор "угадал" назначение NotSupportedException по названию, вместо того, чтобы заглянуть в документацию. А это неправильно.

G>Остается только GetColumnName не надо вызывать в каждой ветке, можно вызвать до if. Скорее всего тупо копипаста, в целом неопасная, так как ни вызов GetColumnName, ни его содержимое меняться не будет.


А может так и задумано.
http://rsdn.org/forum/flame.comp/8110990.1
Автор: Teolog
Дата: 12.10.21
Re[4]: самые элитные сортировщики гномов
От: yenik  
Дата: 13.10.21 07:03
Оценка:
M>Этот код, небось, копируется со времен царя Гороха, когда switch выглядел немногим лучше if else if

Папка Microsoft.Data.Analysis добавлена 11 марта сего года. Вряд ли код существовал задолго до этого.
Re[4]: самые элитные сортировщики гномов
От: yenik  
Дата: 13.10.21 07:09
Оценка:
G>>>3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.

Y>>Этак можно и NullReferenceException бросать, работать-то будет.

G>Нельзя. NRE это runtime exeption, а не usage. Человек, увидев NRE, не поймет что произошло.

Значит, тип имеет значение. И надо следовать соглашениям.

Y>>Нет, если ты выкладываешь код с пространством имён Microsoft, то надо соблюдать соглашения о кодировании Microsoft. Тут похоже, что автор "угадал" назначение NotSupportedException по названию, вместо того, чтобы заглянуть в документацию. А это неправильно.

G>Может они stack overflow читали https://stackoverflow.com/questions/12669805/when-to-use-invalidoperationexception-or-notsupportedexception

Даже там не сказано делать, как сделал Прашантх Говиндраджан.
Re[2]: самые элитные сортировщики гномов
От: Jack128  
Дата: 14.10.21 07:18
Оценка:
Здравствуйте, yenik, Вы писали:

C>>Всякое я раньше видел, но это как-то особенно пробрало.

C>>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

Y>На самом деле, первый метод в классе — самый стёбный.

Хуже чем стебный, он — тормознутый. Как только мы поняли, что у нас строка в колонке — сразу на выход нужно, а они цикл по всем строчкам крутят.

updated
Посмотрел по внимательнее, а он вообще что нить кроме typeof(string) вернуть может? Чё то как то совсем плохо
Отредактировано 14.10.2021 7:22 Jack128 . Предыдущая версия .
Re[3]: самые элитные сортировщики гномов
От: yenik  
Дата: 14.10.21 11:24
Оценка:
J>Посмотрел по внимательнее, а он вообще что нить кроме typeof(string) вернуть может? Чё то как то совсем плохо

А переменная nbline — что она считает? Если номер строки, то для разных колонок получится разный номер строки.
Re[4]: самые элитные сортировщики гномов
От: Jack128  
Дата: 14.10.21 14:02
Оценка:
Здравствуйте, yenik, Вы писали:

J>>Посмотрел по внимательнее, а он вообще что нить кроме typeof(string) вернуть может? Чё то как то совсем плохо


Y>А переменная nbline — что она считает? Если номер строки, то для разных колонок получится разный номер строки.

Ну в принципе да, номер значащей строки. Для них важно определить первая это значащая строка или нет. По мне все это должно выглядеть примерно так: (+/- опечатки, пишу без IDE)

        private static Type GuessKind(int col, List<string[]> read)
        {
            Type previousType = null;
            foreach (var line in read)
            {
                if (col >= line.Length)
                    throw new FormatException(string.Format(Strings.LessColumnsThatExpected, nbline + 1));

                string val = line[col];

                if (string.IsNullOrEmpty(val) || string.Equals(val, "null", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                var suggestType = bool.TryParse(val, out _) ? typeof(bool)
                    : float.TryParse(val, out _) ? typeof(float)
                    : DateTime.TryParse(val, out _) ? typeof(DateTime)
                    : typeof(string);

                if (previousType == null) 
                {
                    previousType = suggestType;
                }
                if (previousType != suggestType || suggestType == typeof(string))
                {
                    return typeof(string);
                }
            }
            return previousType ?? typeof(string);
        }



Но на самом деле — самое страшное, что у них походу нету тестов. Ибо простейший тест бы показал, что типы колонок неверно определяются.
Re[5]: самые элитные сортировщики гномов
От: yenik  
Дата: 14.10.21 15:03
Оценка:
J>Ну в принципе да, номер значащей строки. Для них важно определить первая это значащая строка или нет.

nbline нужно ещё для сообщения в исключении: Line {0} has less columns than expected (https://github.com/dotnet/machinelearning/blob/fb2adf84a449d48a20daae41ea52fdd5f55ce296/src/Microsoft.Data.Analysis/Strings.resx#L196)
Если встретится "null" (что является валидным значением), то строка не посчитается.
Re[2]: самые элитные сортировщики гномов
От: fk0 Россия https://fk0.name
Дата: 18.10.21 23:11
Оценка:
Здравствуйте, sergii.p, Вы писали:

C>>Всякое я раньше видел, но это как-то особенно пробрало.

C>>https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123

SP>а что тут такого? Предлагаете писать фабрику для каждого типа? Или может мапы строить и потом по рефлексии создавать колонку? Всё одинаково плохо для такого простого примера. KIS как он есть.


А если будет 10000 разных типов? По крайней мере switch-case оптимизируется до выбора по таблице.
Но почему бы kind не свести к индексу в таблице сразу и не выбрать. Ну или мапу построить,
всяко O(log(N)) сильно лучше, чем O(N). Но O(1) вообще же лучше (выбор из таблицы). Я понимаю,
что до трёх десятков элементов это не сильно принципиально... Но вот Ctrl-C/Ctrl-V по всему коду
одно и то же 100500 раз подряд. Почему один раз в переменную не сохранить, а потом её везде
не подставить. Это какой-то треш.

И наконец зачем 100500 вариантов руками расписывать для каждого типа, если там реализация
отличается только типом. Int16DataFrameColumn.cs, Int32DataFrameColumn.cs -- это ж обезьяна
какая-то писала. Ну вот я бы шаблон какой-то бы придумал, чтоб функций само нагенерило,
а не через Ctrl-C/Ctrl-V (потому, что потом если где-то ошибка например, то её теперь
по всем 100500 файлам выискивать и править? а если интерфейс поменять -- проще повеситься).
Я в C# вообще не силён, но по аналогии с C++... А в голом C бы руками сделал какую-то
обобщённую функцию, которая с почти любым типом умеет работать (ну может ей бы ширина
типа передавалась, например).
Re[3]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 19.10.21 00:13
Оценка:
Здравствуйте, fk0, Вы писали:

fk0>Int16DataFrameColumn.cs, Int32DataFrameColumn.cs -- это ж обезьяна

fk0>какая-то писала. Ну вот я бы шаблон какой-то бы придумал, чтоб функций само нагенерило,
fk0>а не через Ctrl-C/Ctrl-V (потому, что потом если где-то ошибка например, то её теперь
fk0>по всем 100500 файлам выискивать и править? а если интерфейс поменять -- проще повеситься).

Скорее всего, одного генерика там бы за глаза хватило. Но это уже высший пилотаж.
Ад пуст, все бесы здесь.
Re[3]: самые элитные сортировщики гномов
От: sergii.p  
Дата: 19.10.21 10:35
Оценка:
Здравствуйте, fk0, Вы писали:

fk0> А если будет 10000 разных типов?


вот всегда оверинженеры задаются вопросом "а если будет ... ?". Сам страдаю от этого Встретил простенькую задачку, решил её сносно и пошёл дальше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.