Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Лекция



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

Модуль 7. объектно-ориентированное программирование ( ооп )

  • 7.1 Понятие класс а
  • 7.2 Тип объект
  • 7.3 Инкапсуляция
  • 7.4 Наследование
  • 7.5 полиморфизм
  • 7.6 Домен

Идеи ООП:

  • Инкапсуляция (Есть данные -> выделяем действия над этими данными);

  • Наследование (Не будем вносить изменение в рабочий код. Делаем надстройки над рабочим функционалом);

  • Полиморфизм (Использование объектов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта);

  • Организация взаимодействия между объектами; перенесение взаимодействия объектов из физического мира в программирование:

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

Основу ООП описана в книге «Объектно-ориентированный анализ и проектирование с примерами приложений», Гради Бучем

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

7.1 Понятие класса в ООП.

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

Отношения между классами:

  • Наследование – на основе одного класса, мы строим новый класс, путем добавления новых характеристик и методов.

  • Использование – один класс вызывает методы другого класса.

  • Представление (наполнение) – это когда один класс содержит другие классы.

  • Метакласс – класс, существующий для создания других классов.

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

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

Рассмотрим картинку, приведенную ниже. Объявлен класс Student, у которого есть переменные name и rollNo, а также методы setName() и setRollNo() для установки этих значений. На основе этого класса создано несколько объектов: Jenna, John, Maria, James. У каждого объекта, то есть студента, есть name и rollNo, но они разные.

Рассмотрим как создать класс в языке Java. Упрощенная общая форма определения класса:

   Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

Опишем класс для объекта Box (коробка). У коробки есть три главные характеристики: ширина, высота и глубина, описанные с помощью переменных:

  Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Класс и взаимоотношение между классами можно смоделировать в виде UML диаграммы

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

а так же с помощью Диаграммы Венна или кругов Эйлера

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Схематичное изображение наследования классом B класса А с помощю диаграмы Венна (или Диаграммы Эйлера)

7.2 Понятие Тип объект в ООП.



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

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

Категории объектов:

  • Реальные объекты – абстракция фактического существующего объекта реального мира.

  • Роли – абстракции цели или назначения человека, части оборудования или организации.

  • Инциденты – абстракция чего-то происшедшего или случившегося (наводнение, скачёк напряжения, выборы). -

  • Взаимодействия – объекты получаемые из отношений между другими объектами (перекресток, договор, взятка). -

  • Спецификации – используется для представления правил, критериев качества, стандартов (правила дорожного движения, распорядок дня).

Отношения между объектами:

  • Отношения использования (старшинства) - каждый объект включается в отношения. Может играть 3 роли:

    • Активный объект– объект может воздействовать на другие объекты, но сам не поддается воздействию (воздействующий).
    • Пассивный объект – объект может только подвергаться управлению, но не выступает в роли воздействующего (исполнитель).
    • Посредники – такой объект может выступать в роли воздействующего, так и в роли исполнителя (создаются для помощи воздействующим). Чем больше посредников тем легче модифицировать программу.
  • Отношения включения – один объект включает другие объекты.

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

  Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

Создание объектов класса представляет собой двух этапный процесс:

  1. Объявление переменной типа класса. Эта переменная не определяет объект. Она является лишь переменной, которая может ссылаться на объект:
    Вох myBox;​
  2. Создание объекта. С помощью оператора new динамически (то есть во время выполнения) резервируется память для объекта и возвращается ссылка на него:
    myBox = new Вох();​

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

 Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен 

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

 Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен 

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

Состояние – один из возможных вариантов формы объекта.

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

Индивидуальность – сущность объекта, отличающая его от других объектов.

Модель состояний Мура состоит:

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

Категории объектов:

  • Реальные объекты – абстракция фактического существующего объекта реального мира.
  • Роли – абстракции цели или назначения человека, части оборудования или организации.
  • Инциденты – абстракция чего-то происшедшего или случившегося (наводнение, скачёк напряжения, выборы).
  • Взаимодействия – объекты получаемые из отношений между другими объектами (перекресток, договор, взятка).
  • Спецификации – используется для представления правил, критериев качества, стандартов (правила дорожного движения, распорядок дня).

