Re[6]: Где проверять контракты методов?
От: _FRED_ Черногория
Дата: 13.07.09 08:09
Оценка:
Здравствуйте, andy1618, Вы писали:

_FR>>Суть проста: если вам понятен подход "проверка контрактов только в открытых методах", то должен быть понятен и подход "проверка во всех методах, не смотря на область видимости".


A>Согласен, второй подход безусловно правилен и работоспособен, но код приватных методов может оказаться сильно загромождён проверками, и в итоге может оказаться, что "за деревьями не видно леса".


Загромождённости нет, так как проверки проводятся в начале метода и легко на глаз отличимы от тела. Писать проверки — да, приходится. Меня выручают любимые сниппеты.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Где проверять контракты методов?
От: andy1618 Россия  
Дата: 13.07.09 08:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>(не знаю знакомы ли вы с библиотекой Code Contracts, но все же хотелось бы на ее примере если не сложно)

А>правильно ли я понимаю, что нужно делать так:

А>
А>public void Do(int arg1, string arg2)
А>{
А>    Contract.Requires(arg1 >= 0);
А>    Contract.Requires<ArgumentNullException>(arg2 != null, "arg2");    

А>    double arg3 = ...; // а как быть здесь? кто проверяет arg3 ?    
А>    _Do(arg1, arg2, arg3);
А>}
А>


К сожалению, пока с Code Contracts не разбирался, но по виду вполне правильно всё написано.
А по поводу arg3 — перед вызовом _Do должна быть уверенность, что arg3 корректен и, соответственно, можно на него Assert поставить. Если же уверенности нет — надо сделать, чтобы она была (if-then-throw и т.п.).
Re[4]: Где проверять контракты методов?
От: Пельмешко Россия blog
Дата: 13.07.09 08:45
Оценка:
Здравствуйте, andy1618, Вы писали:

A>А по поводу arg3 — перед вызовом _Do должна быть уверенность, что arg3 корректен и, соответственно, можно на него Assert поставить. Если же уверенности нет — надо сделать, чтобы она была (if-then-throw и т.п.).


Я не понимаю, почему надо ассертом проверять параметр перед вызовом метода , если свои параметры должен проверять сам метод — предусловиями (которые по сути те же ассерты).
Contact.Assert нужен только для утверждений по телу метода (в отличие от других контрактных методов он может располагаться где угодно в методе и в любом порядке), не надо им делать работу Requires.
Re[5]: Где проверять контракты методов?
От: Аноним  
Дата: 13.07.09 08:55
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Я не понимаю, почему надо ассертом проверять параметр перед вызовом метода , если свои параметры должен проверять сам метод — предусловиями (которые по сути те же ассерты).

П>Contact.Assert нужен только для утверждений по телу метода (в отличие от других контрактных методов он может располагаться где угодно в методе и в любом порядке), не надо им делать работу Requires.

как я понял из первого ответа, данный вариант преложен исходя из того, что private методы вызывают с данными только из доверенных источников, следовательно Require там нет смысла ставить. а ассерты нужны в момент отладки, для проверки логики.
Re[6]: Где проверять контракты методов?
От: andy1618 Россия  
Дата: 13.07.09 09:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как я понял из первого ответа, данный вариант преложен исходя из того, что private методы вызывают с данными только из доверенных источников, следовательно Require там нет смысла ставить. а ассерты нужны в момент отладки, для проверки логики.


Причём здесь роль скорее даже не столько в проверке логики (ибо хватит и ассёрта в теле приватного метода), сколько в документировании кода: явно вписав Assert перед вызовом, автор кода сообщает будущим читателям, что вопрос корректности аргумента был "тщательно проработан"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.