Полиморфизм

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

 

 


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

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

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

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

Полиморфизм

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

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

Абстракция данных

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

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

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

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

ООА, ООД, ООП.

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

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

OOP – Объектно-ориентированное программирование. 
Сижу я. Решаю, что “ConectionPool <>—— ClientProcessor” (агрегирование), при этом ClientProcessor будет наследником того-то и того-то… Рисую UML, показываю тимлиду. Кивает – делаю.

SOLID

SOLID (сокр. от англ. single responsibility, open-closed, Liskov substitution, interface segregation и dependency inversion) в программировании — мнемонический акроним, введённый Майклом Фэзерсом (Michael Feathers) для первых пяти принципов, названных Робертом Мартином  в начале 2000-х , которые означали пять основных принципов объектно-ориентированного программирования и проектирования.

 

 

 

Принципы

Избавиться от “признаков плохого проекта”[4] помогают следующие пять принципов SOLID:

Инициал Представляет[1] Название[4], понятие
S SRP[5]
Принцип единственной ответственности (The Single Responsibility Principle)
Существует лишь одна причина, приводящая к изменению класса.
O OCP[6]
Принцип открытости/закрытости (The Open Closed Principle)
«программные сущности … должны быть открыты для расширения, но закрыты для модификации.»
L LSP[7]
Принцип подстановки Барбары Лисков (The Liskov Substitution Principle)
«объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.» См. также контрактное программирование.
I ISP[8]
Принцип разделения интерфейса (The Interface Segregation Principle)
«много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»[9]
D DIP[10]
Принцип инверсии зависимостей (The Dependency Inversion Principle)
«Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»[9]

 

Признаки плохого проекта

  1. Закрепощённость: система с трудом поддается изменениям, поскольку любое минимальное изменение вызывает эффект “снежного кома”, затрагивающего другие компоненты системы.
  2. Неустойчивость: в результате осуществляемых изменений система разрушается в тех местах, которые не имеют прямого отношения к непосредственно изменяемому компоненту.
  3. Неподвижность: достаточно трудно разделить систему на компоненты, которые могли бы повторно использоваться в других системах.
  4. Вязкость: сделать что-то правильно намного сложнее, чем выполнить какие-либо некорректные действия.
  5. Неоправданная сложность: проект включает инфраструктуру, применение которой не влечёт непосредственной выгоды.
  6. Неопределенность: проект трудно читать и понимать. Недостаточно четко выражено содержимое проекта.

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

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

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

Абстракция

Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик.[1]

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

Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.[1]

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

Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.[1]

Полиморфизм

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

 

Класс

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

Объект

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

 

 

 

Прототип

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

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

 

Сущность:

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

 

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

 

 

 

 

todo архитипы контейнеры