Отношения между объектами:

  • Отношения использования (старшинства) - каждый объект включается в отношения. Может играть 3 роли:

    • Активный объект– объект может воздействовать на другие объекты, но сам не поддается воздействию (воздействующий).
    • Пассивный объект – объект может только подвергаться управлению, но не выступает в роли воздействующего (исполнитель).
    • Посредники – такой объект может выступать в роли воздействующего, так и в роли исполнителя (создаются для помощи воздействующим). Чем больше посредников тем легче модифицировать программу.
  • Отношения включения – один объект включает другие объекты.



7.3 Поняние Инкапсуляция в ООП.



Одним из главных свойств ООП является инкапсуляция - замыкание в общей оболочке (Object…end) всех составляющих описания. При этом поля оказываются глобальными для методов данного объекта, т.к. у полей и методов общая область действия, то совпадение имен полей и формальных параметров методов не допустимо. Блоки-методы вынесены за описание типа объект. Имена блоков-методов, принадлежащих разным типам могут совпадать. Даже при совпадении имен заголовки методов будут различны, т.к. состоят из префикса (имени типа) и имени метода.
Доступ к полям объектов из вне можно принудительно ограничивать. Для этого группа полей в описании объекта заключается в скобки Private Public. После этого поля окажутся доступными лишь методам данного модуля.

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

7.4 Наследование.



Примитивные объекты не используются как програмные модули, а используются в качестве носителей общих свойств и методов. Такие объекты называют родительскими. Объекты основанные на родительских называют дочерними. Родительский тип не используемый для описания переменных называется абстрактным. Тип потомок наследует все поля типа отца. В их числе все поля унаследованные отцом, если у него есть предки. Увеличение числа полей у потомка необязательно. Наследоваться также могут и методы, но выборочно. Описание типа потомка имеют отличительную деталь - имя типа отца:
<имя типа потомка>=object(<имя типа отца>)
С увеличением сложности объектов увеличивается число действий, которое можно заменить построением нового метода, причем имена методов создаются так, как если бы объекты не имели между собой родственной связи. Одинаковое обозначение функционально-подобных методов упрощает не только восприятие системы объектов, но и программирование.
Важной деталью использования наследования в программах является применение присваивания объектам значений объектов. Присваивание A:=B допустимо, если A и B - однотипны, A - предок B или для каждого поля A есть соответствующее поле в B.

Наследование – создание нового класса на основе старого.

Три схемы наследования – приватное, публичное, протектное. Об этом говорит сайт https://intellect.icu . По умолчанию, наследование происходит приватным.

  Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

B obj;
/* приватное наследование
а не наследуется. c, b, f- приватные, d - протектная, g - публичная
извне можно получить доступ только к g (интерфейсу). G имеет доступ к d,c,b,f. F имеет доступ к b,a
происходит смена интерфейса F на G

протектное наследование
а не наследуется. c - приватная, b,d,f - протектные, g - публичная
-''-.
смена интерфейса, но в данном случае интерфейс Ф БУДЕТ ДОСТУПЕН к классам, наследующимся из класса Б

публичное наследование
все члены сохраняют свой уровень доступа базового класса
а не наследуется.
c - приватная, b,d - протектные, f,g - публичные.
интерфейс ДОПОЛНЯЕТСЯ.
*/

В производном классе можно определить такой же метод как в базовом – одно имя, один список параметров, один тип возврата. Метод в производном классе будет доминировать над методом базового класса.

В каких случаях использовать наследование?

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

Выделение общей базы (в порядке приоритета): ВСЕГДА выделяется класс, если есть общая схема использования. Сходство между набором операций (над объектами разных классов выполняются одинаковые операции). Совершенно разный функционал и разное использование, но могут быть выделены операции, имеющие единую реализацию. Желательно выделять базу даже в том случае, когда объекты разных классов фигурируют вместе в «дискуссиях по проекту» (когда возможно в дальнейшем может проявиться общность классов).

Расщепление класса: два подмножества операций класса используются в разной манере (в разных областях программы, домена). Группы операций имеют несвязанную реализацию. Один и тот же класс фигурирует в разных, не связанных между собой частях – лучше этот класс разделить.

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

 Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен 

