Здравствуйте, andy1618, Вы писали:
_FR>>Суть проста: если вам понятен подход "проверка контрактов только в открытых методах", то должен быть понятен и подход "проверка во всех методах, не смотря на область видимости".
A>Согласен, второй подход безусловно правилен и работоспособен, но код приватных методов может оказаться сильно загромождён проверками, и в итоге может оказаться, что "за деревьями не видно леса".
Загромождённости нет, так как проверки проводятся в начале метода и легко на глаз отличимы от тела. Писать проверки — да, приходится. Меня выручают любимые сниппеты.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Аноним, Вы писали:
А>(не знаю знакомы ли вы с библиотекой 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 и т.п.).
Здравствуйте, andy1618, Вы писали:
A>А по поводу arg3 — перед вызовом _Do должна быть уверенность, что arg3 корректен и, соответственно, можно на него Assert поставить. Если же уверенности нет — надо сделать, чтобы она была (if-then-throw и т.п.).
Я не понимаю, почему надо ассертом проверять параметр перед вызовом метода , если свои параметры должен проверять сам метод — предусловиями (которые по сути те же ассерты).
Contact.Assert нужен только для утверждений по телу метода (в отличие от других контрактных методов он может располагаться где угодно в методе и в любом порядке), не надо им делать работу Requires.
Re[5]: Где проверять контракты методов?
От:
Аноним
Дата:
13.07.09 08:55
Оценка:
Здравствуйте, Пельмешко, Вы писали:
П>Я не понимаю, почему надо ассертом проверять параметр перед вызовом метода , если свои параметры должен проверять сам метод — предусловиями (которые по сути те же ассерты). П>Contact.Assert нужен только для утверждений по телу метода (в отличие от других контрактных методов он может располагаться где угодно в методе и в любом порядке), не надо им делать работу Requires.
как я понял из первого ответа, данный вариант преложен исходя из того, что private методы вызывают с данными только из доверенных источников, следовательно Require там нет смысла ставить. а ассерты нужны в момент отладки, для проверки логики.
Здравствуйте, Аноним, Вы писали:
А>как я понял из первого ответа, данный вариант преложен исходя из того, что private методы вызывают с данными только из доверенных источников, следовательно Require там нет смысла ставить. а ассерты нужны в момент отладки, для проверки логики.
Причём здесь роль скорее даже не столько в проверке логики (ибо хватит и ассёрта в теле приватного метода), сколько в документировании кода: явно вписав Assert перед вызовом, автор кода сообщает будущим читателям, что вопрос корректности аргумента был "тщательно проработан"