Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метода ТРПО.docx
Скачиваний:
8
Добавлен:
26.09.2019
Размер:
455.54 Кб
Скачать

27. Методы, операции, сообщения. Разделение команд и запросов.

Метод в объектно-ориентированном программировании — процедура или функция, принадлежащая какому-то классу или объекту.

Методы реализуют операции. Объект выполняет операцию, когда получает сообщение.

Для объявления любой операции должно быть задано:

- имя операции

- объекты-параметры

- тип возвращаемого значения

Эту триаду называют сигнатурой операции.

Множество сигнатур операция называется интерфейсом этого объекта. Интерфейс определяет все множество запросов, которые можно отправить объекту. В ООП интерфейсы фундаментальны. Разные объекты могут иметь одинаковые интерфейсы.

При проектировании интерфейсов классов часто используется принцип разделения команд и запросов. При проектировании класса следует методы разделять на команды и запросы. Команда модифицируют объект, а запросы возвращают информацию об объекте.

Команды реализуются с помощью процедур, а запросы – функций. В Си++ это const функции.

Функции с побочным эффектом – это плохо. Можно сформулировать этот принцип так:

«Операции-запросы не должны обладать побочным эффектом»

28. Проектирование по контракту. Предусловия и постусловия в методах. Инварианты.

Это метод программирования ПО предполагающий, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. Повышается документированность системы.

Утверждение (assertion) – формальное условие, описывающее свойство программных элементов (особенно программ и циклов).

Выделяют 3 вида утверждений: предусловия, постусловия, инварианты.

Программист предполагает, что все утверждения истины при выполнении его программы.

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

Перед написание модуля необходимо написать формальное утверждение корректности этого модуля.

Пусть А – некоторая операция.

{p}A{Q} – формула корректности для операции А.

Смысл таков: любое выполнение А, начинающееся в состоянии, когда предикат p истинен, завершится и в заключительном состоянии будет истинен предикат Q.

{p}А{Q} – триада Хоара.

Пример: {x>=9} x:=x+5 {x>=13}

P – предусловие, Q – постусловие

{P}A{Q}; {Q}B{R}; {P}A;B{R} – важно – Q не проверяется

{x+1=43} y:=x+1 {y=43}

{y=43} z:=y {z=43}

Формальная проверка корректности математическими методами используется очень редко.

Предусловие должно быть истинно до выполнения операции. Постусловие должно быть истинно после выполнения операции. Корректная система никогда не вызовет операцию, в которой не выполняется ее условия. Это накладывает ответственность на клиента.

Так как условие предполагается истинным при заходе в подпрограмму, то нет необходимости проверять это условие в теле подпрограммы.

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

Любое нарушение утверждения – это баг. Если нарушено предусловие, то баг у клиента. Нарушение постусловия – баг у поставщика.

В ООП добавляется понятие «инвариант класса».

Инвариант цикла – это утверждение, которое должно быть истинно до выполнения цикла, после каждой итерации и после выполнения цикла.

В ООП предусловия могут быть ослаблены у подкласса, а постусловия усилены.

При использовании контрастного программирования сам код в принципе не обязан проверять выполнение утверждений. Часто в релизном варианте кода проверки утверждений убираются, чтобы повысить производительность.

Часто используется подход «fail hard». В этом случае программа завершает свою работу при невыполнении какого-либо утверждения.

При использовании контрастного программирования предполагается, что клиент действует по следующему принципу:

«сначала проверка статуса, затем выполнение операции».

Наиболее проблематичной является проверка постусловий. Обычно проверку постусловий не включают в код, а корректность достигается тестированием.

Наиболее полно контрактное программирование используется в языке Eifell. В С/С++ используется макрос assert(P).

Утверждения не предназначены для проверки вводимых пользователем данных и других внешних данных. Контрактное программирование повышает возможность повторного использования кода и повышает документированность модуля.