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

Полиморфизм[]

Полиморфи́зм — возможность объектов с одинаковой спецификацией иметь различную реализацию.

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

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

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

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

внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именем методов и типами аргументов и их количеством);

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

Формы полиморфизма

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

Параметрические метод

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

Параметрические типы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Виртуальные функции

virtual function
A virtual function is a member function that you expect to be redefined
in derived classes. When you refer to a derived class object using a pointer or a
reference to the base class, you can call a virtual function for that object and
execute the derived class’s version of the function.
Virtual functions ensure that the correct function is called for an object,
regardless of the expression used to make the function call.
What is the difference between struct and class?
There are few differences:

  1. All members of struct are public.
  2. Default inheritance for struct is public, where as for class the default inheritance is private.
What is the difference between a virtual function and a non-virtual function?
Virtual attribute for a functions assumes that its body will be possibly overridden
in the derived class. Non-virtual function is always called from the class
where it is defined.
virtual destructor
A virtual destructor ensures that, when delete is applied to a base class pointer
or reference, it calls the destructor implemented in the derived class,
if an implementation exists.
It looks like regular virtual function.Дальнейший разговор переводится на объяснение работы виртуальных функций.
pure virtual function
This is function which has abstract specifier (=0;).
This function does not have implementation.
We mean implementation of the function will be made into derived classes.
If class has at least one pure virtual function it is abstract class.
When and why should you avoid a multiple inheritance.
What are the good examples of MI usage?

На этот и следующий вопросы гораздо веселее отвечать имея при себе ручку и
листок бумаги, чтобы нарисовать классический ромбик из 4-х классов.
You should avoid so called diamond structure where a class derives from several
base classes which, in turn, have common base class.
Good example of MI is an ATL which is based on the idea of MI.
«inline» function
«inline» keyword before name of the function allows the
compiler to insert a copy of the function body into each place the function is
called. Therefore, the size of the code is increasing, but speed of execution
is also increasing.

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

