Введение в объектно-ориентированный дизайн с Java

Тимур Машнин, 2022

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

Оглавление

* * *

Приведённый ознакомительный фрагмент книги Введение в объектно-ориентированный дизайн с Java предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Основные понятия

Объектно-ориентированный подход зародился в программировании в середине прошлого века.

Первым объектно-ориентированным языком был Simula (Simulation of real systems — моделирование реальных систем), разработанный в 1960 году исследователями Норвежского вычислительного центра.

В 1970 году Алан Кей и его исследовательская группа в Xerox PARK создали персональный компьютер Dynabook и первый чистый объектно-ориентированный язык программирования — Smalltalk для программирования Dynabook.

В 1980-х годах Грэди Буч опубликовал документ под названием «Объектно-ориентированный дизайн», в котором в основном был представлен дизайн для языка программирования Ada. В последующих изданиях он расширил свои идеи до полного объектно-ориентированного метода проектирования.

В 1990-х годах Coad включил поведенческие идеи в объектно-ориентированные методы.

Другими значительными нововведениями были методы моделирования объектов Object Modelling Techniques (OMT) Джеймса Рамбо и объектно-ориентированная программная инженерия Object-Oriented Software Engineering (OOSE) Ивара Джекобсона.

С появлением первых компьютеров появились языки программирования низкого уровня.

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

Дальнейшая эволюция языков программирования привела к появлению языков высокого уровня, что позволило отвлечься от системы команд конкретного типа процессора.

При этом происходило смещение от программирования деталей к программированию компонентов, развитие инструментов программирования и возрастание сложности программных систем.

Также развивался подход или стиль написания программ.

В начале использовалось процеду́рное программи́рование, при котором последовательно выполняемые операторы собирались в подпрограммы.

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

Как следствие возрастания сложности программного обеспечения появилось структу́рное программи́рование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков.

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

Событи́йно-ориенти́рованное программи́рование — парадигма программирования, в которой выполнение программы определяется событиями — действиями пользователя, сообщениями других программ и потоков, и событиями операционной системы.

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

В 1960-х годах двумя наиболее популярными языками программирования были COBOL и Fortran.

Эти языки следовали императивной парадигме, которая разбивала большие программы на более мелкие программы, называемые подпрограммами, которые похожи на методы в Java.

В 1960-х, время обработки компьютера было дорогостоящим.

Поэтому было важно максимизировать производительность обработки.

Это достигалось за счет наличия глобальных данных, так как они все располагались в одном месте в памяти компьютера для программы.

С глобально доступными переменными все подпрограммы могли получить к ним доступ для выполнения необходимых вычислений.

Однако при этом возникали некоторые проблемы.

С глобальными данными возможно, что изменения в данных могут иметь побочные эффекты для программы.

Иногда подпрограммы запускались с теми данными, которые были не такими, как ожидалось.

Необходимость лучшего управления данными привела к изменениям в императивном программировании и появлению таких языков, как Algol 68 и Pascal в 1970-х годах.

Была введена идея локальных переменных.

Подпрограммы назывались процедурами, которые могут содержать вложенные процедуры.

И каждая процедура могла иметь свои собственные переменные.

Алгол 68 и Паскаль поддерживают понятие абстрактного типа данных, который является типом данных, который определен программистом и не встроен в язык.

Абстрактный тип данных представляет собой, по существу, сгруппированную связанную информацию, которая обозначается типом.

Это был способ организации данных.

Разработчики могли писать свое программное обеспечение с использованием этих типов аналогично встроенным типам языков.

Имея переменные в разных областях видимости, можно было разделить данные на разные процедуры.

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

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

И задачи становились все более сложными.

Это означало, что программное обеспечение становилось настолько большим, что, имея только один файл для всей программы, программу становилось трудно поддерживать.

Появились новые языки, такие как C и Modula-2, которые предоставили средства для организации программ и позволяли разработчикам легко создавать несколько уникальных копий своих абстрактных типов данных.

Теперь программы могли быть организованы в отдельные файлы.

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

Но при этом еще существовали проблемы, которые не решались этими языками программирования.

Эти языки не позволяли абстрактному типу данных наследовать от другого типа данных.

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

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

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

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

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

Файлы классов заменили стандартные файлы в C и Modula-2.

Каждый класс определяет тип со связанными данными и функциями.

Эти функции также известны как методы.

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

