Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Контрактная модель в программировании. Пред- и постусловия. Особенности формулировки постусловий для недерминированных систем.




Таблица 1.

Парадигма Ключевой концепт Программа Выполнение программы Результат
Императивная Команда Последова-тельность команд Исполнение команд Итоговое состояние памяти
Функциональная Функция Набор функций Вычисление функций Значение главной функции
Логическая Предикат (то, что утверждается о субъекте) Логические формулы Логическое доказательство Результат доказательства
Объектно-ориентированная Объект Набор классов объектов Обмен сообщениями между объектами Результирующее состояние объектов

Парадигмы и языки программирования

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

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

Императивная парадигма: языки Паскаль, Си, Ада;

Функциональная парадигма: языки Лисп, Haskel;

Логическая парадигма: языки Пролог и Datalog;

Объектно-ориентированная парадигма: Smalltalk, Eiffel.

Подобным образом из объединения объектно-ориентированной с другими парадигмами возникли объектно-ориентированные варианты других языков программирования. В настоящее время существует целый ряд современных языков программирования, в которых объединены две парадигмы:

Императивная и объектно-ориентированная: C++, C#, Delphi, Java и др.;

Функциональная и объектно-ориентированная: CLOS, Erlang и др.;

Логическая и объектно-ориентированная: Object Prolog.

Тем самым, каждая из парадигм имеет свою область применения. Императивные языки удобны как для числовых, так и для символьных вычислений, однако они проигрывают функциональным языкам и Прологу в реализации обработки сложных символьных структур. Функциональное программирование хорошо подходит для символьных преобразований, логическое – для построения дедуктивных баз данных и экспертных систем, но в то же время они неудобны для программирования интерактивных задач или событийно-управляемых приложений. В свою очередь, объектно-ориентированная парадигма подходит для создания интерактивных программ со сложным поведением и интерфейсом, обрабатывающих данные различных типов.

Признаки объектно-ориентированного программирования.

Три основных признака объектно-ориентированного подхода – это:

Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.

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

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.


Контрактная модель в программировании. Пред- и постусловия. Особенности формулировки постусловий для недерминированных систем.

Абстракция – в объектно-ориентированном программировании это придание объекту характеристик, которые отличают его от всех других объектов, четко определяя его концептуальные границы. Основная идея состоит в том, чтобы отделить способ использования составных объектов данных от деталей их реализации в виде более простых объектов, подобно тому, как функциональная абстракция разделяет способ использования функции и деталей её реализации в терминах более примитивных функций, таким образом, данные обрабатываются функцией высокого уровня с помощью вызова функций низкого уровня. Такой подход является основой объектно-ориентированного программирования. Это позволяет работать с объектами, не вдаваясь в особенности их реализации. В каждом конкретном случае применяется тот или иной подход: инкапсуляция, полиморфизм или наследование. Очень важным для абстрагирования понятием является понятие контрактной модели программирования.

Клиентом называется любой объект, использующий ресурсы другого объекта (называемого сервером). Мы будем характеризовать поведение объекта услугами, которые он оказывает другим объектам, и операциями, которые он выполняет над другими объектами. Такой подход концентрирует внимание на внешних проявлениях объекта и приводит к идее, которую Мейер назвал контрактной моделью программирования: внешнее проявление объекта рассматривается с точки зрения его контракта с другими объектами, в соответствии с этим должно быть выполнено и его внутреннее устройство (часто во взаимодействии с другими объектами). Контракт фиксирует все обязательства, которые объект-сервер имеет перед объектом-клиентом. Другими словами, этот контракт определяет ответственность объекта - то поведение, за которое он отвечает.

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

Центральной идеей в контрактной модели программирования является понятие инварианта. Инвариант - это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться. Для каждой операции объекта можно задать предусловия (инварианты предполагаемые операцией) и постусловия (инварианты, которым удовлетворяет операция). Изменение инварианта нарушает контракт, связанный с абстракцией. В частности, если нарушено предусловие, то клиент не соблюдает свои обязательства и сервер не может выполнить свою задачу правильно. Если же нарушено постусловие, то свои обязательства нарушил сервер, и клиент не может более ему доверять. В случае нарушения какого-либо условия возбуждается исключительная ситуация. Многие языки программирования имеют средства для работы с исключительными ситуациями: объекты могут возбуждать исключения, чтобы запретить дальнейшую обработку и предупредить о проблеме другие объекты, которые в свою очередь могут принять на себя перехват исключения и справиться с проблемой.

