Объектно ориентированное программирование понятие концепции

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

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

Вообще устроено все следующим образом: есть само объектно-ориентированное программирование. У него есть принципы. Из принципов объектно-ориентированного программирования следуют разобранные нам шаблоны GRASP (как вариант — SOLID принципы), из которых, в свою очередь, следуют шаблоны GoF. Из них же следует ряд интересных вещей, например, enterprise паттерны.

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

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

Таким образом, система представляется в виде набора объектов предметной области, которые взаимодействуют между собой некоторым образом. Каждый объект обладает тремя cоставляющими: идентичность (identity), состояние (state) и поведение (behaviour).

Состояние объекта — это набор всех его полей и их значений.

Поведение объекта — это набор всех методов класса объекта.

Идентичность объекта — это то, что отличает один объект класса от другого объекта класса. С точки зрения Java, именно по идентичности определяется метод equals.

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

Объектно-ориентированное программирование обладает рядом принципов. Представление об их количестве расходится. Кто-то утверждает, что их три (старая школа программистов), кто-то, что их четыре (новая школа программистов):

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

Вопреки мнению многих собеседующихся (а иногда и собеседуемых), инкапсуляция это не «когда все поля приватные». Инкапсуляция является фундаментальнейшим принципом проектирования ПО, ее следы наблюдаются на только на уровне микро-, но и на уровне макропроектирования.

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

Таким образом, получается, что если класс A обращается к полям класса B напрямую, это приводит не к тому, что «нарушается информационная безопасность», а к тому, что класс A завязывается на внутренне устройство класса B, и попытка изменить внутреннее устройство класса B приведет к изменению класса А. Более того, класс A не просто так работает с полями класса B, он работает по некоторой бизнес-логике. То есть логика по работе с состоянием класса В лежит в классе А, и когда мы захотим переиспользовать класс В, это не удастся сделать, ведь без кусочка класса А класс В может быть бесполезным, что приведет к тому, что класс В придется отдавать вместе с классом А. Экстраполируя это на всю систему, получается, что переиспользовать можно будет только всю систему целиком.

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

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

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

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

Полиморфизм

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

За самым садистским определением кроется возможность языка программирования для декомпозиции задачи и рефакторинга if’ов и switch’ей.

Источник

[Заметка] Основные понятия ООП

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

Основные концепции

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

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

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

SOLID

SOLID — аббревиатура пяти основных принципов проектирования классов в объектно-ориентированном программировании: Single responsibility, Open-closed, Liskov substitution, Interface segregation и Dependency inversion.

  • Single responsibility principle, принцип единственной обязанности, обозначает, что каждый объект должен иметь одну обязанность и эта обязанность должна быть полностью инкапсулирована в класс. Все его сервисы должны быть направлены исключительно на обеспечение этой обязанности.
  • Open-closed principle, принцип открытости-закрытости устанавливает следующее положение: программные сущности должны быть открыты для расширения, но закрыты для изменения. Существующий класс может быть изменён только для исправления ошибок, при изменении логики необходимо писать новый класс, который может наследоваться от первого.
  • Liskov substitution principle, принцип подстановки Барбары Лисков: «Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом.» Если есть класс A и отнаследованный от него класс B, если заменить все использования класса A на B, ничего не должно измениться в работе программы. Класс B должен лишь расширять функционал класса A.
  • Interface segregation principle, принцип разделения интерфейса говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе.
  • Dependency inversion principle, принцип инверсии зависимостей устанавливает правило, абстракции не должны зависеть от деталей, а детали должны зависеть от абстракций. Проще говоря, следует избавляться от композиции, заменяя её на агрегацию.

Агрегирование

В ООП под агрегировием подразумевают методику создания нового класса из уже существующих классов путём включения, называемого также делегированием. Об агрегировании также часто говорят как об «отношении принадлежности» по принципу «у машины есть корпус, колёса и двигатель». На базе агрегирования реализуется методика делегирования, когда поставленная перед внешним объектом задача перепоручается внутреннему объекту, специализирующемуся на решении задач такого рода. Существует два типа агрегирования:

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

Закон Деметры

Общее описание правила: Объект A не должен иметь возможность получить непосредственный доступ к объекту C, если у объекта A есть доступ к объекту B и у объекта B есть доступ к объекту C.

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

  • Собственно самого О.
  • Параметров М.
  • Других объектов, созданных в рамках М.
  • Прямых компонентных объектов О.
  • Глобальных переменных, доступных О, в пределах М.

Что такое шаблон проектирования?

Шаблон проектирования, он же паттерн (design pattern), в разработке программного обеспечения — повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.

Виды полиморфизма

Ad hoc (лат. «специально для этого») — вид полиморфизма, в котором полиморфная функция может работать с аргументами различного типа за счет переопределения. То есть одноименные функции с различными типами аргументов распознаются как разные функции.

func Foo(int $varName) < // Do some >func Foo(string $varName) < // Do some >

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

Полиморфизм подтипов — Полиморфизм включения (inclusion polymorphism) является обобщённой формализацией подтипизации и наследования. То есть функция умеет работать с конкретным типом и всеми его наследниками.

Источник

Читайте также:  Этапы разработки приложения калькулятор
Оцените статью