Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Права и обязательства





 

Связывая с программой r предложения require pre и ensure post, класс говорит своим клиентам:

"Если вы обещаете вызвать r в состоянии, удовлетворяющем pre, то я обещаю в заключительном состоянии выполнить post ".

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

[x]. Предусловие связывает клиента: определяются условия, при которых вызов программы клиентом легитимен. Обязательства клиента приносят пользу поставщику.

[x]. Постусловие связывает класс: программа обязана обеспечить условия по ее завершению. Здесь польза клиента оборачивается обязательствами поставщика класса.

Вот пример контракта для одной из программ нашего примера:

 

(Из постусловия:)

Получить обновленный стек: не пустой, x на вершине, (item дает x, count увеличилось на единицу).

 

(Из предусловия:)

Упрощающее обработку предположение о том, что стек не пуст.

 

put Обязательства Преимущества
(Выполнить предусловие:)Вызывать put(x) только для непустого стека.(Из постусловия:)Получить обновленный стек: не пустой, x на вершине, (item дает x, count увеличилось на единицу).Клиент   (Выполнить предусловие:) Вызывать put(x) только для непустого стека.    
(Выполнить постусловие:)Обновить представление стека: иметь x на вершине (item возвращает x), count увеличить на единицу, стек не пуст.(Из предусловия:)Упрощающее обработку предположение о том, что стек не пуст.Поставщик   (Выполнить постусловие:) Обновить представление стека: иметь x на вершине (item возвращает x), count увеличить на единицу, стек не пуст.    

Таблица 11.1. Контракт программы: программа put класса стек

 

 

Интуиция (Дзен) и искусство программной надежности: больше гарантий и меньше проверок

 

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

Правило контракта говорит, что предусловие дает преимущество поставщику, если клиентская часть контракта не выполняется, то класс перестает быть связан постусловием. В этом случае программа может делать все что угодно, например зациклиться, не нарушая при этом контракт. Это тот самый случай, когда "заказчик виноват".

Первое преимущество от такого соглашения в том, что стиль программирования существенно упрощается. Разработчик класса при написании тела программы смело может предполагать, что все ограничения, заданные предусловием, выполняются; ему нет нужды проверять их в теле программы. Так для функции, вычисляющей квадратный корень:

 

sqrt (x: REAL): REAL is

-- Квадратный корень из x

require

x >= 0

do... end

 

 

можно смело применять алгоритм, не учитывающий случай отрицательного x, поскольку это предусмотрено предусловием, и ответственность за его выполнение несут клиенты программы. С первого взгляда это может показаться опасным, но читайте дальше. Фактически метод Проектирования по Контракту идет дальше. Предположим, что мы написали в предложении do предыдущей программы следующий текст:

 

if x < 0 then

"Обработать ошибку как-нибудь"

else

"Выполнить нормальное вычисление квадратного корня"

end

 

 

Заметьте, в этом не только нет никакой необходимости, но это и неприемлемо! Этот факт можно отразить в следующем методологическом правиле:







Date: 2015-12-13; view: 387; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию