All streams
Search
Write a publication
Pull to refresh
14
0
Сергей Б. @sergey-b

Пользователь

Send message

Нужно придерживаться простого правила. Никакие значения не должны протекать в код. Если встречаете в коде


if (value.getName().equals("someSpecialValue")) {
    doSomeSpecificFeature();
}

или


if (value == MyEnum.SOME_SPECIAL_VALUE) {
    doSomeSpecificFeature();
}

то это ошибка. Так делать нельзя ни с енумами, ни без енумов. Вместо этого код должен выглядеть так:


if (value.needSomeSpecificFeature()) {
    doSomeSpecificFeature();
}

Связь 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-е февраля.

Именно так. Микросервис с енумом находится посередине между источником и потребителем. Ему самому это енум вообще ни для чего не нужен. Он берет данные из источника, обогащает их чем-то своим и возвращает потребителю. В результате любое изменение любого енума порождает каскадные доработки и обновления по всей инфраструктуре.

Код с енумом


MyEnum value = MyEnum.valueOf(stringValue);

Код без енума


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. На Сапсане сменят пароли на всех сервисах и закроют все служебные порты от доступа через пассажирский вайфай.
  2. Автору спасибо не скажут, но и наркотики в ноутбук подбрасывать не будут.
  3. Возможно, выпустят пресс-релиз, где скажут, что ничего чувствительного не утекло, и никакой угрозы безопасности не возникало.

Конечно. Вы видели сколько плюсов собрал пост про сборку 1-го перла? А если его через PVS-studio проанализировать, то можно очень конкретно свой профиль прокачать.

Сначала надо расшифровать те координаты, которые в виде гигантских сооружений оставили для нас представители предыдущих культур.

Я всегда называл их трехдюймовыми, и мои собеседники всегда понимали, что именно я имею в виду. По-русски не очень принято использовать слова типа «трех-с-половиной-дюймовые». Вот если бы в ходу были одновременно оба формата 3’’ и 3.5’’, тогда пришлось бы их как-то дифференцировать.

А мне пока и не надо. Я на дискете написал, что если что, то дисковод есть у viceroyalty на даче. Пусть потомки сами разбираются.

У нас метрическая система. Я вообще не врубаюсь, что такое 3.5'' дюйма. ©

К сожалению, есть ненулевая вероятность, что вашу репу просто снесут через месяц-другой после очередного обновления пользовательского соглашения, как не представляющую коммерческой ценности.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Registered
Activity