Также, иерархия наследования при МН может быть достаточно сложной. Введем понятие «прямой базы» - от которой НЕПОСРЕДСТВЕННО наследуется новый класс, и «косвенной базы» - прямая база прямой базы и так далее, we need to go deeper. Прямая база может использоваться один раз (: public A, public A низя!), а вот косвенная – сколько угодно. Тем не менее, желательно, чтобы база входила только один раз. Для этого используется «виртуальное наследование». Если подобъект класса был создан, идет проверка на это, и еще раз он не создается.

  Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

? Виртуальные методы Базовый класс может выполнять объединяющую функцию - обладать набором свойств, присущих объектам производных классам. Функционал общий, однако выполняется по разному (трамвай ездит только по рельсам, а автобус – не только). Методы должны реализовывать производные классы, а базовый задает только их интерфейс. Было решено, что указатель на элемент ЛЮБОГО класса преобразуется к указателю на элемент его базового; в базовом классе метод описывается через virtual – будут создаваться «таблицы соответствия». Жрет время и ресурсы (нужно спуститься по таблице), но мы получаем свободу подменить одно понятие другим. НЕ ИДЕНТИЧНО доминированию – при доминировании могут вызываться методы базовых классов, а при виртуальности – методы производного.

  Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

7.5 Полиморфизм.

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

Полиморфизм – использование объектов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Существует принципиально разных типа полиморфизма:

  • ситуативный - функция описывает разные реализации (возможно, с различным поведением) для ограниченного набора явно заданных типов и их комбинаций.
  • параметрический код написан отвлеченно от конкретного типа данных и поэтому свободно используется с любыми новыми типами данных;
  • полиморфизм подтипов – позволяет функции, выполняющейся на одном типе Z, корректно выполняться на аргументах типа J, являющегося подтипом Z.

Полиморфизм предполагает определение класса или нескольких классов для родственных объектных типов так, что каждому классу отводится своя функциональная роль. Методы одного класса обычно наделяются общим именем. В ситуации когда необходимо сложный метод использовать в нескольких объектах и различия в поведении объектов минимальны, возможно создание смежного сложного метода с вынесением различий в сменные подчиненные методы. Такой метод называется конструктивным полиморфизмом. Осуществляется эта идея созданием виртуальных сменных методов. В заголовке такого метода присутствует слово virtual, а для их подключения к общему методу - обращение к конструктору - блоку со специальным заголовком.
constructor <имя блока> (<список формальных параметров>)
К конструктору надо обращаться для каждого объекта использующего виртуальные методы.
Задача: тип kom - сын типа pozicia представляет закрашенные квадраты с длиной стороны raz (в пикселах). Наследуемые поля x, y являются координатами центра квадрата. Процедура kom.zoom увеличивает (уменьшает) объект если аргумент znak>0 (znak<=0). Длина raz изменяется на 2*delt, где delt - еще один аргумент.

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

Многие языки программирования поддерживают использование полиморфизма. Этот процесс позволяет повторно использовать правила и программный код во всем приложении. Не все языки программирования поддерживают полное полиморфное поведение, но большинство из них поддерживают основную концепцию. Все настоящие языки OOP, включая Java®, .net и C++®, поддерживают более продвинутые подходы и методы.

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

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

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

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

Полиморфизм, понятие абстрактного класса. Дружественные связи.

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

 Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Все члены класса А имеют доступ ко всем членам класса Б. Можно ограничить доступ: чтобы только определенный метод был другом класса Б. Этот вариант более правилен – при изменении класса Б в А нужно изменять только один метод.

 Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Дружба – не наследуется и не транзитивна. Если от класса Б породить другой класс, то для него класс А уже не будет другом. Если класс А дружит с классом С, то класс Б не дружит с С.

7.6 Понятие домен и доменный объект в ООП

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

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

Термин доменный объект (англ. domain object) буквально переводится на русский язык как «объект [предметной] области», однако этот термин русскоязычными программистами используется только в контексте создания программного обеспечения (в то время как в бизнес-моделировании может использоваться термин бизнес-объект (англ. business object)). Термин объект предметной области является наиболее общим.

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

Основные принципы ООП

  • абстрагирование
  • инкапсуляция
  • модульность
  • иерархия

Дополнительные принципы:

  • типизация
  • параллелизм
  • устойчивость

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

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

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

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Модульность позволяет хранить абстракции раздельно.

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Абстракции образуют иерархию.

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

