Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
precond(ptr != 0);
invariant(sz = size());
postcond(*ptr > 0);
public ComponentInfo GetComponentInfo(string id)
{
ComponentInfo info = new ComponentInfo();
try
{
//собираем этот объект разными способами
//с возможной генерацией исключения
}
catch(ContractException ex)
{
//обеспечиваем возвращение валидного объекта
info.Name = «Не известно»;
info.Description = «Искомая деталь не найдена»;
info.Price = 0;
}
return info;
}* This source code was highlighted with Source Code Highlighter.
//вызывающая программа
…
//обеспечиваем предусловия для вызываемого метода
if(String.IsNullOrEmpty(objectName) || objectName.Contains(«@»))
{
//выводим сообщение об ошибке, прекращаем выполнение программы или передаем управление куда-либо
}
SomeObject some = GetSomeObject(objectName);
//т.к. мы выполнили предусловия по нашему контракту, то можем смело дергать методы объекта
//не боясь «object reference» исключения
Console.WriteLine(some.Name);
Console.WriteLine(some.Description);
...
//вызываемая программа
//нет необходимости выполнять проверку на пустую строку или еще на что-нибудь
//полагаемся на контракт
public SomeObject GetSomeObject(string objectName)
{
//по условиям контракта должны вернуть объект
SomeObject result = new SomeObject();
try
{
//собираем объект
}
catch(SomeException ex)
{
//не удалось собрать объект
//но условия контракта выполнить надо
result.Name = «Unknown name»;
result.Description = «Can't find object»;
}
return result;
}
Вот мой совет для данной ситуации – если вы вызываете подпрограмму, которая была написана вами, то не пишите лишнего кода. Доверяйте себе.
Постусловия выражают состояния «окружающего мира» на момент выполнения подпрограммы.
Кроме того, наличие постусловия в подпрограмме гарантирует ее завершение (т.е. не будет бесконечного цикла, например).
наличие постусловия в подпрограмме гарантирует ее завершение
Проектирование по контракту