У об'єктно-орієнтованому програмуванні (ООП) розробники використовують класи для організації та структурування коду. Ці класи часто повинні взаємодіяти один з одним, і для досягнення цієї взаємодії ми можемо використовувати два основні концепти: наслiдкування та композицію.
Вибір правильного підходу є дуже важливим, оскільки це безпосередньо впливатиме на зрозумілість, підтримуваність і гнучкість нашого коду. Далі ми розглянемо детально наслiдкування та композицію, як вони працюють у Java, і в яких ситуаціях варто вибрати той чи інший підхід, зважаючи на компроміси, які вони пропонують.
Наcлідування
Наcлідування дозволяє класу брати на себе властивості та поведінку іншого класу. Створюється відношення є-це. Наприклад:
- Автомобіль є транспортним засобом.
- Собака є твариною.
- Коло є геометричною фігурою.
class Vehicle {
void start() {
System.out.println("Vehicle is starting...");
}
}
class Car extends Vehicle {
void drive() {
System.out.println("Car is driving...");
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.start();
myCar.drive();
}
}
Композиція
Композиція, з іншого боку, дозволяє класу мати об'єкти інших класів як атрибути, встановлюючи відношення має-це. Наприклад:
- Автомобіль має двигун.
- Комп'ютер має клавіатуру.
- Людина має серце.
class Engine {
public void start() {
System.out.println("The engine is starting.");
}
}
class Car {
private Engine engine;
public Car() {
this.engine = new Engine();
}
public void drive() {
engine.start();
System.out.println("The car is driving.");
}
}
Коли використовувати кожен підхід?
У середовищі агільної розробки, де вимоги постійно змінюються, наслiдування може стати менш підходящим вибором, оскільки воно вводить жорстку залежність між класами. Це може ускладнити адаптацію системи до нових вимог, особливо якщо ієрархія класів не була спроектована з самого початку з урахуванням гнучкості.
Більш того, будь-яка зміна в базовому класі може поширитися на підкласи, викликаючи небажані побічні ефекти, що ускладнюють підтримку.
З іншого боку, композиція є більш підходящою в таких динамічних умовах. Оскільки композиція ґрунтується на делегації та інтеграції поведінки через екземпляри інших класів, вона дозволяє будувати модульні та більш адаптовані системи. Це полегшує внесення змін, оскільки можна змінити або замінити компонент без впливу на інші, зберігаючи стабільність системи.
Пам'ятаєте принцип єдиної відповідальності (SOLID)? Ось це і є композиція: багато частин взаємодіють одна з одною, де кожна має лише одну і єдину задачу, яка є її причиною існування. Наcлідування, з іншого боку, може порушити принцип єдиної відповідальності, якщо воно не буде належним чином кероване.
Перекладено з: Herencia o Composición: Cual es la mejor técnica de diseño de clases?