Продолжаем разбирать основные принципы объектно-ориентированного программирования. В предыдущих постах мы уже поговорили о наследовании и инкапсуляции. Сегодня рассмотрим еще один принцип — абстракцию.
Абстракция как принцип ООП подразумевает выделение только самых важных методов и полей объекта, при этом все детали внутренней специфической реализации скрыты. В таком подходе разработчик создает некоторый интерфейс, абстрактный класс, который описывает только необходимые извне свойства.
Чем помогает абстракция?
1. Упрощает работу с кодом. Код становится более структурированным и понятным для восприятия
2. Позволяет обезопасить реализации. Все специфические детали реализации скрыты от внешнего воздействия. Это позволяет их сохранить в первозданном виде и снизить вероятность проблем по месту использования
3. Дает возможность безопасно масштабировать проект. Абстракция позволяет снизить зависимость некоторых модулей кода, что упрощает его расширение
Чтобы еще лучше понять абтракцию, можно провести аналогию со стиральной машиной — человек выбирает режим кнопками на панели, а машина уже самостоятельно пошагово выполняет тот или иной заданный алгоритм.
Подведем итог в виде простого примера реализации абстракции в Dart-коде.
У нас есть задача создать абстракцию оплаты и две реализаци — оплаты по карте и наличными. В самом простом виде получим такой результат.
/// Абстрактный класс — интерфейс оплаты
abstract class Payment {
void pay(double amount);
}
/// Реализация оплаты картой
class CardPayment implements Payment {
@override
void pay(double amount) {
final fee = _calculateFee(amount);
print(
'Оплата $amount руб. с помощью карты. Комиссия составила $fee руб. Итого — ${amount + fee} руб.',
);
}
/// Расчет комиссии за оплату картой - 2%
double _calculateFee(double amount) {
return amount * 0.02;
}
}
/// Реализация оплаты наличными
class CashPayment implements Payment {
@override
void pay(double amount) {
print('Оплата $amount руб. наличными');
}
}
void main() {
final Payment payment1 = CardPayment();
final Payment payment2 = CashPayment();
payment1.pay(
500,
); // Оплата 500 руб. с помощью карты. Комиссия составила 10 руб. Итого — 510 руб.
payment2.pay(200); // Оплата 200 руб. наличными
}
❤️ — если было полезно
