Skip to content
Gallery
Theory for java developer
Share
Explore

icon picker
Program Design

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

ООП - Объектно-ориентированная идеология разрабатывалась как попытка связать поведение сущности с ее данными и проецировать объекты реального мира и бизнес-процессов в программный код. Задумывалось, что такой код проще читать и понимать человеком, т. к. людям свойственно воспринимать окружающий мир как множество взаимодействующих между собой объектов, поддающихся определенной классификации.
Время экономится не на стадии разработки, а на этапах поддержки (расширение, модификация, отладка и тестирование), то бишь в долгосрочной перспективе.
Однако, значительную часть жизненного цикла большинства современных проектов составляют именно поддержка и расширение. 
Инкапсуляция - Это способность класса объединять данные и методы (состояние и поведение) в единый объект через сокрытие реализации и выставления только тех методов которыми безопасно пользоваться (некий контракт). Для пресечения случайного доступа и сокращение зависимостей на полях и данных в других частях программы(low coupling).
Применяется для того чтобы нельзя было завязаться на полях или методах которые могут измениться (и удалиться), случайно изменить данные в классе нарушив логику работы во всех местах где были применены.
Полиморфизм - Это возможность работать с несколькими типами данных как с одним(являются производными его базового типа), при этом поведение каждого типа будет уникальным в зависимости от его реализации. Полиморфизм требует наследования или реализации интерфейса.
Пример: С разными классами работают как с одним.
Наследование - Это механизм, который позволяет создавать классы на основе других классов. Необходимо для того, что бы не дублировать ранее написанный код, а использовать его же, но с расширенными возможностями.
Все классы в мире java, косвенно или прямо, являются наследниками класса Object.
Наследоваться можно только от одного класса.
Связь между объектами в ООП:
Наследование (IS A / является) - Лев является Животным
Ассоциация, частные случаи - Композиция и Агрегация (HAS A / является частью) означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя.
Агрегация — отношение когда один объект является частью другого. Например Студент входит в разные группы, может быть частью других объектов.
Композиция — более «жесткое отношение, когда объект является частью другого объекта и не может принадлежать еще кому-то. Двигатель может быть и без машины, но не сможет быть в двух машинах одновременно.
Абстракция - Понятие которое оборачивает все 3 остальных, Абстракция - это выделение значимых свойств и отбрасывание второстепенных. Также сокрытие деталей реализации и предоставление простого интерфейса(точек доступа) взаимодействия со сложным механизмом.
Например Абстрактный класс используется как раз для выделения общей логики для классов наследников (общее поведение), а реализацию второстепенных деталей оставляем классам наследникам.
Пример автомобиль - много брендов и различий но у нас в голове всплывает какой-то общий образ с набором характеристик которым должны следовать все автомобили чтобы являться автомобилями.
Пример инкапсуляции для абстракции чтобы управлять сложной коробкой передач нам не нужно знать как она устроена внутри, достаточно иметь один рычаг(интерфейс, точку доступа) чтобы все работало, иначе можно что-то сломать если переключать передачи не через рычаг, а руками переставляя звездочки.

TDD / KISS / DRY...

TDD - Test Driven Development / Разработка через тестирование
DRY - Don’t Repeat Yourself / Не повторяйтесь
KISS - Keep It Simple, Stupid / Будь проще
BDD - Behavior Driven Development / Разработка через поведение Это легко читаемые человеком, не владеющим языками программирования, описания требований к продукту — как основа процесса тестирования. Другими словами, определяется DSL, потом составляется стандартный ограниченный набор фраз, описывающих поведение нужных элементов.
YAGNI - You Aren’t Gonna Need It / Вам это не понадобится Этот принцип прост и очевиден, но ему далеко не все следуют. Если пишете код, то будьте уверены, что он вам понадобится. Не пишите код, если думаете, что он пригодится позже.

SOLID

Принципы проектирования для создания логичной, гибкой и расширяемой архитектуры.
Single Responsibility – класс имеет только одну причину для изменения.
Open-closed – класс открыт для расширения и закрыт для изменения.
Liskov substitution – класс может быть заменен своим child (is a) который перенимает поведение.
Interface segregation – маленьких интерфейсов с 1-2 методами, чам один большой со всеми.
Dependency inversion – реализация зависит от абстракции. Контракт интерфейса – тогда класс можно менять пока не изменится контракт.

GRASP

Рекомендации проектирования, используемые для решения общих задач по назначению обязанностей классам и объектам.
High Cohesion (Низкая связанность). Сплоченность внутри модуля, говорит о том, модуль сфокусирован на решении одной узкой проблемы.(Сопряженность — cohesion, характеризует степень, в которой задачи, выполняемые модулем, связаны друг с другом). Следствием High Cohesion является Single Responsibility Principle — объект/модуль должен иметь лишь одну обязанность и причину изменений.
Low Coupling (Высокое зацепление). Модули должны быть независимы или слабо связанны друг с другом. Они должны иметь возможность взаимодействовать, но при этом как можно меньше знать друг о друге. При изменении одного модуля, не придется править другие или эти изменения будут минимальными. Чем слабее связанность, тем легче писать/понимать/расширять/чинить программу.
Нужно знать что такое есть но лучше сказать что предпочитаете более конкретные Design patterns.

Design patterns )

Creation Design Patterns (
)
Abstract Factory. Позволяет создавать объекты без указания их конкретного типа.
Builder. Используется для создания сложных объектов. Если у нас много конструкторов = анти-паттерн.
Factory Method. Создает объекты без указания точного класса, который нужно создать.
Prototype. Создает новый объект на основе существующего объекта.
Singleton. Гарантирует создание только одного экземпляра объекта.
Structural Design Patterns
Adapter. Позволяет двум несовместимым классам работать вместе, оборачивая интерфейс вокруг одного из существующих классов.
Bridge. Разделяет абстракцию так, чтобы два класса могли варьироваться независимо друг от друга.
Composite. Группирует объекты в один объект.
Decorator. Позволяет динамически расширять поведение объекта во время выполнения.
Facade. Предоставляет простой интерфейс к более сложному подлежащему объекту.
Flyweight. Уменьшает затраты на сложные модели объектов.
Proxy. Предоставляет заполнитель для интерфейса подлежащего объекта для контроля доступа, уменьшения затрат или упрощения.
Behavior Design Patterns
Chain of Responsibility. Delegates commands to a chain of processing objects.
Command. Creates objects which encapsulate actions and parameters.
Interpreter. Implements a specialized language.
Iterator. Accesses the elements of an object sequentially without exposing its underlying representation.
Mediator. Allows loose coupling between classes by being the only class that has detailed knowledge of their methods.
Memento. Provides the ability to restore an object to its previous state.
Observer. Is a publish/subscribe pattern which allows a number of observer objects to see an event.
State. Allows an object to alter its behavior when its internal state changes.
Strategy. Allows one of a family of algorithms to be selected on-the-fly at run-time.
Template Method. Defines the skeleton of an algorithm as an abstract class, allowing its sub-classes to provide concrete behavior.
Visitor. Separates an algorithm from an object structure by moving the hierarchy of methods into one object.
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.