Файл: Применение объектно-ориентированного подхода при проектировании информационной системы (История развития объектно-ориентированного подхода).pdf
Добавлен: 13.03.2024
Просмотров: 9
Скачиваний: 0
СОДЕРЖАНИЕ
ГЛАВА 1ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ ПРИМЕНЕНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПОДХОДА
1.1. История развития объектно-ориентированного подхода
1.2. Основные понятия и принципы ООП
2.1 Объектно-ориентированный анализ (ООА)
2.3 Объектно-ориентированное программирование (ООР)
Содержание:
ВВЕДЕНИЕ
Врач, строитель и программист поспорили о том, чья профессия древнее. Врач заметил: "В Библии сказано, что Бог создал Еву из ребра Адама. Это мог сделать только хирург, поэтому моя профессия самая древняя в мире". Его перебил строитель: "Однако, как сказано в Книге Бытия, еще раньше Бог сотворил из хаоса сначала небо, а потом — землю. Это было первое и, несомненно, наиболее впечатляющее строительство. Следовательно, дорогой доктор, вы ошибаетесь. Именно моя профессия самая древняя в мире". Услышав это, программист откинулся на спинку кресла, улыбнулся и спросил доверительным тоном: "Ну а кто же, по-вашему, создал хаос?"
"Чем сложнее система, тем она уязвимее". Трудно себе представить строителя, размышляющего, а не вырыть ли еще один подвальный этаж под уже построенным стоэтажным зданием. Такое мероприятие было бы слишком дорогим и опасным. Как ни странно, пользователи программного обеспечения, не задумываясь, просят делать аналогичные изменения в программах. Более того, он считают, что для программиста эта задача не представляет никаких трудностей.
Поэтому в программировании важно не только создавать программные продукты, а создавать их таким образом, чтобы в дальнейшем процесс доработки и изменения программы или отдельных её частей был как можно проще. Также немаловажно, чтобы доработку или изменение мог произвести программист, который изначально не принимал участия в процессе программирования. То есть исходный код программы, принцип и алгоритм её работы должен быть достаточно легок в понимании для любого компетентного специалиста.
Целью данного исследования является изучение технологии объектно-ориентированного программирования. Для достижения поставленной цели необходимо решить следующие задачи:
- Изучить все существующие на данный момент стили программирования.
- Выяснить отличительные особенности объектно-ориентированного подхода
- Раскрыть основные принципы и понятия объектно-ориентированного подхода
- Рассмотреть наиболее распространенные объектно-ориентированные языки программирования.
ГЛАВА 1ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ ПРИМЕНЕНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПОДХОДА
1.1. История развития объектно-ориентированного подхода
Если обратиться к истории развития языков программирования, то они развивались по принципу от простого к сложному. Самыми первыми были языки процедурного типа, или императивные языки программирования. Программы, написанные на языке данного типа, представляют из себя последовательность операторов, или инструкций, задающих алгоритм решения задачи. Основным действием в императивном программировании является операция присваивания, с помощью которой изменяется содержимое областей памяти. Фундаментальная концепция императивного программирования – концепция памяти как хранилища значения, содержимое которого обновляется во время выполнения программы.
Языки процедурного программирования используются до сих пор, наиболее распространенные из них: ассемблер, С, Basic, Pascal.
Следующим этапом развития языков программирования стало появление функциональных языков, или аппликативных.
Первым таким языком был LISP.
В языках данного типа основная конструкция – выражение. К ним относятся функции, тела функций, вызовы функций и скалярные константы.
Программа представляет из себя совокупность выражений, которые необходимо вычислить, и описаний функций. Выражение вычисляется с помощью редукции, то есть последовательных упрощений до тех пор, пока выражение не разобьется на составляющие его элементарные базовые функции заложенные в языке.
Отличие аппликативного программирования от императивного заключается в том, что оно не использует концепцию памяти как хранилища значений переменных. Переменные обозначают не области памяти, а объекты программы, что соответствует понятию переменной в математике. В принципе переменные в программе могут вообще отсутствовать, то есть функция может быть значение вызова другой функции, или может быть аргументом в выражении.
Новую область в программировании открыло появления языка PROLOG. Это язык логического, или реляционного программирования. Сейчас существует уже появились и другие языки данного типа, но PROLOG является наиболее развитым и распространенным, кроме того, он используется при программировании систем искусственного интеллекта.
В логическом программировании центральным понятием является отношение. Программа на таком языке – это совокупность определений отношений между объектами (в терминах условий или ограничений) и цели (запроса). Главной особенностью программирования на логических языках является то, что не нужно определять последовательность шагов алгоритма, достаточно только специфицировать факты, на которых он основывается.
Последним из перечисленных типов языков программирования появился объектно-ориентированный подходю
Прототипом объектно-ориентированного программирования послужил ряд средств, входящих в состав языка SIMULA-67. Но в самостоятельный стиль оно оформилось с появлением языка SMALLTALK, разработанного А. Кеем в 1972 году и первоначально предназначенного для реализации функций машинной графики.
Основная цель объектно-ориентированного программирования (далее ООП), как и большинства других подходов – повышение эффективности разработки программ. Основные идеи данного подхода оказались настолько удачными, что нашли применение и в других областях информационных технологий, например, в области разработки операционных систем.
Концепция ООП подразумевает, что процесс реализации программы управляется посредством передачи сообщений объектам программы. При определении какого объекта определяются и сообщения, на которые данный объект должен реагировать при выполнении программы. То есть программа, написанная на языке данного типа состоит из объектов – отдельных фрагментов кода, обрабатывающего данные. Объекты взаимодействуют друг с другом через определенные интерфейсы.
1.2. Основные понятия и принципы ООП
Аналогично тому, как для каждой картины художник использует уникальный набор кистей, так и для каждой отдельной области предпочтителен свой стиль программирования. Например, для проектирования баз знаний может оказаться наиболее удобным реляционный стиль, а для решения вычислительных задач — императивный (процедурный). Объектно-ориентированный стиль достаточно неплохо подходит для самого широкого диапазона приложений.
Каждый стиль программирования основывается на своих концепциях и требует уникального подхода к решению задачи. Основа объектно-ориентированного стиля программирования – объектная модель.Она состоит из четырех главных элементов:
- Абстракция
- Инкапсуляция
- Модульность
- Иерархия
Термин главный элемент означает, что без любого из них модель не является объектно-ориентированной.
Естественно, программирование на на таких языках, как Smalltalk, Object Pascal, C++, Eiffel или Ada возможно и безприменения объектной модели, однако тогда проект будет похож на программы, написанные на соответствующих процедурных языках. Выразительная мощность объектно-ориентированного языка будет либо утеряна, либо искажена. Кроме того, что еще более важно, в этом случае программисты вряд ли справятся со сложностью задачи.
Абстрагирование — один из основных методов, позволяющих справиться со сложностью. Даль (Dahl), Дейкстра (Dijkstra) и Хоар (Ноаге) утверждают: "Абстрагирование проистекает из распознавания сходства между определенными объектами, ситуациями или процессами в реальном мире, и является результатом решения сконцентрировать внимание на общих свойствах и проигнорировать различия" [1]. Шоу (Show) считает абстракцией "упрощенное описание, или спецификацию системы, выделяющую одни свойства и затеняющую другие, а хорошая абстракция подчеркивает значимые детали и отбрасывает несущественные на данный момент" [2]. Берзинс (Berzins), Грей (Gray) и Науман (Naumann) рекомендуют "признавать идею абстракцией только, если она может быть описана, понята и проанализирована независимо от механизма ее дальнейшей реализации" [3]. Объединив все эти точки зрения, можно сформулировать следующее определение абстракции:
Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко описывает его концептуальные границы с точки зрения наблюдателя.
Абстракция концентрирует внимание на внешнем представлении объекта и позволяет отделить существенные особенности поведения от их реализации. Абель-сон (Abelson) и Суссман (Sussman) назвали такое разделение поведения от его реализации принципом минимальных обязательств (principle of least commitment) [4], в соответствии с которым интерфейс объекта должен обеспечивать только существенные аспекты его поведения и ничего больше [5]. Существует также дополнительный принцип наименьшего удивления (principle of least astonishment), согласно данному принципу абстракция должна полностью описывать поведение объекта, ни больше и ни меньше.
"Существует целый спектр абстракций, начиная с объектов, почти точно соответствующих реалиям предметной области, и заканчивая совершенно излишними объектами" [6]. Перечислим абстракции в порядке убывания их полезности.
• Абстракция сущности. Объект, представляющий собой полезную модель некой сущности в предметной области.
• Абстракция действия. Объект, состоящий из обобщенного множества операций, каждая из которых выполняет однотипные функции.
• Абстракция виртуальная Объект, группирующий операции, которые, либо машины вместе используются на более высоком уровне управления, либо сами используют некоторый набор операций более низкого уровня
• Произвольная абстракция Объект, включающий в себя набор операций, неимеющих друг с другом ничего общего
В программировании стараются строить абстракции сущности, так как они прямо соответствуют сущностям предметной области.
Согласно данной концепции объекты делятся на 2 категории – клиенты и серверы. Клиентом называется любой объект, использующий ресурсы другого объекта. А объекта, ресурсы которого используются – называется сервером. Поведение объекта характеризуется услугами, которые он оказывает другим объектам, и операциями, которые он может выполнять над другими объектами. Такой подход концентрирует внимание на внешних проявлениях объекта и приводит к идее, которую Мейер (Meyer) назвал контрактной моделью программирования [7]: внешнее проявление объекта определяет его контракт с другими объектами, подлежащий выполнению его внутренним устройством (часто во взаимодействии с другими объектами). Контракт фиксирует все предположения, которые объект-клиент может формулировать относительно поведения объекта-сервера. Иначе говоря, контракт определяет ответственность объекта, т.е. его обязательное поведение [8].
В таком случае каждая операции данного контракта однозначно идентифицируется её уникальной сигнатурой, которая состоит из типа значения, которое она возвращает, и формальных параметров. Все операции, которые клиент может осуществлять над другим объектом, вместе с установленным порядком их вызова образуют протокол. Протокол определяет перечень всех возможных способов, которыми объект может действовать или реагировать на воздействие других объектов, полностью определяя внешнее статическое и динамическое представление абстракции.
Главной идеей абстракции является концепция инварианта. Инвариант (invariant) — это логическое условие (истинное или ложное), которое должно выполняться всегда. Для каждой операции, ассоциированной с объектом, можно задать предусловия (инварианты, предполагаемые операцией) и постусловия (инварианты, которым удовлетворяет операция). Нарушение инварианта противоречит контракту, связанному с абстракцией. Если нарушается предусловие, то это значит, что клиент не соблюдает свои обязательства и сервер не в состоянии надежно функционировать. Аналогично, если нарушается постусловие, то свои обязательства не выполняет сервер, так что клиент больше не может ему доверять. Признаком нарушения некоего инварианта является исключительная ситуация. Некоторые языки позволяют объектам генерировать исключительные ситуации, чтобы отменить дальнейшую обработку данных и предупредить о возникшей проблеме другие объекты, которые в свою очередь могут перехватывать и обрабатывать исключения.