Comments 36
Я полностью удалила ограничения, так как мы решили добавить их позже, используя отдельные методы.
Я также использовала константы для статуса активности скидки.
А Олег то не так прост, как кажется (:
Теперь сравните это с первоначальным вызовом. Вы увидите, насколько удобнее стало читать.
Читать-то стало удобнее, но вместо одного (возможно, атомарного) вызова функции теперь нужно делать два. И при всем при этом из сигнатур функций по-прежнему не очевидно, в каких случаях надо отдельно задавать констрейнты, в каких — достаточно обойтись тем, что задается по умолчанию. Плюс если кто-то где-то забудет задать констрейнт после задания скидки, то найти багу будет непросто.
/**
* Это была функция из самодокументированного кода переданного нам очень давно.
* PS. HACK: Не трогать!!!!!!!!!!! Кривой код.
* @param {any} a - Тип скидки
* @param {any} b - Тип клиента, IClient.CORP | IClient.INDIVIDUAL
* @param {any} c - Фаза луны
* @param {any} d - Непонятно что, но НУЖНО ставить null
* @param {any} e - тип валюты, блин этот чувак точно был больной
*/
function SelfDocumentedFunction(a,b,c,d,e) {
....
}
Каждый божий раз, когда вижу "ироничные коменты" в коммите, вместо банального рефакторинга сигнатуры или заведённой таски на проблему, думаю какая всё-таки инфантильная индустрия. Всякое бывает, но здесь например явная опасная проблема и комент пригодится уже только после того как жахнет и пойдет разбор почему жахнуло.
Полностью согласен. Хочу добавить, что нужно приложить немало усилий, чтобы настроить себя "это проблема, и я не пойду дальше, пока не решу её". И малейшее давление ("ну когда будет готово?") может этот настрой прибить.
Помню, спорил много лет назад, «опытные» (TM) программисты говорили, что язык должен позволять все, а я профессионал такого высокого класса, а С++ (например) — язык для профессионалов, что мне можно доверять. Ошибки делают все, и каждый день, если конечно что-то делают, и лучше какие-то наши ошибки пофиксит компилятор, а язык будет от них максимально оберегать, чем ситуации, описанные в статье
Тут уже дело некоторого «риска» в угоду максимальной мощности и управляемости.
Пустой объект (строка длиной 0, массив без элементов) != null
Все, что вы описали (пустые массивы, 0 и т.д.), есть везде и эти значения можно использовать вместо null. По сути дела это null-объекты, у которых ограниченная сфера применения. Только иногда нужно сообщить, что массив неинициализирован совсем, а не то, что он пустой.
JavaScript (и Python) «подобрали» эту идею с несколькими встроенными символами, но до того, чтобы дать возможность разработчику их создавать… «недоросли»…
null это просто абстракция. Invalid pointer. Даже на С можно писать без использования null. Просто его придумали во времена, когда одного invalid pointer a хватало всем ;)
Проблема не в null, а в том, что мы не видим имен аргументов. В последнем варианте можно так же спросить про строки, не видно же что каждая значит. Нагляднее (и более гибким) был бы такой вариант:
insertDiscount(new Discount()
.setName('Discount name')
.setDescription('Discount description')
.setAmount(100, 'CAD')
.setActive()
)
m.habr.com/ru/post/469323
psalm, phpstan, phan… inspect в шторме наконец.
Но нет, люди продолжают придумывать себе проблемы) на что только не пойдёшь лишь бы не работать
Assert::that($amountInCents)->greaterThan(0);
Странно, что это называется assert. Это же precondition. Либо библиотека писалась для ассертов, но используется для прекондишнов. Технически разница может невелика, но семантика у ассерта и прекондишна разная.
www.php.net/manual/ru/function.assert.php
«Нулевой» ад и как из него выбраться