Лучший способ утверждать предварительное условие и постусловие аргументов и значений в .NET?

StackOverflow https://stackoverflow.com/questions/155422

  •  03-07-2019
  •  | 
  •  

Вопрос

В последнее время я думал о дизайне по контракту, и мне было интересно, что, по мнению людей, является лучшим способом утверждать предварительные и постусловные значения в .NET?т. е.проверка значений аргументов для метода.

Некоторые люди рекомендуют выполнять отладку.Assert, в то время как другие говорят об использовании оператора if плюс выдача исключения.Каковы плюсы и минусы каждого из них?

Какие доступные фреймворки вы рекомендуете?

Это было полезно?

Решение

В конечном итоге мы будем использовать контракты кода, когда будет выпущен .NET 4.0.Однако прямо сейчас в нашем производственном коде мы добились большого успеха с классом "Guard" наряду с распространенным способом генерации исключений.

Для получения более подробной информации см. мой пост об этом.

Другие советы

Другим вариантом является Спецификация#.

Спецификация # является расширением объектно-ориентированного языка C #.Это расширяет систему типов, включая ненулевые типы и проверяемые исключения.Он предоставляет контракты методов в виде предварительных и постусловий, а также объектных инвариантов.

Я предпочитаю исключения утверждениям, потому что, если это должно быть так, а это не так, я хочу знать об этом, чтобы я мог это исправить, и охват, который мы получаем в режиме отладки, далек от реального использования или покрытия, поэтому просто используйте Debug.Assert делает недостаточно.

Использование asserts означает, что вы не добавите раздувания в свой код выпуска, но это означает, что вы сможете увидеть, когда и почему эти контракты нарушаются, только если поймаете их на этом в отладочной сборке.

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

Вы могли бы использовать промежуточный подход и использовать Trace для отслеживания ваших предварительных и последующих условий в каком-нибудь журнале приложений, который вы могли бы использовать для отладки проблем.Однако вам понадобится способ сбора этих журналов, чтобы узнать, с какими проблемами сталкиваются ваши пользователи.Существует также возможность объединить это с исключениями, чтобы вы получали исключения для более серьезных проблем.

Однако, на мой взгляд, если контракт стоит того, чтобы его исполняли, то при его разрыве стоит создавать исключение.Хотя я думаю, что это в какой-то степени зависит от мнения и целевого приложения.Если вы создаете исключения, вам, вероятно, нужна какая-то форма системы отчетов об инцидентах, которая предоставляет отчеты о сбоях, когда вызванные исключения остаются необработанными.

Вы могли бы ознакомиться с фреймворком fluent по адресу http://conditions.codeplex.com/ Он с открытым исходным кодом и бесплатный.

Spec # - это способ сделать это, который является надмножеством C #.Теперь у вас есть "Кодовые контракты", которая является независимой от языка версией спецификации #, так что теперь вы можете создавать контракты кода, например, в VB.NET.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top