К примеру, в неком методе необходимо проверить входные параметры, а не null ли передался вместо полноценного объекта? Затем проверить результат работы метода.
static void SomeMethod(object param) { // проверяем входные параметры Debug.Assert(param != null); // делаем что-то важное... DoSomethingImportant(); // проверяем результат работы Debug.Assert(somethingImportant != somethingUnimportant); }
Хорошо. Но не слишком удобно, так как предусловия и постусловия проверяются в разныхместах. Ну а теперь перейдем к самому интересному. С относительно недавних пор (начало 2009года) у Microsoft есть такой продукт как Code Contracts (в Java как мне сказалианалог есть давно). Данная библиотека пока не является ни частью .NET, ни частьюVisual Studio. По крайней мере с VS2010 Beta 2, она не ставилась. А так у меняпоставилась на VS2008 и интегрируется с msbuild. Малюсенький примерчик. Допустим мы хотим иметь метод, который заполняет списокint'ов только четными числами, суммарное количество элементов списка не должнопревышать 6, и мы хотим быть уверены, что в нашем методе добавляется только одинэлемент в список:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics.Contracts; namespace CodeContractsTest { class Program { static void Main(string[] args) { List listEven = new List() { 2, 4, 6, 8}; AddItem(listEven, 10); // последующий вызов вызовет исключение //AddItem(listEven, 11); foreach (var item in listEven) { Console.WriteLine(item); } Console.ReadKey(); } static void AddItem(List list, int item) { Contract.Requires(item % 2 == 0); Contract.Ensures(list.Count <= 6); Contract.Ensures(list.Count == Contract.OldValue(list.Count) + 1); list.Add(item); //последующий вызов вызовет исключение //list.Add(item); } } }
Как видим в нашем распоряжении есть два наглядных метода для проверки пре- (Requires) и постусловий Ensures. Это гораздо нагляднее чем использовать Debug.Assert, хотя Contract.Assert тоже есть:) Есть еще атрибуты [ContractClass] и [ContractClassFor]. Можно объявить интерфейс, обозначить его [ContractClass], затем создать класс, реализующий этот интерфейс, обозначить его как [ContractClassFor] и реализовать в нем контракт. И все классы, которые будут реализовывать наш интерфейс по умолчанию будут проверяться на соответствие контракту. Ссылка на Code Contracts: http://research.microsoft.com/en-us/projects/contracts/ PS. Точнее в VS210 Beta 2. По умолчанию можно подключить сборку System.Diagnostics.Contracts, и даже писать ее методы (компилироваться будет, но работать нет). И только после того, как библиотеку установить, в свойствах проекта появиться Code Contracts и с ними можно будет работать.
Комментариев нет:
Отправить комментарий