Файл: Применение объектно-ориентированного подхода при проектировании информационной системы (Основные инструменты ООП и понятийный аппарат).pdf
Добавлен: 13.05.2023
Просмотров: 335
Скачиваний: 2
СОДЕРЖАНИЕ
Глава 1. Теоретические основы объектно-ориентированного подхода
1.1. Основные инструменты ООП и понятийный аппарат
1.2. Отличие объектно-ориентированного стиля от процедурного
1.3. История развития объектно-ориентированного программирования
Глава 2. Практические аспекты проектирования информационных систем на ООП
2.1. Методология объектно-ориентированного анализа и проектирования
2.2. Унифицированный алгоритм действий при разработке информационных систем
2.3. Проектирование информационной бизнес-системы “Предприятие”
2.4. Проектирование систем управления базами данных с помощью ООП
2.5. Пример кода для проектирования датчиковой информационной системы в тепличном хозяйстве
Введение
На данном этапе развития вычислительных технологий можно с уверенностью сказать, что для решения многих задач применение объектно-ориентированного подход будет самым оптимальным, целесообразным решением. Проектирование информационных систем – ответственная и важная задача, в которой главным камнем преткновения является процесс коммуникации между разработчиком и специалистом.
Именно важность, современность и повсеместное использование объектно-ориентированного метода обуславливают актуальность представленного исследования.
Цель работы: изучить особенности применения объектно-ориентированного подхода к проектированию информационных систем.
Цель работы последовательно раскрывается посредством следующих задач:
- Дать характеристику понятийному аппарату выбранной темы;
- Дать характеристику основным инструментам объектно-ориентированного подхода;
- Выявить отличия объектно-ориентированного стиля от процедурного;
- Проследить историю развития объектно-ориентированного программирования;
- Охарактеризовать достоинства и недостатки метода;
- Описать методологию объектно-ориентированного анализа и проектирования;
- На практических примерах разобрать особенности проектирования информационных систем с применением объектно-ориентированного стиля.
Объектом исследования являются принципы работы объектно-ориентированных языков, предметом – их применение в проектировании информационных систем.
Теоретическая ценность работы заключается в синтезе подходов, классификаций, дефиниций, в обозначении главных вех развития объектно-ориентированного стиля, а также в использовании недавно переведённых зарубежных публикаций.
Практическая значимость исследования заключается в предложении конкретных проектных решений под предлагаемые задачи.
Работа состоит из двух глав и девяти параграфов. В первой главе рассматриваются теоретические аспекты выбранной темы: понятийный аппарат, инструментарий, основные преимущества и недостатки метода.
Вторая глава посвящена анализу практического применения ООП в проектировании информационных систем.
При написании исследования были использованы разнообразные источники: статьи и публикации из онлайн-порталов, монографии учёных и исследователей, нормативные правовые акты, учебники, исторические справки.
Глава 1. Теоретические основы объектно-ориентированного подхода
1.1. Основные инструменты ООП и понятийный аппарат
Перед началом исследования необходимо разобраться с основными терминами и понятиями.
Итак, объектно-ориентированный подход подразумевает использование так называемой объектной декомпозиции. В условиях этой декомпозиции поведение изучаемой или генерируемой системы описывается в контексте взаимодействия объектов.[1]
Легко попасть в семантическую ловушку, интерпретировав понятийный аппарат “обывательским”, бытовым способом, поэтому следует уточнить, что объектом здесь выступает элемент класса, а класс в свою очередь — это элемент, описывающий некий абстрактный тип данных. Класс включает в себя также реализацию (частичную или полную) упомянутого типа данных и, самое главное, детерминирует интерфейс своих экземпляров.
Что в рамках ООП называется абстракцией? Приведём простую аналогию. Во время дорожного движения водитель находится за рулём автомобиля. Эта транспортное средство имеет ряд определённых характеристик — качество краски, марка двигателя, тормозной путь, нумерация деталей под капотом.
Все эти характеристики существуют, но по факту водитель пользуется ограниченным набором функций — рулём, поворотниками, педалями etc. В приведённой аналогии эти наиболее значимые, актуальные элементы системы называются абстракциями. Соответственно, абстрагирование — это выделение значимых характеристик системы с умышленным пренебрежением вторичных, неактуальных для выполнения поставленной задачи.
Итак, в ООП существуют важнейшие компоненты: класс, объект и метод. В рамках прототипного программирования существуют бесклассовые объектно-ориентированные языки, но их сущность и применимость не будут затронуты в представленном исследовании.
Объекты в ООП активны, помимо чёткой внутренней структуры они обладают набором действий, которые описываются методами. Простейшим примером, иллюстрирующим иерархическое подчинение в системе класс-объект-метод, является система авторизации.
В ней стандартно имеется класс “пользователь”, на основе этого класса создаётся объект “Пользователь X”, где X — уникальный идентификатор, и следом X присваиваются некие методы, ассоциированные с данными этого пользователя.
Кроме того, приступая к исследованию объектного подхода необходимо прояснить значение важных понятий — полиморфизма, инкапсуляции и наследования.
Что такое инкапсуляция? В общих чертах это главный способ преодолеть сложности подхода. Объекты имеют развёрнутую структуру и множество деталей, необходимых для реализации методов. Однако множество этих элементов инкапсулируются в классе.[2]
Снаружи остаётся только интерфейс. Детали реализации скрываются, на поверхности мы видим просто интерфейс данного класса.
Следующий инструмент — это полиморфизм. Максимально упрощая, полиморфизм — это способность реализации объектов, обладающих одинаковым интерфейсом, но имеющих разные тип и структуру.
Некоторые специалисты трактуют понятие “полиморфизм” как способность одного объекта принадлежать нескольким классам, не потеряв при этом свою целостность.[3]
Наверное, самым главным инструментов является наследование. Наследование даёт объектно-ориентированному подходу возможность эволюционировать, трансформироваться, видоизменяясь под нужды и требования новых технологий.
Под наследованием понимается преемственность функциональности при замене одного класса другим. От родительского класса “эволюционирует” производный, приобретая новые функции и теряя часть старых, отживших своё. Важно утверждение, в соответствии с которым с точки зрения интерфейса каждый производный класс полностью реализует интерфейс родительского класса.
1.2. Отличие объектно-ориентированного стиля от процедурного
Существуют два основных стиля программирования — объектно-ориентированный и процедурный. Сложно продолжить исследование, связанное с ООП, не определив, что отличает его от процедурного стиля.
Процедурно-ориентированный подход подразумевает первоначальное формулирование задачи и последующие шаги на пути к её решению:
- Путём пошагового уточнения конкретизируются глобальные задачи. Они разбиваются на маленькие подзадачи до тех пор, пока каждую отдельную подзадачу нельзя будет непосредственно реализовать с помощью конкретной процедуры;
- Разрабатываются конкретные процедуры для практической реализации подзадач;
- Процедуры объединяются в более сложные до тех пор, пока программа не начнёт функционировать соответствующим образом.
Что происходит в объектно-ориентированном программировании? Чаще всего мы имеем дело с неким большим проектом, который физически неудобно или невозможно разбить на крошечные процедуры. В таком случае целесообразно использовать классы и методы. Классы предоставляют удобный, эффективный механизм для кластеризации методов.
Проведём простейшую аналогию: допустим, реализация проекта требует 2,000 функций и 100 классов. В среднем получается по 20 методов внутри одного класса, и, естественно, гораздо проще использовать именно объектно-ориентированный подход, потому что причину гипотетического искажения данных проще отыскать среди 20 классов, чем среди 2,000 процедур.
Некоторые авторы поспорят, что принцип разбиения функций на классы схож с модульной кластеризацией в процедурно-ориентированном стиле. Действительно, можно разбить программы на модули, и эти модули не будут прибегать к sharind data, как в случае с ООП. Коммуникация между модулями будет осуществляться с помощью вызова процедур, но это открывает серьёзную уязвимость в механизме инкапсуляции. Любое отклонение открывает доступ к данным из другого модуля![4]
Существует и иной, более весомый недостаток процедурного стиля. Объектно-ориентированный подход позволяет нам сгенерировать несколько объектов, обладающих одинаковыми функциями (одинаковым поведением), однако в процедурных языках копирование модулей невозможно.[5]
Допустим, мы достигли модульной инкапсуляции, объединив совокупность заказов вместе с прекрасным сбалансированным бинарным деревом, обеспечивающим быстрый доступ. И вдруг выясняется, что нужно иметь две такие совокупности: одну для текущих заказов, а другую — для выполненных. Нельзя просто дважды вызвать модуль, реализующий дерево заказов. Для этого нужно скопировать и переименовать все процедуры!
Классы не имеют таких ограничений.
Определив однажды класс, легко создать любое количество его экземпляров (в то время как модуль имеет только один экземпляр).
Подведя итоги, выделим основные преимущества объектно-ориентированного подхода:
- Повторное использование: Объект это логический объект у которого есть комплект свойств и методов и он может взаимодействовать с другими объектами.. Объект может быть абсолютно независимым или может зависеть от других объектов. Объект обычно создают для решения специфических поставленных проблем. Следовательно когда другие разработчики сталкиваются с похожими проблемами, они могут подключить ваш класс к своему проекту и использовать его не боясь что он нарушит процесс их разработки. Это позволяет избежать DRY, что расшифровывается как Don’t Repeat Yourself (не повторяйся). В процедурном или модульном программировании, повторное использование возможно только в совокупности.
- Рефакторинг: когда вам необходимо в проекте использовать рефакторинг, ООП предоставляем вам максимум преимуществ, так как все объекты это маленькие элементы и содержат свои свойства и методы как часть себя. Поэтому использовать рефакторинг относительно легко.
- Расширяемость: если вам необходимо расширять функциональность вашего проекта, вы можете достичь лучших результатов при помощи ООП. Одна из основных функциональностей ООП это расширяемость. Вы можете использовать рефакторинг объектов что бы добавить функциональность. Работая над этим, вы по прежнему можете сохранить.прежнюю совместимость объекта — следовательно вы можете прекрасно работать и с прежним кодом. Или же вы можете расширить объект и создать абсолютно новый, который будет содержать все необходимые свойства и методы родительского объекта от которого происходит новый, а потом уже добавить в него новые функции. Это называется “наследование” и это очень важная возможность ООП.[6]
- Поддержка: объектно-ориентированный код легче поддерживать так как он следует весьма жёстким соглашениям написания кода и пишется в самопоясняющейся форме. К примеру, когда разработчик дополняет, перерабатывает код, или отлаживает его, он может легко найти внутреннюю структуру кода и поддерживать код время от времени. Более того, когда в вашем окружении работает команда разработчиков ООП может быть лучшим решением так как вы можете распределять ваш код между членами команды, после разбития его на маленькие части. Эти маленькие части могут быть разработаны как отдельные объекты, следовательно разработчики могут работать практически независимо друг от друга. В конечном итоге объеденить все части в одно приложение не составит большого труда.
- Эффективность: Идея ООП в действительности была разработана для повышения эффективности и облегчения процесса разработки. Несколько шаблонов проектирования разработаны что бы создавать более эффективный и хороший код. Более того в ООП вы можете вы можете размышлять над вашими решениями в более удобной форме чем в процедурном подходе. Поскольку вы разбиваете вашу проблему на несколько маленьких проблем, и вы находите решение для каждой из них отдельно, большая проблема решается сама по себе.
1.3. История развития объектно-ориентированного программирования
В привычном нам смысле терминологию ООП начали применять с конца 1950 года. Разработчики искусственного интеллекта применяли термин “объект” к элементам Lisp, идентифицированным и обладающим собственными атрибутами.
Алан Кэй, пионер в области ООП, один из первопроходцев графических систем и выдающийся специалист по вычислительным технологиям, создал первый язык программирования, в котором использовался объектно-ориентированный подход.[7]
Этот язык Smalltalk-80 использовал уникальную на тот период технологию модификацию интегрированной среды через саму среду, именно тогда в MIT-среде появился термин “модификация поведения”.
Smalltalk-80 стал родоначальником таких объектно-ориентированных языков, как Ruby, Actor, Java и многие другие.
Особенностями этого языка была динамическая типизация, детерминирующая лаконичность системы. Динамическая типизация перекладывала верификацию операций на объекта-получателя, по сути освобождая компилятор от этой задачи.
Smalltalk-80 стал первым языком, позволяющим менять интегрированную среду внутри работающей системы, не прибегая к декомпиляции и перезагрузке.[8]
Новшеством также стало то, что в Smalltalk абсолютно всё от блоков, стеков и кода до памяти, чисел и определений классов являлось объектом, обладающим методом и состоянием.
Однако объекты как формализованный концепт появились в программировании ещё раньше, в 1960-х в Simula 67, модернизированной версии Simula I, языка программирования, ориентированного на дискретно-событийное моделирование.
Йохан Даль и К. Нюгорд, авторы Simela, разрабатывали свой язык под влиянием популярной тогда концепции записей-классов.
Язык содержал понятия объектов и классов а также, в порядке иерархического убывания, подклассов, виртуальных методов, вспомогательных программ и, в качестве элемента уникальной парадигмы, дискретно-событийное программирования.
Simula активно использовала технологию garbage collection, ранее внедрённую для Lisp. Сборка мусора автоматически определяет неакутальные для приложения объекты и удаляет их.
Однако до внедрения ООП в доминирующую методологию оставались годы, если не десятилетия. Только в 1990-х объектно-ориентированный подход начал активно поддерживать языки вроде С++, Delphi etc.[9]