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