Тип — точная характеристика некоторой совокупности однородных объектов, включающая структуру и поведение.

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Строгая типизация предотвращает смешивание абстракций.

Параллелизм — это свойство, отличающее активные объекты от пассивных.

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

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

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

Устойчивость — способность объекта сохранять свое существование во времени и/или пространстве (адресном, в частности при перемещении между узлами вычислительной системы). В частности, устойчивость объектов может быть обеспечена за счет их хранения в базе данных.

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Сохраняемость поддерживает состояние и класс объекта в пространстве и во времени.

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

Объектно-ориентированное программирование ООП, Основные термины Класс, объект, домен

Ивар Якобсон

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

Объект — осязаемая сущность (tangible entity) — предмет или явление (процесс), имеющие четко выраженные границы, индивидуальность и поведение.

Любой объект обладает состоянием, поведением и индивидуальностью.

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

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

Индивидуальностьэто свойства объекта, отличающие его от всех других объектов.

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

Объект в JavaScript создается с помощью функции Object.create. Эта функция из родителя и опционального набора свойств создает новую сущность. Пока что мы не будем беспокоиться о параметрах.

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

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

Класс (class) — это группа данных и методов(функций) для работы с этими данными. Это шаблон. Объекты с одинаковыми свойствами, то есть с одинаковыми наборами переменных состояния и методов, образуют класс.

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

var s = new String();

Деструктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).

Атрибут — поименованное свойство класса, определяющее диапазон допустимых значений, которые могут принимать экземпляры данного свойства. Атрибуты могут быть скрыты от других классов, это определяет видимость атрибута: рublic (общий, открытый); private (закрытый, секретный); protected (защищенный).

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

Дескриптор — это атрибут объекта со связанным поведением (англ. binding behavior), т.е. такой, чье поведение при доступе переопределяется методами протокола дескриптора.

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

Метод — это функция или процедура, принадлежащая какому-то классу или объекту.

Различают простые методы и статические методы (методы класса):

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

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

В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:

  • открытый (public) интерфейс — общий интерфейс для всех пользователей данного класса;
  • защищенный (protected) интерфейс — внутренний интерфейс для всех наследников данного класса;
  • закрытый (private) интерфейс — интерфейс, доступный только изнутри данного класса.

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

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

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

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

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