Это позволяет разделять данные и как ими можно манипулировать в отдельные классы.

Объектно-ориентированное программирование стало преобладающей парадигмой программирования.

Популярные современные языки, такие как Java, C ++ и C #, основаны на объектах.

Объектно-ориентированный анализ (OOA) — это процедура определения требований к программному обеспечению и разработка спецификаций программного обеспечения с точки зрения объектной модели программной системы, которая включает в себя взаимодействующие объекты.

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

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

В традиционных методах анализа два аспекта — функции и данные — рассматриваются отдельно.

Основными задачами объектно-ориентированного анализа (OOA) являются:

— Идентификация объектов

— Организация объектов путем создания диаграммы объектной модели

— Определение внутренних объектов или атрибутов объекта

— Определение поведения объектов, т. е. действий объектов

— Описание взаимодействия объектов

Объектно-ориентированный дизайн (OOD) предполагает реализацию концептуальной модели, созданной при объектно-ориентированном анализе.

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

Детали реализации обычно включают в себя:

Реструктуризацию данных класса при необходимости,

Реализацию методов, то есть внутренних структур данных и алгоритмов,

Реализацию управления и реализацию ассоциаций.

Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на объектах (имеющих как данные, так и методы), целью которых является использование преимуществ модульности и многоразового использования.

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

Важными чертами объектно-ориентированного программирования являются:

— Подход снизу вверх в разработке программы.

— Программы организованы вокруг объектов, сгруппированных по классам.

— Акцентирование на данных с методами при работе с данными объекта.

— Взаимодействие объектов через функции.

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

Объектная модель, используемая объектно-ориентированной парадигмой, визуализирует элементы в программном приложении с точки зрения объектов.

И понятия объектов и классов неразрывно связаны между собой и составляют основу объектно-ориентированной парадигмы.

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

Физическое существование — это например, клиент, автомобиль и т. д.

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

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

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

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

Создание объекта как члена класса называется экземпляром.

Таким образом, объект является экземпляром класса.

Класса состоит из набора атрибутов для объектов, которые должны быть созданы из класса.

Разные объекты класса имеют разные значения атрибутов. И атрибуты часто называются данными экземпляра класса.

И класс состоит из набора операций, которые отображают поведение объектов класса.

Операции также называются функциями или методами.

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

Благодаря инкапсуляции внутренние детали класса могут быть скрыты извне.

И инкапсуляция позволяет доступ к элементам класса извне только через интерфейс, предоставляемый классом.

Как правило, класс разработан таким образом, что его данные (атрибуты) могут быть доступны только через методы класса и изолированы от прямого внешнего доступа.

Этот процесс изоляции данных объекта называется скрытием данных.

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

Передача сообщений позволяет осуществлять все взаимодействия между объектами.

И передача сообщения по существу включает вызов метода класса.

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

Существующие классы называются базовыми классами, родительскими классами или суперклассами, а новые классы называются производными классами, дочерними классами или подклассами.

Подкласс может наследовать атрибуты и методы суперкласса при условии, что суперкласс позволяет это.

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

Наследование определяет отношение «is-a».

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

Полиморфизм позволяет объектам с разными внутренними структурами иметь общий внешний интерфейс.

И полиморфизм особенно эффективен при реализации наследования.

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

В процессе обобщения общие характеристики классов объединяются для формирования класса на более высоком уровне иерархии, т. е. подклассы объединяются для формирования обобщенного суперкласса.

Специализация — это обратный процесс обобщения.

Здесь отличительные особенности групп объектов используются для формирования специализированных классов из существующих классов.

Можно сказать, что подклассы являются специализированными версиями суперкласса.

Ссылка представляет собой соединение, через которое объект взаимодействует с другими объектами.

Через ссылку один объект может вызывать методы или перемещаться по другому объекту.

Ссылка изображает взаимосвязь между двумя или более объектами.

Ассоциация — это группа ссылок, имеющих общую структуру и общее поведение.

Ассоциация изображает взаимосвязь между объектами одного или нескольких классов.

И ссылка может быть определена как экземпляр ассоциации.

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

Унарное отношение связывает объекты одного и того же класса.

Бинарное отношение связывает объекты двух классов.

Тройное отношение связывает объекты трех или более классов.

Мощность бинарной ассоциации обозначает количество экземпляров, участвующих в ассоциации. Существует три типа коэффициента мощности, а именно:

Один-к-одному. Один объект класса A связан с одним объектом класса B.

