Основы объектно-ориентированного программирования
0e1cc9b4

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


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

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

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

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

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

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

putОбязательстваПреимущества
Клиент

(Выполнить предусловие:)

Вызывать put(x) только для непустого стека.

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

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

Поставщик

(Выполнить постусловие:)

Обновить представление стека: иметь x на вершине (item возвращает x), count увеличить на единицу, стек не пуст.

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

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



Содержание раздела