Компонент представляет собой физическую реализацию проектной абстракции и может быть: компонентом исходного кода (cpp-шник); компонентом времени выполнения (dll, ActiveX и т. п.); исполняемый компонентом (exe-шник). Компонент обеспечивает физическую реализацию набора интерфейсов. Компонентная разработка (component-based development) представляет собой создание программных систем, состоящих из компонентов (не путать с объектно-ориентированным программированием (ООП).

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

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

Пакет является:

-средством организации модели в процессе разработки, повышения ее управляемости и читаемости;

-единицей управления конфигурацией.

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

Вместо заключения

Многие программисты не понимают сути объектно-ориентированного программирования (ООП). и к томуже не понимают что у ооп есть недостатки.
В частности, в статьях про ООП утверждается, что


"С++ очень прост в том смысле, что классы С++ повторяют описание объектов реального мира. "


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

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


ПОВЕДЕНИЕ И СОСТОЯНИЕ в ООП

Более развернуто, класс объектов (в понимании ООП) используют, если … у некоторой сущности есть поведение, зависящее от внутреннего состояния этой сущности.
Что значит «у сущности есть состояние»? Давайте разберемся.
У экземпляра сущности есть набор собственных данных — это очевидно. В чем отличие от обычной записи (структуры)?
Прежде всего, состояние подразумевает, что часть данных в сущности используются «для себя», для реализации собственного поведения. Если сущности «нечего скрывать», то она вырождается в обыкновенную запись данных. Более того, понятие «состояния» является более строгим, чем просто «дополнительный набор данных». Оно предполагает некоторую связанность, взаимозависимость этих внутренних данных. Состояние может быть корректным и некорректным. А кто может это понять? Внешний наблюдатель? Нет, только сама сущность. Таким образом, состояние скрыто не просто так, оно защищено от повреждения некомпетентным пользователем сущности.

Теперь уже проясняется, что такое «поведение» сущности. Это когда сущность реализует какой-то функционал, сохраняя корректность состояния.
Давайте какой-нибудь простой пример возьмем. Есть товар: наименование, цена за единицу, остаток на складе. Это объект ООП?
Подумайте прежде чем читать дальше.

Если не накладывать никаких ограничений на его характеристики — нет. Состояния не возникает.
Мы можем заносить любые значения. Скрывать нечего.
Давайте введем ограничения — остаток не может быть отрицательным, а цена обязана быть положительной.

А теперь?

Может теперь внешний пользователь произвольно менять данные в товаре? Очевидно, нет. У нашего товара появилось поведение — уменьшение остатка означает «забрать товар в определенном количестве» и забрать больше чем остаток — нельзя.

Заметили, что произошло? Мы ввели ограничения, то есть внесли некий смысл в природу свойств сущности. И сразу же появилось осмысленное поведение — «внести товар», «забрать товар».

Другой пример. Предположим в программе требуется динамическая загрузка модулей. Есть состояние — набор уже загруженных модулей. И поведение легко просматривается — «загрузить модуль», «выгрузить модуль». К чему этот пример? К тому, что никакой связи с объектами в реальном мире здесь и в помине нет.

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

Вот и все. Можно называть это инкапсуляцией. А можно и не называть. Можно долго рассуждать на тему наследования. А можно просто понять, что «наследование» — это способ расширения поведения объекта.

Главное — понять, что ООП нужно программисту, чтобы контролировать сложность разработки. А не для того, чтобы «отражать объекты реального мира».

Абстракция и полиморфизм не имеют прямого отношения к ООП. Как ни странно.
Любая процедура или функция являются абстракцией. Любая. Вот объявление:

Эта функция является абстракцией. Она реализует сортировку. Абстрактно. Мы не знаем как.
Но на выходе будет отсортированный массив. Абстракция есть, а где тут ООП? Нету ООП. Ни объектов, ни классов.

Теперь я объявил указатель sort. И могу ему присвоить такую функцию:

void quick_sort(int* array, int size)

или такую:

void bubble_sort(int* array, int size).

Возник полиморфизм. Указатель на функцию остался прежним. Но теперь за одним и тем же указателем на функцию стоят разные алгоритмы.

А где ООП? ООП нету. Потому что это даже не C++, это C. В котором нету классов. А абстракция и полиморфизм достигнуты.

Хм: Для ООП не обязательно иметь какие-то там классы ;)

Берем обычный C, делаем структуры с указателями на функции, договариваемся первым аргументом всегда передавать указатель на this и не обращаться к членам структуры, не являющимся указателями на функции, иначе, чем через этот this. Чем не ООП?

В python, например, нельзя спрятать данные (по крайней мере без особых ухищрений) - он не является ООП языком?

Вот именно. Я как раз об этом :-) Я же нигде вообще ни строчки ни написал о том, что C++ — это обязательно ООП. А все остальное — якобы нет.

ООП — это не возможности языка. НЕТ! Это архитектура приложения, способ моделирования предметной области. При котором используется разделение на сущности по принципу, описанному в статье.

Возможности языка могут облегчать применение принципов ООП, могут не мешать, а могут усложнять применение этих принципов. Но принципы от этого не меняются.

Я могу на C++ сделать «плохой» класс. Который нарушает принцип согласованного изменения состояния.

А могу на C или на Питоне реализовать «правильный» ООП. Или даже на ассемблере. Я выделю сущности и не позволю изменять их состояние извне.

Основная мысль моей статьи не о возможностях компиляторов.

А о ситуации, когда программист, использующий ООП, размышляет — «нужен тут класс (объектов) или не нужен».

Если есть состояние с поведением — нужен, иначе — не нужен.

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

Вау!! 😲 Ты еще не читал? Это зря!

К сожалению, в одной статье не просто дать все знания про объектно-ориентированное программирование. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое объектно-ориентированное программирование, введение в ооп, термины ооп, полиморфизм, класс, домен в ооп, ооп и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Объектно-ориентированное программирование ООП

создано: 2014-10-09
обновлено: 2024-11-14
223



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Объектно-ориентированное программирование ООП

Термины: Объектно-ориентированное программирование ООП