https://studfiles.net/preview/4593563/
- Лекция 1
- Объектно-ориентированный анализ (ООА)- это метод отождествления важных сущностей реального мира для понимания и объяснения того, как они взаимодействуют между собой. ООА - это моделирование проблемы с целью формирования словаря предметной области, определения объектов и классов.
Известны несколько подходов к проведению ООА.
В книге Салли Шлеер и Стефана Меллора «Объектно-ориентированный анализ: моделирование мира в состояниях» выделено три этапа ООА:
- Построение информационной модели, абстрагирование реальных сущностей в терминах объектов и атрибутов.
- Построение модели состояний для формализации жизненных циклов объектов и отображение этой модели диаграммами и таблицами переходов, взаимодействие между объектами осуществляется путем передачи сообщений о происходящих с ними событиях. - Разработка модели процессов, в которой действия в моделях состояний расчленяются на фундаментальные и многократно используемые процессы.
В книге Гради Буча “Объектно-ориентированное проектирование с примерами применения” отмечаются альтернативные подходы к ООА:
- Метод неформального описания, в котором выделяются существительные и глаголы в описании предметной области. Существительные рассматриваются как кандидаты для образования классов. а глаголы - кандидаты в операции над классами.
- Структурный анализ, при котором на основе модели системы, представленной диаграммами потоков данных, выделяются внешние события и объекты, база данных, поток управления, преобразования потока управления. Далее, на основе анализа потока данных и потока управления, выделяются классы и методы классов.
Основные понятия методов объектного анализа предметной области.
К основным понятиям методов объектного анализа ПрО отнесем следующие .
Объект- это простой объект, методами, свойствами и событиями которого вы можете управлять.
Объект - это осязаемая сущность, которая четко проявляет свое поведение.
Объект(предмет) вообще то, что дано в познании, или на что обращена наша познавательная деятельность.
Объект ПрО- это абстрактный образ с поведением, которое обусловлено его характеристиками и взаимоотношениями с другими объектами ПрО.
Согласно теории Фреге спецификацию объекта можно трактовать как треугольник:
<имя объекта > <денотат > <концепт>,
где <имя объекта> - идентификатор, строка из литер и десятичных чисел; <денотат> - сущность реального мира ПрО, которую обозначает идентификатор; <концепт> - смысл (семантика) денотата в соответствии с интерпретацией сущности моделируемой ПрО.
Объект интерпретируется как понятийная структура, состоит из идентификатора, денотата - образа предмета и концепта, отображающего смысл этого денотата, исходя из цели объектного моделирования ПрО. Денотат можно идентифицировать различными символами алфавита. Одному объекту могут соответствовать несколько концептов в зависимости от избранного уровня абстракции. Объект определяется через его внешнее отличие от других объектов. Внутренняя особенность объекта (его структура, внутренние характеристики) не влияет на внешнее отличие и для объектного моделирования значения не имеет.
Сущность - это семантически важный объект или тип объекта, существующий реально в ПрО или является абстрактным понятием, информацию о котором необходимо знать и/или сохранять. Имя сущности должно быть уникальным и может представлять тип или класс объектов. Сущность может иметь синонимы, записываемые через знак "/" (например, аэропорт/аэродром).
Концепт - значение некоторой абстрактной сущности ПрО, обозначается уникальным именем или идентификатором. Группа подобных концептов - это родительский концепт, который заведомо определяется некоторым набором общих атрибутов. Концепт вместе со своими атрибутами представляется графически в ОМ или в текстовом виде.
Атрибут - это абстракция, которой владеют все абстрагированные концепты сущности. Каждый атрибут обозначается именем, уникальным в границах описания концепта. Множество объединенных в группу атрибутов обозначает идентификатор этой группы. Группа атрибутов может объединяться в класс и иметь идентификатор класса.
Отношение - это абстракция набора связей, которые имеют место между разными видами объектов ПрО, абстрагированных как концепты. Каждая связь имеет уникальный идентификатор. Отношения могут быть текстовыми или графическими. Для формализации отношений между концептами добавляются вспомогательные атрибуты и ссылки на идентификаторы этих отношений. Некоторые отношения образуются как следствие существования других отношений.
Класс - это множество объектов, обладающих одинаковыми свойствами, операциями, отношениями и семантикой. Любой объект - это экземпляр класса. Класс представляется различными способа-ми (например, списками объектов, операций, состояний). Измеряется класс количеством экземпляров, операций и т.п.
Предметная область- это мысленно ограниченная область реальной действительности, подлежащая описанию или моделированию и исследованию.
Предметная область состоит из объектов, различаемых по свойствам и находящихся в определенных отношениях между собой или взаимодействующих каким-либо образом.
Предметная область- это часть реального мира, она бесконечна и содержит как существенные, так и не значащие данные, с точки зрения проводимого исследования.
Предметная область- это то, что анализируется с целью выделения специфичного множества понятий (сущностей, объектов) и связей между ними. На множестве этих понятий определяются задачи в целях автоматизированного их решения. Пространство ПрО можно разделить на пространство задач (problem space) и пространство решений (solution space).Пространство задач- это сущности, концепты ПрО, а пространство решений - это множество программных реализаций задач, в том числе функциональные компоненты, которые обеспечивают решение задач и функций ПрО, представленных в этом пространстве.
Выделение сущностей ПрО проводится с учетом отличий, определяемых соответствующими понятийными структурами. Объект как абстракции реального мира и понятийная структура обладает поведением, обусловленным свойствами и отношениями данного объекта с другими объектами. Выделенные в ПрО объекты структурно упорядочиваются теоретико-множественными операциями (принадлежности, объединения, пересечения и др.).
Модель ПрО- это совокупность точных определений понятий, концептов, объектов и их характеристик, а также множества синонимов и классифицированных логических взаимосвязей между этими понятиями.
Концептуальная модель - это модель ПрО, она создается без ориентации на программные и технические средства выполнения задач ПрО в операционной среде.
Для объектов модели устанавливаются отношения или связи. Различаются статические (постоянные) связи, которые не изменяются или изменяются редко, и динамические связи, которые имеют определенные состояния и изменяются во время функционирования системы.
Связи между объектами могут быть следующие:
связь один к одному (1:1) существует тогда, когда один экземпляр объекта некоторого класса связан с единственным экземпляром другого класса, т.е. в связи принимают участие по одному экземпляру из классов;
связь один ко многим (1:N), существует тогда, когда один экземпляр объекта некоторого класса связан одновременно с одним или более экземплярами другого класса или того же самого класса;
связь многие ко многим (M:N) существует тогда, когда в связях принимают участие несколько экземпляров объектов двух классов, т.е. один или больше экземпляров другого класса связан с одним или более экземплярами первого класса.
Состояние связей между объектами с течением времени может эволюционировать, и они могут существенно влиять на ход решения задачи. Для таких случаев связи строится ассоциативный объект и определяется модель состояний этого объекта путем добавления атрибута, фиксирующего текущее состояние.
Среди действий, которые сопровождают переходы объектов в определенные состояния в модели состояний, должны быть операции создания нового экземпляра ассоциативного объекта, если новая пара экземпляров вступает в связь или его уничтожения в случае, если объект или связь перестают существовать.
Метод- это процедура или просто набор команд, сообщающих объекту, что нужно выполнить некоторую задачу.
Свойство- это некоторый вид параметра объекта. Событие - это сигнал, подаваемый, если с объектом что-то происходит.
- Методы объектного анализа
Главная цель объектного анализа - представить предметную область как множество объектов со свойствами и характеристиками, которые достаточны для их определения и идентификации, а также для задания поведения объектов в рамках выбранной системы понятий и абстракций. На произвольном шаге объектного анализа все понятия (сущности) ПрО - суть объекты. Каждый объект - это уникальный элемент, имеет, по крайней мере, одно свойство или характеристику и уникальную идентификацию во множестве объектов.
Предметная область сама является самостоятельным объектом или может быть объектом в составе другой предметной области.
Анализ ПрО проводится с помощью объектно-ориентированных методов и соответствующих стандартов. Конечная цель объектно-ориентированного анализа ПрО - определение объектной модели (ОМ) с помощью выделенных объектов, отношений между ними и их свойствами и характеристиками.
При построении модели ОМ в предметной области также выявляются функциональные задачи, формулируются требования к их проектированию и реализации. Требования, задачи и модель ОМ - необходимые условия построения архитектуры системы для анализируемой ПрО.
Краткий обзор объектно-ориентированных методов анализа и построения моделей
На данный момент известно более пятидесяти объектно-ориентированных методов анализа ПрО, которые прошли проверку практикой. Приведем некоторые основные из них:
метод объектно-ориентированного системного анализа OOAS (Object-Oriented system analysis), позволяющий выделить сущности и объекты ПрО, определить их свойства и отношения, а также построить на их основе информационную модель, модель состояний объектов и процессов представления потоков данных (dataflow);
метод объектно-ориентированного анализа OOA (Object-Oriented analysis), обеспечивающий моделирование ОМ и формирование требований к ПрО с помощью понятия "сущность-связь" (entity-relationship ER), спецификацию потоков данных и соответствующих процессов;
метод SD (Structured Design) структурного проектирования системы, данных и программ преобразования входных данных в выходные с помощью структурных карт Джексона;
методология объектно-ориентированного анализа и проектирования OOAD (Object-oriented analysis and design), которая основывается на ER-моделировании сущностей и отношений в объектной модели ПрО, она обеспечивает определение системы и организацию данных с использованием структурных диаграмм, диаграмм "сущность-связь" и матрицы информационного управления;
технология объектного моделирования OMT (Object Modeling Technique) включает в себя процессы (анализа, проектирования и реализации), набор нотаций для задания четырех моделей (объектной, динамической, функциональной и взаимодействия);
объединенный метод UML, включающий средства и понятия метода Г. Буча (объекты, классы, суперклассы), принципы наследования, полиморфизма и упрятывания информации об объектах, а также варианты использования метода Джекобсона для задания сценариев работы системы при выполнении задач ПрО и диаграммные средства взаимодействия объектов Румбауха;
метод определения распределенных объектов на основе объектной модели CORBA и набора сервисных системных компонентов общего пользования, обеспечивающих их функционирование в среде распределенных приложений ;
метод генерации (generative) частей системы из семейства ПрО с помощью готовых объектов, аспектов, компонентов, программ многоразового использования и приложений, а также модели характеристик, в которой представлены функциональные и нефункциональные требования к семейству систем .
- Методы проектирования архитектуры ПО
Проектирование ПО - это процесс разработки, следующий за этапом анализа и формирования требований. Задача проектирования - это преобразование требований к системе в требования к ПО и построение архитектуры системы .
Архитектура системы- это структурная схема компонентов системы, взаимодействующих между собой через интерфейсы. Компоненты могут составляться из последовательности более мелких компонентов и интерфейсов. Разработка архитектуры основывается на общем наборе справочников, классификаторов и т.п. В ней идентифицированы общие части, в том числе готовые программные продукты и вновь разработанные компоненты, а также многократно используемые в производстве других приложений.
Основное условие построения архитектуры системы - это декомпозиция системы на компоненты или модули, а также
определение целей и проверка их выполнимости;
определение входных и выходных данных;
иерархическое представление абстракции системы и скрытие тех деталей, которые будут отработаны на следующих уровнях.
Основные решения по структуре системы принимаются группой архитекторов и аналитиков. Проект разбивается на разделы или отдельные части для их выполнения небольшими группами разработчиков, каждая из которых отвечает за одну или несколько частей системы.
При применении объектно-ориентированного подхода в качестве компонентов выступают отдельные объекты, а процесс конструирования объектной структуры превращается в процесс выявления имеющихся в ПрО объектов и определения их поведения и взаимодействия.
Объектно-ориентированный анализ и проектирование. Объектная модель Объектная модель
Объектно-ориентированная технология основывается на так называемой объектной модели.Основными ее принципами являются: абстрагирование, инкапсуляция, модульность, иерархичность, типизация, параллелизм и сохраняемость. Каждый из этих принципов сам по себе не нов, но в объектной модели они впервые применены в совокупности.
Объектно-ориентированный анализ и проектирование принципиально отличаются от традиционных подходов структурного проектирования: здесь нужно по-другому представлять себе процесс декомпозиции, а архитектура получающегося программного продукта в значительной степени выходит за рамки представлений, традиционных для структурного программирования. Отличия обусловлены тем, что структурное проектирование основано на структурном программировании, тогда как в основе объектно-ориентированного проектирования лежит методология объектно-ориентированного программирования,
Основные положения объектной модели
Методы структурного проектирования помогают упростить процесс разработки сложных систем за счет использования алгоритмов как готовых строительных блоков. Аналогично, методы объектно-ориентированного проектирования созданы, чтобы помочь разработчикам применять мощные выразительные средства объектного и объектно-ориентированного программирования, использующего в качестве блоков классы и объекты.
Но в объектной модели отражается и множество других факторов. Как показано во врезке ниже, объектный подход зарекомендовал себя как унифицирующая идея всей компьютерной науки, применимая не только в программировании, но также в проектировании интерфейса пользователя, баз данных и даже архитектуры компьютеров. Причина такой широты в том, что ориентация на объекты позволяет нам справляться со сложностью систем самой разной природы.
Рис. 2-4. Топология малых и средних приложений в объектных и объектно-ориентированных языках.
Объектно-ориентированное программирование- это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
В данном определении можно выделить три части:
1) OOП использует в качестве базовых элементов объекты,а не алгоритмы (иерархия "быть частью");
2) каждый объект является экземпляромкакого-либо определенногокласса;
3) классы организованы иерархически.
Программа будет объектно-ориентированной только при соблюдении всех трех указанных требований. В частности, программирование, не основанное на иерархических отношениях, не относится к OOП, а называется программированием на основе абстрактных типов данных.
Лекция 2.
Объектно-ориентированное проектирование.Программирование прежде всего подразумевает правильное и эффективное использование механизмов конкретных языков программирования. Проектирование, напротив, основное внимание уделяет правильному и эффективному структурированию сложных систем. Мы определяем объектно-ориентированное проектирование следующим образом:
Объектно-ориентированное проектирование- это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления логической и физической, а также статической и динамической моделей проектируемой системы.
В данном определении содержатся две важные части:
объектно-ориентированное проектирование
1) основывается на объектно-ориентированной декомпозиции;
2) использует многообразие приемов представления моделей, отражающих логическую (классы и объекты) и физическую (модули и процессы) структуру системы,
а также ее статические и динамические аспекты.
Для объектно-ориентированного стиля концептуальная база - это объектная модель.Она имеет четыре главных элемента:
абстрагирование;
инкапсуляция;
модульность;
иерархия.
Эти элементы являются главнымив том смысле, что без любого из них модель не будет объектно-ориентированной. Кроме главных, имеются еще три дополнительных элемента:
типизация;
параллелизм;
сохраняемость.
Называя их дополнительными,мы имеем в виду, что они полезны в объектной модели, но не обязательны.
Абстрагирование
Смысл абстрагирования.Абстрагирование является одним из основных методов, используемых для решения сложных задач. Хоар считает, что "абстрагирование проявляется в нахождении сходств между определенными объектами, ситуациями или процессами реального мира, и в принятии решений на основе этих сходств, отвлекаясь на время от имеющихся различий". Шоу определила это понятие так: "Упрощенное описание или изложение системы, при котором одни свойства и детали выделяются, а другие опускаются. Хорошей является такая абстракция, которая подчеркивает детали, существенные для рассмотрения и использования, и опускает те, которые на данный момент несущественны". Берзинс, Грей и Науман рекомендовали, чтобы "идея квалифицировалась как абстракция только, если она может быть изложена, понята и проанализирована независимо от механизма, который будет в дальнейшем принят для ее реализации". Суммируя эти разные точки зрения, получим следующее определение абстракции:
Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.
Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных. Абельсон и Суссман назвали такое разделение смысла и реализации барьером абстракции, который основывается на принципе минимизации связей, когда интерфейс объекта содержит только существенные аспекты поведения и ничего больше. Мы считаем полезным еще один дополнительный принцип, называемыйпринципом наименьшего удивления,согласно которому абстракция должна охватывать все поведение объекта, но не больше и не меньше, и не привносить сюрпризов или побочных эффектов, лежащих вне ее сферы применимости.
По мнению Сейдвица и Старка "существует целый спектр абстракций, начиная с объектов, которые почти точно соответствуют реалиям предметной области, и кончая объектами, не имеющими право на существование". Вот эти абстракции, начиная от наиболее полезных к наименее полезным:
∙ Абстракция сущности
Объект представляет собой полезную модель некой сущности в предметной области
∙ Абстракция поведения
Объект состоит из обобщенного множества операций
Абстракция виртуальной машины
Объект группирует операции, которые либо вместе используются более высоким уровнем управления, либо сами используют некоторый набор операций более низкого уровня
∙ Произвольная абстракция
Объект включает в себя набор операций, не имеющих друг с другом ничего общего
Мы стараемся строить абстракции сущности, так как они прямо соответствуют сущностям предметной области.
Клиентомназывается любой объект, использующий ресурсы другого объекта (называемогосервером). Мы будем характеризовать поведение объекта услугами, которые он оказывает другим объектам, и операциями, которые он выполняет над другими объектами. Такой подход концентрирует внимание на внешних проявлениях объекта и приводит к идее, которую Мейер назвалконтрактной модельюпрограммирования: внешнее проявление объекта рассматривается с точки зрения его контракта с другими объектами, в соответствии с этим должно быть выполнено и его внутреннее устройство (часто во взаимодействии с другими объектами). Контракт фиксирует все обязательства, которые объект-сервер имеет перед объектом-клиентом. Другими словами, этот контракт определяетответственность объекта- то поведение, за которое он отвечает.
Каждая операция, предусмотренная этим контрактом, однозначно определяется ее формальными параметрами и типом возвращаемого значения. Полный набор операций, которые клиент может осуществлять над другим объектом, вместе с правильным порядком, в котором эти операции вызываются, называется протоколом.Протокол отражает все возможные способы, которыми объект может действовать или подвергаться воздействию, полностью определяя тем самым внешнее поведение абстракции со статической и динамической точек зрения.
Центральной идеей абстракции является понятие инварианта. Инвариант - это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться. Для каждой операции объекта можно задатьпредусловия(инварианты предполагаемые операцией) ипостусловия(инварианты, которым удовлетворяет операция). Изменение инварианта нарушает контракт, связанный с абстракцией. В частности, если нарушено предусловие, то клиент не соблюдает свои обязательства и сервер не может выполнить свою задачу правильно. Если же нарушено постусловие, то свои обязательства нарушил сервер, и клиент не может более ему доверять. В случае нарушения какого-либо условия возбуждается исключительная ситуация. Как мы увидим далее, некоторые языки имеют средства для работы с исключительными ситуациями: объекты могут возбуждать исключения, чтобы запретить дальнейшую обработку и предупредить о проблеме другие объекты, которые в свою очередь могут принять на себя перехват исключения и справиться с проблемой.
Все абстракции обладают как статическими, так и динамическими свойствами. Например, файл как объект требует определенного объема памяти на конкретном устройстве, имеет имя и содержание. Эти атрибуты являются статическими свойствами. Конкретные же значения каждого из перечисленных свойств динамичны и изменяются в процессе использования объекта: файл можно увеличить или уменьшить, изменить его имя и содержимое. В процедурном стиле программирования действия, изменяющие динамические характеристики объектов, составляют суть программы. Любые события связаны с вызовом подпрограмм и с выполнением операторов. Стиль программирования, ориентированный на правила, характеризуется тем, что под влиянием определенных условий активизируются определенные правила, которые в свою очередь вызывают другие правила, и т.д. Объектно-ориентированный стиль программирования связан с воздействием на объекты (в терминах Smalltalk с передачей объектам сообщений). Так, операция над объектом порождает некоторую реакцию этого объекта. Операции, которые можно выполнить по отношению к данному объекту, и реакция объекта на внешние воздействия определяют поведение этого объекта.
Инкапсуляция
Что это значит?Хотя мы описывали нашу абстракциюGrowingPlanкак сопоставление действий моментам времени, она не обязательно должна быть реализована буквально как таблица данных. Действительно, клиенту нет никакого дела до реализации класса, который его обслуживает, до тех пор, пока тот соблюдает свои обязательства. На самом деле, абстракция объекта всегда предшествует его реализации. А после того, как решение о реализации принято, оно должно трактоваться как секрет абстракции, скрытый от большинства клиентов. Как мудро замечает Ингалс: "Никакая часть сложной системы не должна зависеть от внутреннего устройства какой-либо другой части". В то время, как абстракция "помогает людям думать о том, что они делают", инкапсуляция "позволяет легко перестраивать программы".
Абстракция и инкапсуляция дополняют друг друга: абстрагирование направлено на наблюдаемое поведение объекта, а инкапсуляция занимается внутренним устройством. Чаще всего инкапсуляция выполняется посредством скрытия информации, то есть маскировкой всех внутренних деталей, не влияющих на внешнее поведение. Обычно скрываются и внутренняя структура объекта и реализация его методов.
Инкапсуляция, таким образом, определяет четкие границы между различными абстракциями. Возьмем для примера структуру растения: чтобы понять на верхнем уровне действие фотосинтеза, вполне допустимо игнорировать такие подробности, как функции корней растения или химию клеточных стенок. Аналогичным образом при проектировании базы данных принято писать программы так, чтобы они не зависели от физического представления данных; вместо этого сосредотачиваются на схеме, отражающей логическое строение данных. В обоих случаях объекты защищены от деталей реализации объектов более низкого уровня.
Дисков прямо утверждает, что "абстракция будет работать только вместе с инкапсуляцией". Практически это означает наличие двух частей в классе: интерфейса и реализации. Интерфейсотражает внешнее поведение объекта, описывая абстракцию поведения всех объектов данного класса. Внутренняяреализацияописывает представление этой абстракции и механизмы достижения желаемого поведения объекта. Принцип разделения интерфейса и реализации соответствует сути вещей: в интерфейсной части собрано все, что касается взаимодействия данного объекта с любыми другими объектами; реализация скрывает от других объектов все детали, не имеющие отношения к процессу взаимодействия объектов. Бритон и Парнас назвали такие детали "тайнами абстракции".
Итак, инкапсуляцию можно определить следующим образом:
Инкапсуляция - это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.
- Модульность
Правильное разделение программы на модули является почти такой же сложной задачей, как выбор правильного набора абстракций.
Модули выполняют роль физических контейнеров, в которые помещаются определения классов и объектов при логическом проектировании системы.
Для небольших задач допустимо описание всех классов и объектов в одном модуле. Однако для большинства программ (кроме самых тривиальных) лучшим решением будет сгруппировать в отдельный модуль логически связанные классы и объекты, оставив открытыми те элементы, которые совершенно необходимо видеть другим модулям.
В традиционном структурном проектировании модульность - это искусство раскладывать подпрограммы по кучкам так, чтобы в одну кучку попадали подпрограммы, использующие друг друга или изменяемые вместе. В объектно-ориентированном программировании ситуация несколько иная: необходимо физически разделить классы и объекты, составляющие логическую структуру проекта.
Модульность- это свойство системы, которая была разложена на внутренне связные, но слабо связанные между собой модули.
Принципы абстрагирования, инкапсуляции и модульности являются взаимодополняющими. Объект логически определяет границы определенной абстракции, а инкапсуляция и модульность делают их физически незыблемыми.
В процессе разделения системы на модули могут быть полезными два правила. Во-первых, поскольку модули служат в качестве элементарных и неделимых блоков программы, которые могут использоваться в системе повторно, распределение классов и объектов по модулям должно учитывать это. Во-вторых, многие компиляторы создают отдельный сегмент кода для каждого модуля. Поэтому могут появиться ограничения на размер модуля. Динамика вызовов подпрограмм и расположение описаний внутри модулей может сильно повлиять на локальность ссылок и на управление страницами виртуальной памяти. При плохом разбиении процедур по модулям учащаются взаимные вызовы между сегментами, что приводит к потере эффективности кэш-памяти и частой смене страниц.
Вычленение классов и объектов в проекте и организация модульной структуры - независимыедействия. Процесс вычленения классов и объектов составляет часть процесса логического проектирования системы, а деление на модули - этап физического проектирования. Разумеется, иногда невозможно завершить логическое проектирование системы, не завершив физическое проектирование, и наоборот. Два этих процесса выполняются итеративно.
Иерархия
Что такое иерархия?Абстракция - вещь полезная, но всегда, кроме самых простых ситуаций, число абстракций в системе намного превышает наши умственные возможности. Инкапсуляция позволяет в какой-то степени устранить это препятствие, убрав из поля зрения внутреннее содержание абстракций. Модульность также упрощает задачу, объединяя логически связанные абстракции в группы. Но этого оказывается недостаточно.
Значительное упрощение в понимании сложных задач достигается за счет образования из абстракций иерархической структуры. Определим иерархию следующим образом:
Иерархия - это упорядочение абстракций, расположение их по уровням.
Основными видами иерархических структур применительно к сложным системам являются структура классов (иерархия "is-a") и структура объектов (иерархия "part of").
Примеры иерархии: одиночное наследование. Важным элементом объектно-ориентированных систем и основным видом иерархии "is-a" является упоминавшаяся выше концепция наследования. Наследование означает такое отношение между классами (отношение родитель/потомок), когда один класс заимствует структурную или функциональную часть одного или нескольких других классов (соответственно, одиночноеимножественное наследование). Иными словами, наследование создает такую иерархию абстракций, в которой подклассы наследуют строение от одного или нескольких суперклассов. Часто подкласс достраивает или переписывает компоненты вышестоящего класса.
Семантически, наследование описывает отношение типа "is-a". Например, медведь есть млекопитающее, дом есть недвижимость и "быстрая сортировка" есть сортирующий алгоритм. Таким образом, наследование порождает иерархию "обобщение-специализация", в которой подкласс представляет собой специализированный частный случай своего суперкласса. "Лакмусовая бумажка" наследования - обратная проверка; так, если B не есть A, то B не стоит производить от A.
Примеры иерархии: агрегация.Если иерархия "is а" определяет отношение "обобщение/специализация", то отношение "part of" (часть) вводит иерархию агрегации.
Агрегация есть во всех языках, использующих структуры или записи, состоящие из разнотипных данных. Но в объектно-ориентированном программировании она обретает новую мощь: агрегация позволяет физически сгруппировать логически связанные структуры, а наследование с легкостью копирует эти общие группы в различные абстракции.
- Типизация
Что такое типизация? Понятие типавзято из теории абстрактных типов данных. Дойч определяет тип, как "точную характеристику свойств, включая структуру и поведение, относящуюся к некоторой совокупности объектов". Большинству смертных различать типы и классы просто противно и бесполезно. Достаточно сказать, что класс реализует понятие типа. Тем не менее, типы стоит обсудить отдельно, поскольку они выставляют смысл абстрагирования в совершенно другом свете. В частности, мы утверждаем, что:
Типизация - это способ защититься от использования объектов одного класса вместо другого, или по крайней мере управлять таким использованием.
Типизация заставляет нас выражать наши абстракции так, чтобы язык программирования, используемый в реализации, поддерживал соблюдение принятых проектных решений. Вегнер замечает, что такой способ контроля существенен для программирования "в большом".
Идея согласования типов занимает в понятии типизации центральное место. Например, возьмем физические единицы измерения. Деля расстояние на время, мы ожидаем получить скорость, а не вес. В умножении температуры на силу смысла нет, а в умножении расстояния на силу - есть. Все это примеры сильной типизации, когда прикладная область накладывает правила и ограничения на использование и сочетание абстракций.
Теслер отметил следующие важные преимущества строго типизированных языков:
"Отсутствие контроля типов может приводить к загадочным сбоям в программах во время их выполнения.
В большинстве систем процесс редактирование-компиляция-отладка утомителен, и раннее обнаружение ошибок просто незаменимо.
Объявление типов улучшает документирование программ.
Многие компиляторы генерируют более эффективный объектный код, если им явно известны типы".
Языки, в которых типизация отсутствует, обладают большей гибкостью, но даже в таких языках, по мнению Борнинга и Ингалса: "Программисты обычно знают, какие объекты ожидаются в качестве аргументов и какие будут возвращаться"
Примеры типизации: статическое и динамическое связывание.
Сильная и статическая типизация - разные вещи. Строгая типизация следит за соответствием типов, а статическая типизация (иначе называемая статическимилиранним связыванием)определяет время, когда имена связываются с типами. Статическая связь означает, что типы всех переменных и выражений известны во время компиляции;динамическое связывание(называемое такжепоздним связыванием)означает, что типы неизвестны до момента выполнения программы. Концепции типизации и связывания являются независимыми, поэтому в языке программирования может быть: типизация - сильная, связывание - статическое (Ada), типизация - сильная, связывание - динамическое (C++, Object Pascal), или и типов нет, и связывание динамическое (Smalltalk). Язык CLOS занимает промежуточное положение между C++ и Smalltalk: определения типов, сделанные программистом, могут быть либо приняты во внимание, либо не приняты.
полиморфизм - одно и то же имя может означать объекты разных типов, но, имея общего предка, все они имеют и общее подмножество операций, которые можно над ними выполнять. Противоположность полиморфизму называетсямономорфизмом;он характерен для языков с сильной типизацией и статическим связыванием (Ada).
Полиморфизм возникает там, где взаимодействуют наследование и динамическое связывание. Это одно из самых привлекательных свойств объектно-ориентированных языков (после поддержки абстракции), отличающее их от традиционных языков с абстрактными типами данных.