Файл: Применения объектно-ориентированного подхода при проектировании информационной системы.pdf
Добавлен: 24.04.2023
Просмотров: 626
Скачиваний: 3
Тип- это область определения некой величины, т. е. Множество ее возможных значений и набор применимых операций. Тип может задаваться классом. Тип может определяться и не классом. Например, во многих объектно ориентированных языках программирования существуют простейшие типы данных, не являющиеся классами: целые числа, символы и т. д.
Важнейшими свойствами классов и их принципиальным отличием от абстрактных типов данных является наследование и полиморфизм.
1. Наследование классов.
Наследование — это отношение между классами, при котором один класс разделяет структуру или поведение одного, или нескольких других классов.
Прежде всего механизм наследования позволяет выделить общие части разных классов.
2. Полиморфизм.
Полиморфизмом называется возможность взаимодействия с объектом, не зная, к какому конкретному классу он относится.
При использовании полиморфизма используется знание интерфейса объекта, однако поведение конкретного объекта в ответ на полученное сообщение может быть различно в зависимости от конкретного класса этого объекта.
Наличие механизмов наследования и полиморфизма в объектной модели позволяет эффективно решать многие задачи разработки системы.
Итак, чтобы язык программирования можно было назвать объектно-ориентированным, то он должен удовлетворять следующие принципы:
-
- использует объекты, которые являются представлением абстракций предметной области; объекты реализуют различные операции, совокупность который образует интерфейс объекта; закрытые переменные образуют состояние объекта;
- каждому объекту поставлен в соответствие класс; существует множество объектов одного класса;
- классы могут реализовать механизмы наследования: наследование реализации и наследование интерфейсов.
III. Основные концепции объектно-ориентированного подхода
Основой объектно-ориентированной парадигмы является объектная модель. Эта модель состоит из следующих четырех главных элементов (при отсутствии одного из них модель не является объектно-ориентированной): абстракция, инкапсуляция, модульность, иерархия.
Кроме главных, существуют дополнительный элементы; контроль типов, параллелизм, персистентность.
1. Абстрагирование
Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко описывает его концептуальные границы с точки зрения наблюдателя. Абстракция концентрирует внимание на внешнем представлении объекта и позволяет отделить существенные особенности поведения от их реализации. Упрощенно можно утверждать, что абстракция — совокупность значимых свойств объекта.
Выбор правильной совокупности свойств объекта для заданной предметной области представляет собой главную задачу объектно-ориентированного проектирования. Многообразие процессов, явлений, объектов, субъектов и предметных областей порождает различные типы абстракций.
- Абстракция сущности. Объект, представляющий собой полезную модуль некой сущности в предметной области.
- Абстракция действия. Объект, состоящий из обобщенного множества операций, каждая из которых выполняет однотипные функции.
- Абстракция виртуальной машины. Объект, группирующий операции, которые либо вместе используются на более высоком уровне управления, либо сами используют некоторый набор операций более низкого уровня.
- Произвольная абстракция. Объект, включающий в себя набор операций, не имеющих друг с другом ничего общего.
Наиболее часто применяется абстракция сущности.
2. Инкапсуляция
Абстракция и инкапсуляция дополняют друг друга. В центре внимания абстракции находится наблюдаемое поведение объекта, а инкапсуляция отвечает за внутреннюю реализацию, которая и определяет внешнее поведение. Инкапсуляция реализуется за счет сокрытия информации о деталях функционирования объекта. Объект представляется своего рода «черным ящиком», предоставляя во внешнюю среду инструменты для ввода информации и определенным образом реагируя на изменения внешней среды. Очевидно, что в языках высокого уровня подобное поведение обеспечивается за счет открытых методов объекта.
Инкапсуляция определяет четкие границы между различными абстракциями. Для того чтобы абстрактное представление сущности предметной области эффективно выполняло свои функции, необходимо, чтобы реализация абстракции была инкапсулирована. Это означает, что объект состоит из двух частей: реализация и интерфейс. Интерфейс класса определяет только внешнее представление объекта, описывая абстракции. Поведения всех объектов данного класса. Реализация класса содержит как представление абстракции, так и механизмы, определяющие требуемое поведение объекта.
Инкапсуляцию можно определить следующим образом:
Инкапсуляция — это процесс разделения элементов абстракции, определяющих структуру и поведение, инкапсуляция предназначена для изоляции контрактных обязательств абстракции от реализации.
3. Модульность
Разделение программы на отдельные модули позволяет существенно снизить сложность программ. Но, гораздо важнее, что при модульной декомпозиции возникает множество детально спроектированных, определенных и хорошо документированных интерфейсов. Данные особенности, присущие модульным программам, реализуются неявно.
Чем класс отличается от модуля? В некоторых языках программирования высокого уровня понятие модуль и класс тесно связаны, но эта связь очевидна только в простых проектах. Сложные программные системы неизбежно требуют разделения этих понятий. Модуль — это фрагмент программы, который компилируются отдельно, независимо от всех остальных. Но при этом модули в рамках одного проекта связаны между собой. По отдельности они представляют собой лишь ограниченное абстрактное представление подмножества сущностей предметной области и особенностей их взаимодействия.
Определение оптимальной стратегии модульной декомпозиции представляет собой такую сложную задачу, как и выделение оптимального набора абстракций. При этом следует понимать, что существуют хорошо изученные, распространенные задачи, в которых разделение на модули можно реализовать с использованием устоявшихся шаблонов. При интенсивном развитии информационных технологий все больше областей деятельности охватываются автоматизацией, поэтому возникают нетривиальные задачи, модульная декомпозиция в которых может быть представлена как сложный процесс с обратной связью. К таким относятся большинство задач с повышенными требованиями к устойчивости, безотказности, например, системы военного назначения.
Модули служат физическими контейнерами, содержащими классы и объекты. В объектном программировании модульность предполагает физическую упаковку классов.
При практической реализации модульной декомпозиции можно руководствоваться правилами:
-
- Конечной целью декомпозиции программы на модули является снижение затрат на программирование. Разделение на модули не носит механический характер: каждому классу — отдельный модуль.
- Структура каждого модуля должна быть простой для понимания, допускать независимую реализацию других модулей и не влиять на их поведение. Изменение проекта, состоящего из множества модулей, должно существенно упроститься по сравнению с аналогичной реализацией проекта в одномодульном варианте.
- Решение проблемы повторной компиляции модулей. Модули могут компилироваться независимо, но если при компиляции будут выявлены зависимости, то процесс компиляции может занять существенное время. Поэтому при программировании модулей необходимо ориентироваться на использование интерфейсов.
- Необходимо как можно больше скрывать детали реализации модуля. Данное определение связано с предыдущим, так как позволяет реализовать интерфейс, а затем постепенно наполнять модуль конкретной реализацией.
Модульность – это свойство системы, представленной отдельными,
цельными и слабосвязанными фрагментами (модулями).
Разделение системы на модули имеет важные последствия.
- Модули являются цельными и неделимыми структурными элементами программного обеспечения. Они характеризуются тем, что позволяют многократно использовать разработанный код. Модуль не только обеспечивает изоляцию кода, но и приводит к возможности повторного использования кода.
- При компиляции исходного кода модуля создаются отдельные сборки. При этом программист может столкнуться с ограничением на физический размер модуля. Динамика вызовов подпрограмм и размещение объявлений внутри модулей могут существенно влиять на локальность ссылок и на управление страницами виртуальной памяти.
При модульной декомпозиции проекта необходимо учитывать факторы, не являющиеся следствием технических или программных ограничений.
4. Иерархия
Абстракция – важный механизм, но количество абстракций (классов) в реальных приложениях может оказаться очень большим. Механизм инкапсуляции существенно снижает сложность программных систем, так как скрывает внутренние особенности реализации классов, позволяет разработчику сконцентрироваться на абстракции. Модульность позволяет организовать классы абстракций в виде согласованных групп.
Иерархия – это механизм для упорядочивания классов абстракций. При реализации и проектировании программных систем следует учитывать следующие виды иерархий: отношение между классами (иерархия «общее/частное») и отношение объектов (иерархия «целое/часть»).
Одиночное наследование. Данный вид наследования представляет собой вид иерархии, которая наиболее распространена. Данное отношение между классами основано на принципе «является» («is a»).
Именно данный вид наследования лежит в основе большинства объектных систем. Наследование может быть одиночным и множественным. Также выделяют наследование интерфейсов и наследование реализации.
При наследовании программист определяет иерархию классов. Каждый класс должен переопределять или расширять функционал базового класса. Каждый класс является абстракцией, поэтому перед реализацией иерархии требуется провести анализ отношений между сущностями предметной области.
В результате анализа и проектировании программной системы программист может выявить необходимость переноса функционала группы сущностей в один класс (суперкласс), который будет представлять все общее, характерное для всей группы. Поэтому часто указывается, что наследование – это отношение типа обобщение/специализация. Суперклассы предоставляют абстрактные интерфейсы (совокупность операций), а производные классы – специальные реализации, в которые добавляются, изменяются и даже скрываются поля и методы из базовых классов. Наследование позволяет существенно сократить исходный код приложения, сделать программы более читабельными. Пренебрежение иерархиями «общее/частное» может привести к «разбуханию» кода.
Без наследования все классы независимы. Каждый тип класса должен разрабатываться отдельно. В результате классы теряют общность, поскольку каждый программист реализует их методы по-своему. В этом случае согласованность классов системы может быть обеспечена только за счет скоординированной работы программистов.
Наследование позволяет создавать новые программы точно так же, как вводятся новые понятия – сравнивая новое с уже известным. Абстракция данных создает механизм, скрывающий методы и состояние объекта. Принцип наследования предполагает предоставление доступа и к состоянию, и к методам объекта, не прибегая к абстракции.
У любого класса обычно существуют два вида клиентов: объекты, выполняющие операции над экземплярами данного класса, и подклассы, наследующие свойства класса.
5. Контроль типов
Контроль типов – это механизм, контролирующий правила замены объектов различных типов.
Контроль типов ограничивает разработчика. Программист должен учитывать данный механизм при проектировании системы, но, одновременно, контроль типов позволяет разработчику избежать существенных проблем еще на этапе проектирования системы. Конкретный язык программирования может иметь сильный или слабый контроль типов, и даже совсем не иметь такого свойства, оставаясь объектно-ориентированным.
Строгий контроль позволяет использовать язык программирования для поддержки определенных проектных решений и позволяет справиться с нарастающей сложностью систем. Однако у строгого контроля типов есть обратная сторона. На практике она порождает семантические зависимости, при которых небольшое изменение интерфейса в базовом классе вынуждает повторную компиляцию всех его подклассов.
Преимущества, обеспечиваемые механизмом контроля типов:
1. Часто при отсутствии контроля типов программа может завершиться непредсказуемо, сто связано с отсутствием механизма выявления ошибок на этапе разработки.
2. Чаще всего, цикл разработки, включающий этапы редактирования, компиляции и отладки, является очень трудоемким. Автоматическое выявление ошибок на раннем этапе крайне желательно.
3. Системы с контролем типов оптимально подходят для создания библиотек программного кода, так как позволяют в таких системах можно просто реализовать процесс документирования.
4. Контроль типов позволяет оптимизировать работу компилятора.