Re[9]: Начать ли использовать Code Contracts?
От: Poopy Joe Бельгия  
Дата: 13.08.15 12:25
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, Poopy Joe, Вы писали:


PJ>>Надо! Или нет гарантии, что радианы не будут складываться с градусами, а размер головы с размером ноги.

Doc>Вот как раз в вашем варианте это и надо. Например: HumanHeight = HeadHeigh + BodyHeight + LegHeight
Doc>В варианте с контрактами это будут три поля int или float и просто будет сумма. А гарантии будут в тестах.
Т.е. вместо проверки валидности типа на этапе компиляции ты предлагаешь выполнять проверку в рантайме и наедятся на полноту и корректность тестов? Здорово, чо.

Doc>Да, эти тесы и у вас будут, но к ним еще бонусом тесты приведения типов для сложения.

И что в варианте с контрактами мне помешает прибавить туда же и FootSize вместе/вместо LegHeight?

PJ>>Что значит приведение? Другая величина это другая величина.

Doc>А как еще сложить HeadHeigh и BodyHeight?
Да так же как и складывают матрицы. Никому, в здравом уме, в голову не придется из-за перегрузки оператора держать их в float[]. Что в этом особенного?

Doc>*) у вас класс Adult должен знать о Age, уметь извлекать из него значения. Лишний класс, лишние тесты, да еще и с жесткой связью.

Что значит лишний класс? У нас есть какие-то ограничения по количеству классов?

Doc>*) Если у вас будут методы для "до 16", "до 18" и для всех. Будете еще классы создавать на каждый чих?

Эээ... зачем?

PJ>>А чем тут помогут контракты?

Doc>Contract.Requires(18 < age);
Прелестно. А потом потребуется изменить возраст в зависимости от страны...

PJ>>Выкинут исключения во времени исполнения? Очень "полезно".

Doc>А что сделает Adult<Age> если Age будет больше 18?
Вернет ошибку в момент создания, разумеется.

Doc>Кстати, исключение тут вполне уместно, т.к. скорее всего это означает что у вас как-то или малолетка "пролез" через авторизацию, или где-то ошибка в логике загрузки юзеров. Ведь для метода, например, логина такой контракт не уместен (получится что вы хотите BL в контракты зашить)

Исключения вообще не слишком уместны, так как прерывают логику в случайном месте, но это отдельный разговор. В данном случае с типами ошибка обнаружится гораздо раньше. "Загрузку юзеров" просто нельзя будет сломать, так как она может вернуть только правильный тип.
Строго говоря, контракты они не для обнаружения ошибок авторизации, а для контроля программиста. Ситуация когда нарушается Contract.Requires(18 < age) никогда не должна случится. Ради этого там и колхозят статический анализатор кода. В нем весь смысл. Непонятно только зачем нужны костыли, когда компилятор уже имеет тот же самый анализатор только на уровне типов. И гораздо лучше работающий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.