Re[12]: Начать ли использовать Code Contracts?
От: Doc Россия http://andrey.moveax.ru
Дата: 14.08.15 04:23
Оценка:
Здравствуйте, 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).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.