Один-ко-многим. Один объект класса A связан со многими объектами класса B.

Многие-ко-многим. Объект класса A может быть связан со многими объектами класса B, и, наоборот, объект класса B может быть связан со многими объектами класса A.

Агрегация или композиция — это взаимосвязь между классами, при которой класс может состоять из любой комбинации объектов других классов.

Она позволяет размещать объекты непосредственно внутри тела других классов.

Агрегация называется отношением “part–of” или “has–a”, с возможностью навигации от целого к частям.

Агрегатный объект — это объект, состоящий из одного или нескольких других объектов.

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

И любой подход к разработке программного обеспечения проходит через следующие этапы:

Это анализ, дизайн и реализация.

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

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

На этапе объектно-ориентированного анализа, формулируется проблема, определяются пользовательские требования, а затем модель строится на основе объектов реального мира.

Анализ дает модели то, как должна функционировать желаемая система и как она должна развиваться.

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

Объектно-ориентированный дизайн включает в себя два основных этапа, а именно: дизайн системы и дизайн объектов.

На этапе системного дизайна разрабатывается полная архитектура желаемой системы.

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

Конструирование системы выполняется на основе как модели анализа, так и предлагаемой архитектуры системы.

Здесь акцент делается на объектах, входящих в систему, а не на процессы в системе.

На этапе дизайна объектов разрабатывается модель на основе как моделей, разработанных на этапе анализа, так и архитектуры, разработанной на этапе дизайна системы. При этом определяются все необходимые классы.

Устанавливаются ассоциации между классами и определяются иерархии классов.

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

Создаются базы данных и определяются конкретные требования к оборудованию.

После того, как создается код, он проверяется с использованием специализированных методов для выявления и устранения ошибок в коде.

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

И объектно-ориентированная система основывается на двух категориях свойств.

Это основные свойства, которые объектно-ориентированная система обязана иметь:

— Абстракция.

— Инкапсуляция.

— Модульность.

— Иерархия.

И дополнительные свойства, которые полезны, но не являются неотъемлемой частью объектной модели:

— Типизация.

— Параллельность.

— Сохраняемость.

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

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

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

Благодаря инкапсуляции внутренние детали класса могут быть скрыты извне.

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

Модульность — это процесс разложения задачи (программы) на набор модулей, чтобы уменьшить общую сложность проблемы.

И модульность связана с инкапсуляцией.

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

Иерархия — это ранжирование или упорядочение абстракции.

Через иерархию система может состоять из взаимосвязанных подсистем, которые могут иметь свои собственные подсистемы и т. д.

До тех пор, пока не будут достигнуты наименьшие компоненты уровня.

Иерархия использует принцип «разделяй и властвуй».

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

Двумя типами иерархий являются:

Иерархия «IS-A». Она определяет иерархическую взаимосвязь в наследовании, в которой из суперкласса может быть выведено несколько подклассов, которые могут снова иметь подклассы и т. д.

И иерархия «PART-OF» — определяет иерархическую взаимосвязь в агрегации, посредством которой класс может состоять из других классов.

Согласно теории абстрактного типа данных, тип является характеристикой набора элементов.

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

Типизация — это применение понятия о том, что объект является экземпляром одного класса или типа.

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

Два типа типизации — это строгая типизация — здесь операция над объектом проверяется во время компиляции.

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

Операция проверяется только во время выполнения.

Параллельность в операционных системах позволяет одновременно выполнять несколько задач или процессов.

Большинство систем имеют несколько потоков, при этом некоторые активные, а некоторые ждут процессор, некоторые приостановлены и некоторые завершены.

Системы с несколькими процессорами допускают одновременные потоки управления; но системы, работающие на одном процессоре, используют соответствующие алгоритмы для обеспечения равного времени процессора для потоков, чтобы обеспечить параллелизм.

В объектно-ориентированной среде существуют активные и неактивные объекты.

Активные объекты имеют независимые потоки управления, которые могут выполняться одновременно с потоками других объектов.

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

Объект занимает пространство памяти и существует в течение определенного периода времени.

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

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

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

Оглавление

* * *

Приведённый ознакомительный фрагмент книги Введение в объектно-ориентированный дизайн с Java предоставлен нашим книжным партнёром — компанией ЛитРес.

Купить и скачать полную версию книги в форматах FB2, ePub, MOBI, TXT, HTML, RTF и других

Смотрите также

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