Объектно-Ориентированное Программирование (ООП) является одной из наиболее популярных парадигм в мире промышленной разработки программного обеспечения. Из других парадигм программирования следует выделить – структурное программирование (основной представитель этого направления – это язык C) и функциональное программирование (к этой группе относятся языки Haskell, F#, Clojure).

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

Выделяют три основных “столпа” ООП- это инкапсуляция, наследование и полиморфизм.

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

Инкапсуляция предполагает два основных момента:

  • сокрытие деталей реализации;
  • связывание данных и методов для их обработки в одном месте.

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

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

Наследование – это концепция, которая предполагает, что один класс может наследовать функции и данные другого класса. Класс, от которого производится наследование называется родительским или базовым классом, класс который наследует – наследником. Отношение между классом наследником и базовым классом можно определить словом “является”.

Например, представим, что у нас есть базовый класс Фигура, и этот класс содержит только одно свойство – Цвет. Тогда про класс Круг – наследник класса Фигура, можно сказать так: Круг “является” Фигурой. Чего нельзя сказать про отношение между Автомобилем и Двигателем, т.е. Автомобиль не является Двигателем. Это означает, что создание иерархии наследования, в которой Автомобиль – это неследник от Двигателя было бы ошибочной (такой тип отношений назвается композиция).

Полиморфизм

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

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

Расширенные концепции ООП в Java

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

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

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

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

Хорошим примером инкапсуляции может быть реализация авторизации. Поля имени пользователя и пароля будут объявлены как закрытые. Для этих данных будут реализованы общедоступные методы.

Упрощённо: поля, содержащие данные, являются частными, а общедоступные методы предоставляют интерфейс для доступа к этим полям.

Наследование в Java

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

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

Наследование поддерживает возможность повторного использования, что очень важно в объектно-ориентированном программировании. Это может помочь нам обновить определённые части нашего Java-кода без изменения его основных атрибутов. This Ключевое слово в Java используется для обозначения экземпляра текущего класса

This Ключевое слово в Java используется для обозначения экземпляра текущего класса.

Подобным образом super ключевое слово в Java используется для ссылки на члены суперкласса изнутри непосредственного подкласса.

Полиморфизм в Java

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

Упрощённо: полиморфизм относится к одному и тому же объекту, проявляющему разные формы и поведение.

Хорошим примером может быть класс, в Shape котором есть getArea() метод для поиска области различных форм. У класса Shape будет только один общедоступный метод getArea().

Тогда у нас могут быть классы, расширяющие этот Shape класс, например, Rectangle и Circle классы. Каждый класс будет реализовывать getArea() метод по-разному. Давайте посмотрим, как это будет выглядеть с помощью следующего кода:

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

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

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

S: принцип единственной ответственности

SRP: разделение класса, отличного от SRP

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

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

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

Мартин объяснил это тем, что «у класса должна быть только одна причина для изменения». Здесь «причина» в том, что мы хотим изменить единственную функциональность, которую преследует этот класс. Если мы не хотим, чтобы эта единственная функция изменялась, мы никогда не изменим этот класс, потому что все компоненты класса должны иметь отношение к этому поведению.

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

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

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

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

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

Выполнение

Давайте посмотрим на пример того, как можно применить SRP, чтобы сделать наш RegisterUserкласс более читабельным.

Приведённая выше программа не соответствует SRP, потому что RegisterUserвыполняет три разных задачи: регистрирует пользователя, подключается к базе данных и отправляет электронное письмо.

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

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

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

История развития

Основа ООП была заложена в начале 1960-х годов. Прорыв в использовании экземпляров и объектов был достигнут в MIT с PDP-1, и первым языком программирования для работы с объектами стал Simula 67. Он был разработан Кристен Найгаард и Оле-Джохан Даль в Норвегии с целью создания симуляторов. Они работали над симуляциями взрыва кораблей и поняли, что могут сгруппировать корабли в различные категории. Каждому типу судна было решено присвоить свой собственный класс, который должен содержать в себе набор уникальных характеристик и данных. Таким образом, Simula не только ввела понятие класса, но и представила рабочую модель.

Термин «объектно-ориентированное программирование» был впервые использован Xerox PARC в языке программирования Smalltalk. Понятие ООП использовалось для обозначения процесса использования объектов в качестве основы для расчетов. Команда разработчиков была вдохновлена проектом Simula 67, но они спроектировали свой язык так, чтобы он был динамичным. В Smalltalk объекты могут быть изменены, созданы или удалены, что отличает его от статических систем, которые обычно используются. Этот язык программирования также был первым, использовавшим концепцию наследования. Именно эта особенность позволила Smalltalk превзойти как Simula 67, так и аналоговые системы программирования.

Simula 67 стала новаторской системой, которая впоследствии стала основой для создания большого количества других языков программирования, в том числе Pascal и Lisp. В 1980-х годах объектно-ориентированное программирование приобрело огромную популярность, и основным фактором в этом стало появление языка С++

Концепция ООП также имела важное значение для разработки графических пользовательских интерфейсов. В качестве одного из самых ярких примеров можно привести структуру Cocoa, существующую в Mac OS X

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

Некоторые из них — Fortran, BASIC, Pascal. На тот момент многие программы не были разработаны с учетом ООП, что было причиной возникновения некоторых проблем совместимости. “Чистые” объектно-ориентированные языки программирования не обладали многими функциями, необходимыми программистам. Для решения этих проблем ряд исследователей предложили несколько новых языков программирования, созданных на основе принципов ООП с сохранением других, необходимых программистам, функций. Среди наиболее ярких примеров можно выделить Eiffel, Java, .NET. Даже в серьезных веб-разработках используются языки программирования, основанные на принципах ООП — PHP (у нас вы можете пройти курс ООП в PHP), Python, Ruby. По мнению экспертов, в ближайшие несколько десятилетий именно объектно-ориентированный подход будет оставаться основной парадигмой в развитии программирования

Общие принципы модели стали применяться во многих современных языках программирования. Некоторые из них — Fortran, BASIC, Pascal. На тот момент многие программы не были разработаны с учетом ООП, что было причиной возникновения некоторых проблем совместимости. “Чистые” объектно-ориентированные языки программирования не обладали многими функциями, необходимыми программистам. Для решения этих проблем ряд исследователей предложили несколько новых языков программирования, созданных на основе принципов ООП с сохранением других, необходимых программистам, функций. Среди наиболее ярких примеров можно выделить Eiffel, Java, .NET. Даже в серьезных веб-разработках используются языки программирования, основанные на принципах ООП — PHP (у нас вы можете пройти курс ООП в PHP), Python, Ruby. По мнению экспертов, в ближайшие несколько десятилетий именно объектно-ориентированный подход будет оставаться основной парадигмой в развитии программирования.

Понятие «класс» в ООП

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

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

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

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

Наследование[]

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

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

Простое наследование:

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

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

Множественное наследование

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.

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

Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

Класс

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

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

  • наследования;
  • ассоциации;
  • агрегации.

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

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

В Object Pascal описывается следующим образом:

ClassName = class(SuperClass)

private

{ использование элементов ограничивается только пределами модуля }

{ здесь указываются поля }

strict private

{ спецификатор доступа стал доступным с выходом Delphi 2007, обозначает то же, что и private }

protected

{ элементы могут использоваться внутри ClassName или при наследовании }

public

{ }

published

{ элементы доступны всем, они отображаются в Object Inspector’e }

end;

Здесь SuperClass — предок, от которого происходит наследование.

Для C++ создание выглядит так:

class MyClass: public Parent

{

public:

MyClass(); // конструктор

~MyClass(); // деструктор

protected:

private:

};

В этом примере Parent является предком, если таковой имеется. Спецификаторы private, public, protected обозначают то же самое, что в предыдущем примере на Паскале. Также мы видим конструктор, деструктор, доступные для любой части программы. У C++ все элементы по умолчанию являются private, соответственно, это можно не указывать.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Объявление переменной типа класса. Эта переменная не определяет объект. Она является лишь переменной, которая может ссылаться на объект:

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

    myBox = new Вох();​

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

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

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

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

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

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

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

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

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

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

Плюсы и минусы объектно-ориентированного программирования

Плюсы

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

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

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

Минусы

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

Абстракция

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector