Здравствуйте, Poopy Joe, Вы писали:
PJ>Речь о том, что программисту типы помогают не совершать ошибки.
Помогают. Но при этом, чем больше самого кода — тем больше вероятность ошибки.
Doc>>Ну да, чем больше классов тем проще жить? Даешь Hello World из 100500 классов Как там "wow: Здорово, чо."
PJ>Да что значит больше/меньше? Откуда вообще это взялось? Ну давай все запихаем в один класс, так нормально будет?
Причем тут запихаем все в один? Но при этом же не надо плодить сущностей сверх меры. Понятно что у каждого она своя. Однако, создавать класс на каждый чих BL (там где вполне подходят стандартные), это перебор.
Doc>>Сравнивай не с константой. Да и мне кажется что опять начинаешь мешать контракты и бизнес-логику.
PJ>Почему? Это константа и есть.
Определись, ты хочешь менять возраст или нет. )
Doc>>И как у нас конструктор вернет ошибку? Или мы еще и factory с возвратом ошибок замутим?
PJ>Ну в примере выкинет исключение, но там это скорее перестраховка
Угу. Т.е. exception из контракта это ой ужас, а из конструктора — это прям прелесть
> а в обычном случае можно использовать статический метод и вернуть тип Either<Adult<Age>, Error>.
Т.е. как я сказал вместо 1 строки с float(или int), в месте которое хорошо покрывается тестами, ты делаешь уже Age, Adult<Age>, фабричный метод в статик классе, ну и общие Either и Error. Добавь тесты на все это добро.
Но главное, ты опять путаешь BL и контракты. Давай на примере покажу
Допустим у нас есть закрытая область (раз уж взяли это Age). Посмотрим на 2 метода
1) Login(User user). Тут просто обычная проверка user.Age и возврат кода. У этого метода не может быть в контракте 18 < user.Age, т.к. попытаться залогиниться у нас может любой юзер. Если что — вернем Error, HttpStatusCode.Forbidden или что еще там надо
2) GetShopContent(..., User user). А вот тут уже контракт что user обязан быть старше 18. И если сюда как-то попал младше, то как я сказал явно проблема в реализации BL. Поэтому кидаем исключение и ловим его на самом верху, программу закрываем, т.к. дальше уже работать нет по сути смысла.
PJ>С точки зрения перехватывающего метода — с случайном. Можно конечно на каждую операцию писать try/catch, но кто это будет читать потом?
Как я уже сказал, ловим такое на самом верху, сохраняем/отправляем что надо для дебага, завершаем работу.
Doc>>Далее, в метод, где не может быть возраст меньше заданного пролез такой возраст.
PJ>Что значит "пролез"? Как он туда может пролезть?
Вот именно. См чуть выше пункт (2).