самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 00:30
Оценка: -1
Всякое я раньше видел, но это как-то особенно пробрало.
https://github.com/dotnet/machinelearning/blob/main//src/Microsoft.Data.Analysis/DataFrame.IO.cs#L123
Ад пуст, все бесы здесь.
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: самые элитные сортировщики гномов
От: 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: самые элитные сортировщики гномов
От: 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[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[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:05
Оценка: +1 -1 :)
Здравствуйте, Codealot, Вы писали:

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


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

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

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

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

Тогда уже через TypeCode
Re[2]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 13:54
Оценка:
Здравствуйте, sergii.p, Вы писали:

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


Предлагаю помнить про DRY и не копипастить GetColumnName(columnNames, columnIndex) в каждую строку. Да и вообще идея тащить в метод весь массив имен, где он нафиг не нужен — она очень странная, мягко говоря.
Странно, что такие азы надо объяснять.
Ад пуст, все бесы здесь.
Re[4]: самые элитные сортировщики гномов
От: Codealot Земля  
Дата: 12.10.21 13:56
Оценка: -1
Здравствуйте, Teolog, Вы писали:

T>если 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>Я не понял... тебя "пробрало", но при этом ты тупо фэйспалмишь, ничего не объясняя.


Если ты с первого взгляда не заметил там тупейшую копи-пасту, то у меня для тебя очень плохие новости.
Ад пуст, все бесы здесь.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.