Нужно придерживаться простого правила. Никакие значения не должны протекать в код. Если встречаете в коде
if (value.getName().equals("someSpecialValue")) {
doSomeSpecificFeature();
}
или
if (value == MyEnum.SOME_SPECIAL_VALUE) {
doSomeSpecificFeature();
}
то это ошибка. Так делать нельзя ни с енумами, ни без енумов. Вместо этого код должен выглядеть так:
if (value.needSomeSpecificFeature()) {
doSomeSpecificFeature();
}
Связь needFeature -> doFeature никогда не изменится, поэтому данный код никогда не сломается. А признак needFeature в классе MyClass может быть присвоен любому экземпляру этого класса. Логика этой привязки может отличаться, но она должна быть инкапсулирована в коде MyClass или его фабрике. Это может быть что угодно, поле базы данных, настройка в файле, запрос внешнего источника или хардкодинг. Конкретная реализация не имеет значения, так как на остальной код она не влияет никак.
Покрытие тестами обеспечивается элементарно. Нужно протестировать каждую фичу, а не каждое возможное значение исходной строки stringValue.
Я, когда вычищал код одной большой энтерпрайз-системы, написал простой скрипт, который брал список значений из базы данных и искал в коде. Нашел за пределами тестов или белого списка классов — ревьюеру по шапке. Сейчас думаю, что можно было вообще серверный хук написать, не дающий такое пушить на сервер.
dd/mm/yyyy это конечно лучше, чем mm/dd/yyyy, но нормальный формат даты для меня dd.mm.yyyy или yyyy-mm-dd. Потому что при наличии слэшей, я не могу точно определить, где 2-е марта, а где 3-е февраля.
Именно так. Микросервис с енумом находится посередине между источником и потребителем. Ему самому это енум вообще ни для чего не нужен. Он берет данные из источника, обогащает их чем-то своим и возвращает потребителю. В результате любое изменение любого енума порождает каскадные доработки и обновления по всей инфраструктуре.
Optional<MyClass> value = MyClass.getInstanceByName(stringValue);
или
MyClass value = MyClass.getInstanceByName(stringValue);
Чего тут писать-то? Напишите тест, что на случайных значениях stringValue вы получаете допустимое значение value. В первом случае, это пустой Optional, во 2-м не null.
Разница только в том, что при использовании enum, вы вызвали стандартный метод valueOf, или за вас это сделал какой-нибудь jackson, а без него вам нужно чуточку подумать, о том как обрабатывать "некорректные" значения, и написать свой метод и тест к нему.
Вы путаете язык интерфейса и язык веб-страниц. В предпочитаемых языках веб-страниц можно выбрать English South Africa, New Zealand и United Kingdom. А в языке интерфейса можно выбрать только English, без вариантов. При этом формат даты почему-то определяется именно языком интерфейса, а не языком сайта.
Один человек как-то раз снял деньги в банкомате в Белоруссии. После этого он не мог войти в интернет-банк, потому что там на главной странице показываются последние операции, а сервер, готовящий данные для главной страницы, содержит енум USD, EUR, RUB, GBP.
Поддержка неделю думала, чем ему помочь, а потом предложила ему снять в банкомате российские рубли 10 раз. Тогда операция с белорусскими рублями не попадет в список последних операций, и главная страница интернет-банка наконец-то отрисуется.
Енумы очень сильно дискредитированы сериализаторами. Приходит какой-нибудь json с массивом из 100 нормальных объектов, но вот 101-й объект содержит какой-нибудь новый код из енума. Этот json получит десериализатор, распарсит 100 объектов, а на 101-м выкинет ParseException, потому что ему в поле типа енум надо положить значение, которого он не знает. В итоге до приклада данные вообще не дойдут. И нельзя будет данную ситуацию ни залогировать нормально, ни обработать.
Вы правильные вопросы задаете. У меня на одном из ноутбуков скайп вообще не запускается без опции /legacylogin. Т. е. какое-то легаси в новом окружении еще как-то работает, а новый код вообще неработоспособен.
Ненавижу input[type=date]. Из-за него мне приходится в браузере включать интерфейс на русском языке. А если я включаю английский язык, то даты в этом инпуте имеют идиотический формат mm/dd/yyyy. И вроде как поменять это ни в одном хромобраузере нельзя, так как это захардкожено где-то очень глубоко в общем ядре.
Конечно. Вы видели сколько плюсов собрал пост про сборку 1-го перла? А если его через PVS-studio проанализировать, то можно очень конкретно свой профиль прокачать.
Я всегда называл их трехдюймовыми, и мои собеседники всегда понимали, что именно я имею в виду. По-русски не очень принято использовать слова типа «трех-с-половиной-дюймовые». Вот если бы в ходу были одновременно оба формата 3’’ и 3.5’’, тогда пришлось бы их как-то дифференцировать.
К сожалению, есть ненулевая вероятность, что вашу репу просто снесут через месяц-другой после очередного обновления пользовательского соглашения, как не представляющую коммерческой ценности.
Нужно придерживаться простого правила. Никакие значения не должны протекать в код. Если встречаете в коде
или
то это ошибка. Так делать нельзя ни с енумами, ни без енумов. Вместо этого код должен выглядеть так:
Связь needFeature -> doFeature никогда не изменится, поэтому данный код никогда не сломается. А признак needFeature в классе MyClass может быть присвоен любому экземпляру этого класса. Логика этой привязки может отличаться, но она должна быть инкапсулирована в коде MyClass или его фабрике. Это может быть что угодно, поле базы данных, настройка в файле, запрос внешнего источника или хардкодинг. Конкретная реализация не имеет значения, так как на остальной код она не влияет никак.
Покрытие тестами обеспечивается элементарно. Нужно протестировать каждую фичу, а не каждое возможное значение исходной строки stringValue.
Я, когда вычищал код одной большой энтерпрайз-системы, написал простой скрипт, который брал список значений из базы данных и искал в коде. Нашел за пределами тестов или белого списка классов — ревьюеру по шапке. Сейчас думаю, что можно было вообще серверный хук написать, не дающий такое пушить на сервер.
А вот и пресс-релиз https://tass.ru/ekonomika/7169373. Теперь нужно проехаться на Сапсане и проверить пароли и порты.
dd/mm/yyyy это конечно лучше, чем mm/dd/yyyy, но нормальный формат даты для меня dd.mm.yyyy или yyyy-mm-dd. Потому что при наличии слэшей, я не могу точно определить, где 2-е марта, а где 3-е февраля.
Именно так. Микросервис с енумом находится посередине между источником и потребителем. Ему самому это енум вообще ни для чего не нужен. Он берет данные из источника, обогащает их чем-то своим и возвращает потребителю. В результате любое изменение любого енума порождает каскадные доработки и обновления по всей инфраструктуре.
Код с енумом
Код без енума
или
Чего тут писать-то? Напишите тест, что на случайных значениях stringValue вы получаете допустимое значение value. В первом случае, это пустой Optional, во 2-м не null.
Разница только в том, что при использовании enum, вы вызвали стандартный метод valueOf, или за вас это сделал какой-нибудь jackson, а без него вам нужно чуточку подумать, о том как обрабатывать "некорректные" значения, и написать свой метод и тест к нему.
Вы путаете язык интерфейса и язык веб-страниц. В предпочитаемых языках веб-страниц можно выбрать English South Africa, New Zealand и United Kingdom. А в языке интерфейса можно выбрать только English, без вариантов. При этом формат даты почему-то определяется именно языком интерфейса, а не языком сайта.
В чем проблема сделать код, работающий с любыми значениями? Никаких мерцающих багов быть просто не должно.
Один человек как-то раз снял деньги в банкомате в Белоруссии. После этого он не мог войти в интернет-банк, потому что там на главной странице показываются последние операции, а сервер, готовящий данные для главной страницы, содержит енум USD, EUR, RUB, GBP.
Поддержка неделю думала, чем ему помочь, а потом предложила ему снять в банкомате российские рубли 10 раз. Тогда операция с белорусскими рублями не попадет в список последних операций, и главная страница интернет-банка наконец-то отрисуется.
Енумы очень сильно дискредитированы сериализаторами. Приходит какой-нибудь json с массивом из 100 нормальных объектов, но вот 101-й объект содержит какой-нибудь новый код из енума. Этот json получит десериализатор, распарсит 100 объектов, а на 101-м выкинет ParseException, потому что ему в поле типа енум надо положить значение, которого он не знает. В итоге до приклада данные вообще не дойдут. И нельзя будет данную ситуацию ни залогировать нормально, ни обработать.
Вы правильные вопросы задаете. У меня на одном из ноутбуков скайп вообще не запускается без опции /legacylogin. Т. е. какое-то легаси в новом окружении еще как-то работает, а новый код вообще неработоспособен.
Ненавижу input[type=date]. Из-за него мне приходится в браузере включать интерфейс на русском языке. А если я включаю английский язык, то даты в этом инпуте имеют идиотический формат mm/dd/yyyy. И вроде как поменять это ни в одном хромобраузере нельзя, так как это захардкожено где-то очень глубоко в общем ядре.
Дальше можно не читать. Исследование основано на устаревших данных. Многие уже ушли далеко вперед.
Наконец-то комментарий по делу.
Давайте через некоторое время вернемся и сравним наши прогнозы с реальностью. Мой прогноз следующий:
Конечно. Вы видели сколько плюсов собрал пост про сборку 1-го перла? А если его через PVS-studio проанализировать, то можно очень конкретно свой профиль прокачать.
Сначала надо расшифровать те координаты, которые в виде гигантских сооружений оставили для нас представители предыдущих культур.
Я всегда называл их трехдюймовыми, и мои собеседники всегда понимали, что именно я имею в виду. По-русски не очень принято использовать слова типа «трех-с-половиной-дюймовые». Вот если бы в ходу были одновременно оба формата 3’’ и 3.5’’, тогда пришлось бы их как-то дифференцировать.
А мне пока и не надо. Я на дискете написал, что если что, то дисковод есть у viceroyalty на даче. Пусть потомки сами разбираются.
У нас метрическая система. Я вообще не врубаюсь, что такое 3.5'' дюйма. ©
К сожалению, есть ненулевая вероятность, что вашу репу просто снесут через месяц-другой после очередного обновления пользовательского соглашения, как не представляющую коммерческой ценности.