Несомненно, хотя я и не утверждал обратного. В то же время, это не помешало этому закону стать "количественной основой современной химии" (тот же источник, чуть выше вашей цитаты).
Странно. Я сам работал в основном с выгрузками чего-то по типу Zeppelin, там вроде были вообще tsv, поэтому с такими файлами не сталкивался. Однако, в ченджлоге есть:
Tad 0.8.5 - June 28, 2017
New Features
European CSV support - support for ; instead of , as field separator.
А я думал что в csv можно просто двойными кавычками заэкранировать, и тогда вроде как без разницы, какой там разделитель и тд. Однако, чаще смотрю csv в специализированных утилитах типа Tad, Excel и правда черезчур самостоятельный.
Есть же примеры получше. Например, надо писать логи, для этого есть какой-то ConsoleLogger, мы его у себя используем - т е зависим от него. Применяя этот принцип, выделяем интерфейс ILogger, и теперь мы не зависим от конкретного логгера, а наоборот - логгер зависит от нас (при условии что интерфейс определен например в том же модуле что и потребитель, а конкретный логгер - в другом модуле).
Спасибо, интересная статья. А почему мы не можем абстрагировать сам рендерер (IVulkanRenderer, IDxRenderer, IOpenGlRenderer), и сделать то же самое с сериализацией? К тому же, composition over inheritance это один из базовых принципов, поэтому примеры выглядят с этой позиции немного надуманно - никто не будет так делать, как вы и сказали.
На самом деле я понимаю откуда берутся такие тесты - заводится баг, выясняется что какая-то регистрация отсутствует, баг фиксится, на него пишутся тесты чтобы такого впредь не повторялось. Это хорошая практика.
Однако тут имеет смысл сравнить, как часто запускается приложение в сравнении с тем, как часто запускаются тесты. Например, у нас тесты запускаются на каждый коммит, в то время как в обычном сценарии использования приложение запускается через автозапуск и висит до выключения машины - тут уже можно поспорить, что дороже :) К тому же, валидацию можно включать только в дебажных сборках, чтобы девелоперы сразу на своих машинах и правили эти проблемы.
Конечно, есть corner-case'ы, такие как например request handler'ы Mediatr'а в совокупности с плагинной системой, которые не всегда проявляются - например, в 1% случаев, когда отправляешь запрос, его хэндлер ещё не успел зарегистрироваться в контейнере - но они должны решаться системно. В остальном я не совсем понимаю, как можно например сделать фичу, пройти через qa, а потом выяснить, что регистрацию забыл.
Должен добавить что у нас MS DI + SimpleInjector, у которого есть своя валидация, так что your experience may vary :)
Спасибо за статью, но если делаете туториал, то лучше давать сразу best practices. Например:
Конечно первый вид опечатки можно исправить дополнительной операцией приведения к нижнему регистру обеих строк перед сравнением.
А можно использовать string.Compare(str1, str2, StringComparison.OrdinalIgnoreCase).
Для проверки того, определено ли значение enum - лучше использовать Enum.IsDefined. Если нужно огласить весь список - Enum.GetValues. Также ничего не сказано про флаги, и про приколы с боксингом для методов Enum, и почему оно вообще так было сделано. Также очень интересно, что enum не реализует IEquatable / IComparable, что ограничивает его применимость в дженериках (см например https://github.com/dotnet/runtime/issues/17456).
Вот насчёт А и Б я бы не сказал что справилась, всегда на трубе оставалась сидеть буква "и".
Несомненно, хотя я и не утверждал обратного. В то же время, это не помешало этому закону стать "количественной основой современной химии" (тот же источник, чуть выше вашей цитаты).
А-а-а-а-а-а-авогадро :)
https://blog.getpaint.net/2007/12/04/freeware-authors-beware-of-“backspaceware”/
Какие то исходники можно найти здесь - https://github.com/rivy/OpenPDN
Странно. Я сам работал в основном с выгрузками чего-то по типу Zeppelin, там вроде были вообще tsv, поэтому с такими файлами не сталкивался. Однако, в ченджлоге есть:
Tad 0.8.5 - June 28, 2017
New Features
European CSV support - support for
;
instead of,
as field separator.Похоже на то, да
Отличная вещь. Рекомендую - https://www.tadviewer.com/
Там кажется даже SQL подобные запросы можно писать.
Согласен, я скорее к тому, что не совсем понятно, что мешает экселю просто взять в кавычки значение с запятой.
А я думал что в csv можно просто двойными кавычками заэкранировать, и тогда вроде как без разницы, какой там разделитель и тд. Однако, чаще смотрю csv в специализированных утилитах типа Tad, Excel и правда черезчур самостоятельный.
Наверное можно пропустить первый шаг, если складывать измененные файлы в stash, вместо копирования в отдельную папочку
В лоб можно было сделать конечный автомат с каким то состоянием. Заодно и графы там органично смотрятся.
Есть в принципе варианты:
Включать feature только когда соответствующий feature toggle включен
Закрыть feature feature toggle'ом
Зафичатоглить
Ни в коем случае не оправдываю, но когда есть опыт с фича тогглами, вроде интуитивно понятно, о чем речь.
Есть же примеры получше. Например, надо писать логи, для этого есть какой-то ConsoleLogger, мы его у себя используем - т е зависим от него. Применяя этот принцип, выделяем интерфейс ILogger, и теперь мы не зависим от конкретного логгера, а наоборот - логгер зависит от нас (при условии что интерфейс определен например в том же модуле что и потребитель, а конкретный логгер - в другом модуле).
Спасибо, интересная статья. А почему мы не можем абстрагировать сам рендерер (IVulkanRenderer, IDxRenderer, IOpenGlRenderer), и сделать то же самое с сериализацией? К тому же, composition over inheritance это один из базовых принципов, поэтому примеры выглядят с этой позиции немного надуманно - никто не будет так делать, как вы и сказали.
Где можно об этом почитать? Используем у себя gRPC под Windows на C#, не замечал таких проблем
На самом деле я понимаю откуда берутся такие тесты - заводится баг, выясняется что какая-то регистрация отсутствует, баг фиксится, на него пишутся тесты чтобы такого впредь не повторялось. Это хорошая практика.
Однако тут имеет смысл сравнить, как часто запускается приложение в сравнении с тем, как часто запускаются тесты. Например, у нас тесты запускаются на каждый коммит, в то время как в обычном сценарии использования приложение запускается через автозапуск и висит до выключения машины - тут уже можно поспорить, что дороже :) К тому же, валидацию можно включать только в дебажных сборках, чтобы девелоперы сразу на своих машинах и правили эти проблемы.
Конечно, есть corner-case'ы, такие как например request handler'ы Mediatr'а в совокупности с плагинной системой, которые не всегда проявляются - например, в 1% случаев, когда отправляешь запрос, его хэндлер ещё не успел зарегистрироваться в контейнере - но они должны решаться системно. В остальном я не совсем понимаю, как можно например сделать фичу, пройти через qa, а потом выяснить, что регистрацию забыл.
Должен добавить что у нас MS DI + SimpleInjector, у которого есть своя валидация, так что your experience may vary :)
Это был намёк :) Просто мы у себя валидируем, интересно в чем преимущество такого юнит-теста, может нам тоже надо так делать
Интересный подход. Если б только был способ провалидировать зависимости при сборке контейнера.
Спасибо за статью, но если делаете туториал, то лучше давать сразу best practices. Например:
А можно использовать string.Compare(str1, str2, StringComparison.OrdinalIgnoreCase).
Для проверки того, определено ли значение enum - лучше использовать Enum.IsDefined. Если нужно огласить весь список - Enum.GetValues. Также ничего не сказано про флаги, и про приколы с боксингом для методов Enum, и почему оно вообще так было сделано. Также очень интересно, что enum не реализует IEquatable / IComparable, что ограничивает его применимость в дженериках (см например https://github.com/dotnet/runtime/issues/17456).
А JSON то как постить?