Как совместить методы защитного программирования вместе?

Вопрос, который я хочу вам задать, довольно широкий, но в то же время очень конкретный. Во-первых, я должен сказать, что меня в основном интересуют ответы, применимые в среде .net.

Ну, я хочу повысить уровень кода, который я создаю. Теперь я в основном использую TDD и статический анализ кода, чтобы убедиться, что мой код правильный. Недавно я слушал выступление Дино Эспозито о кодовых контрактах и ​​теперь хочу использовать его в сочетании с другими техниками. Слушая Дино, я также вспомнил Debug.Assert() и Trace.Assert().

Для конкретики задам несколько вопросов:

  • Как мне написать контракты и модульные тесты, чтобы они дополняли друг друга?
  • Должен ли я использовать кодовые контракты в каждом методе или только в общедоступных методах?
  • Должен ли я предотвратить использование Debug.Assert()? Когда их можно использовать? (Например, обратите внимание, что инварианты в .net проверяются только при выходе из общедоступного метода/свойства. Итак, можно ли выполнять некоторые проверки в середине метода простым Assert()?)
  • Не могли бы вы порекомендовать мне проект с открытым исходным кодом, где все эти методы используются должным образом, потому что картинка рисует тысячу слов?

person Igor Soloydenko    schedule 04.09.2011    source источник
comment
Моя проблема с Debug.Assert заключается в том, что он никогда не доходит до производства. Вы найдете ошибки только в вашей среде разработки/тестирования. Если такая ошибка, которую будет ловить assert, достигнет дикой природы, это усложнит ваше воспроизведение. Использование его вместо утверждения, доступного для выпуска, является шагом оптимизации, а преждевременная оптимизация никогда не бывает хорошей.   -  person Merlyn Morgan-Graham    schedule 05.09.2011
comment
@Merlyn, насколько я знаю, ты можешь использовать Trace.Assert() вместо Debug.Assert(). Вот что об этом говорит MSDN: › По умолчанию метод Debug.Assert работает только в отладочных сборках. Используйте метод Trace.Assert, если вы хотите выполнять утверждения в сборках выпуска.   -  person Igor Soloydenko    schedule 05.09.2011
comment
Звучит лучше. Я бы по-прежнему рассматривал возможность создания исключения классическим способом (чтобы вы могли получать отчеты об ошибках), но, по крайней мере, вы могли бы протестировать этот путь кода во всех сборках. Изменить: перечитайте страницу MSDN, и там написано, что всплывает окно сообщения. Это звучит как хорошая программная ошибка, о которой можно сообщить (поскольку она дает трассировку стека). Всегда есть вопрос: если мы находимся в этом состоянии, можно ли доверять состоянию программы? вопрос. Но это больше ситуативно.   -  person Merlyn Morgan-Graham    schedule 05.09.2011
comment
этот пост поможет вам - stackoverflow.com/questions/2549639/ ура.   -  person Steoates    schedule 05.09.2011
comment
@Стивен Спасибо. Я посмотрю материалы в этом посте.   -  person Igor Soloydenko    schedule 05.09.2011
comment
Имейте в виду, что для полноценного использования Code Contracts вам потребуется версия VS 2010 Ultimate, а это дорого.   -  person AakashM    schedule 05.09.2011
comment
@Aakash: я думал, что Enterprise достаточно (статическая проверка). Ultimate что-то добавляет?   -  person Henk Holterman    schedule 05.09.2011
comment
@Хенк вспоминает то, что я читал на C # в глубине 2e (чего нет под рукой). Хотя я не вижу Enterprise в списке редакций здесь ?   -  person AakashM    schedule 05.09.2011
comment
@Aakash Я тоже использовал память :) Это версия Premium, см. 3 кнопки здесь: msdn.microsoft.com/en-us/devlabs/dd491992.aspx   -  person Henk Holterman    schedule 05.09.2011


Ответы (2)


Вы должны начать с изучения (довольно хорошего) руководства по контрактам.

  • в нем есть глава и пример кода об интеграции модульных тестов. Гораздо больше информации, если вы перейдете по ссылкам Pex.
  • всегда используйте контракты во всех публичных членах. Для частных пользователей: иногда.
  • вы все еще можете использовать Debug.Assert(), но Contracts.Assert() будет более логичным выбором.
  • примеры проектов... Не знаю. Но посмотрите на контракты, определенные для BCL.
person Henk Holterman    schedule 04.09.2011
comment
Я не использовал кодовые контракты, только слышал о них. Как для частных членов: иногда jive с Например, обратите внимание, что инварианты в .net проверяются только при выходе из общедоступного метода/свойства (из OP)? Будут ли эти утверждения/ограничения когда-либо подтверждены? - person Merlyn Morgan-Graham; 05.09.2011
comment
Мерлин, это правило применяется к инвариантам. Основная часть контрактов касается предварительных и постусловий (.Requires() и .Ensures()). - person Henk Holterman; 05.09.2011

Я бы полностью принял Контракты, как в предварительных блогах, так и при чтении более длинного документа в формате PDF.

Контракты предназначены не только для государственных функций. Важно то, что он предоставляет компилятору возможность рассуждать о коде. Поэтому используйте его во всех своих функциях по мере необходимости. Это дает вам максимальную пользу. Использование его только в публичных функциях похоже на то, что вы тестируете только функции верхнего уровня. Это не правильно.

Ваши тестовые примеры функций удалят любую логику, которая все еще нуждается в тестировании в функции после того, как вызовы контракта до / после и инвариантные вызовы сделают свое дело.

Четко определите 3 сценария использования, какой из них подходит для вашего кода, и его проблемы. В идеале вы можете запустить их в своем производственном коде, а затем уменьшить на основе тестирования производительности.

Убедитесь, что ваши сгенерированные документы включают ваши контракты, это приятное преимущество.

Мне также нравятся DevExpress CodeRush и Refactor! Про инструменты. У них есть специальные рефакторинги для контрактов, такие как пара кликов, чтобы превратить входные параметры в требуемые контракты и т. д. Кроме того, у них есть хороший анализ кода, который повысит качество вашего кода в целом.

Вы можете просмотреть код с контрактами здесь: https://searchcode.com/codesearch/view/14318515/

Что касается всей передовой энчилады, все в одном проекте. Ну, я смотрю на вас Microsoft. Тск.

Хенк хорошо ответил на остальные ваши вопросы.

person Dirk Bester    schedule 05.09.2011