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

ООП моделирует систему как взаимодействие объектов с состоянием, поведением и контрактами. Цель не в максимальном количестве классов, а в локализации правил и изменений.

Карта

interface PricePolicy {
    Money calculate(Cart cart);
}
 
final class Checkout {
    private final PricePolicy policy;
 
    Checkout(PricePolicy policy) {
        this.policy = policy;
    }
}

Checkout зависит от контракта, а конкретную политику можно заменить. Это одновременно композиция, инкапсуляция и subtype polymorphism.

Быстрая проверка

Всегда ли наследование означает хороший дизайн? Нет, подтип обязан сохранять контракт родителя.

Инкапсуляция равна private-полям? Нет, поля лишь инструмент; главное — защищённые инварианты и небольшой API.

Что даёт полиморфизм? Клиент работает с контрактом, не выбирая реализацию вручную.