Для каждой операции объекта можно задать предусловия (инварианты, предполагаемые операцией) и постусловия (инварианты, которым удовлетворяет операция).

Более точно это запишется следующим образом: пусть – предусловие, – постусловие, – операция. Тогда утверждение «операция при наличии предусловия гарантирует постусловие » запишется в виде .

Введем понятие слабейшего предусловия. Это самое общее предусловие. Например, если постусловие операции деления целого аргумента на 2 состоит в том, что частное — четное число, то слабейшим предусловием является: делимое кратно 4. Любое другое предусловие — частный случай слабейшего.

Слабейшее предусловие для получения постусловия при выполнении операции обозначается . Очевидно, что .

Для слабейших предусловий формулируются следующие законы.

1. Закон исключенного чуда: , где — невозможное состояние (аналог логического 0 или false) — для достижения невозможного состояния нет предусловия.

2. Дистрибутивность (свойство согласованности двух бинарных операций, определённых на одном и том же множестве) конъюнкции: .

3. Дистрибутивность дизъюнкции: .

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

Формализация очевидных, на первый взгляд, понятий необходима при анализе сложных многокомпонентных систем.

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

Если нарушено постусловие, то свои обязательства нарушил сервер, и клиент не может ему доверять.


3.

3. Сущность класс. Отношения между классами. Реализация на C++, Common LISP.

Сущность класс

Классом называется шаблон, который описывает методы и свойства, используемые для определенного типа объектов. Наследование, использование, наполнение – свойства класса.

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

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

Вновь создаваемый класс автоматически наследует все свойства и методы родительского класса, но всегда можно изменить какие-либо из этих свойств и методов для выполнения специализации данного подкласса. Наследование поддерживается не только при создании подкласса, но и в дальнейшем. Все сделанные изменения в родительском классе отображаются на его подклассах. Как видно из рис. 1 класс (см. приложение) кнопок для вывода данных на печать наследует свой внешний вид от класса графических кнопок, но имеет специализированное изображение и, очевидно, специфическую реакцию на нажатие. Если изменить размер кнопки в классе графических кнопок, изменится размер всех используемых в приложении кнопок, стоящих ниже иерархии классов.

Идея наполнения: класс составляем из нескольких источников.

На основании описания класса при работе программы создаются объекты, которые и обеспечивают выполнение заданных функций. Из описания одного класса может быть создано сколь угодно объектов. Такие объекты будут называться экземпляром одного класса. Иерархия классов – это древообразная структура классов, отображающая взаимодействие между используемыми в приложении классами одного типа.

 

Рисунок 1 - «иерархия классов»

Классы, находящиеся в более низких ступенях иерархии, называются подклассами. Любой из классов, находящихся в иерархии, изображенной на рисунке, ниже базового класса, будет подклассом. Классы, находящиеся на более высоких ступенях, на основании которых описаны ниже стоящие в иерархии классы, называются родительскими классами. Например, базовый класс разработчика будет родительским по отношению к классу кнопки для панели инструментов (см. рис.1). На основе одного родительского класса может быть создано сколь угодно подклассов следующего уровня. Такие подклассы называются экземплярами данного класса. На рис. 1 такими экземплярами будут классы для выполнения определенных действий, созданные на основе родительского класса графических кнопок.

Базовым классом называется класс, находящийся на вершине иерархии классов, используемых в приложении.

Интерфейс и реализация

Класс формулирует контракт между абстракцией и всеми ее клиентами. В интерфейсе класса выражены его обязательства. В языках с сильной типизацией потенциальные нарушения контракта могут быть обнаружены еще на этапе компиляции.

Идея контрактного программирования приводит к разграничению внешнего облика — интерфейса, и внутреннего устройства — реализации. Главное в интерфейсе — объявление операций, выполняемых экземплярами класса. До реализации класса никому, собственно говоря, нет дела.

В развитых языках программирования интерфейс делится на три части:

- открытую (public) — видимую всем клиентам;

- защищенную (protected) — видимую самому классу, его подклассам и друзьям (friends);

- закрытую (private) — видимую только самому классу и его друзьям.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...