Skip to content

Commit 8c073b3

Browse files
authored
Improve answer to composition vs aggregation question in oop.md (enhorse#176)
1 parent 5d1c117 commit 8c073b3

1 file changed

Lines changed: 42 additions & 3 deletions

File tree

oop.md

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,49 @@ __«имеет»__ подразумевает ассоциацию (агрега
363363
## В чем разница между _композицией_ и _агрегацией_?
364364
Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».
365365

366-
Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.
366+
_Композиция_ — вложенный объект не может существовать без владельца (владелец создает и уничтожает его):
367367

368-
>Например, книга состоит из страниц, и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция.
369-
В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация.
368+
```java
369+
class Engine {
370+
private final int horsepower;
371+
372+
Engine(int horsepower) {
373+
this.horsepower = horsepower;
374+
}
375+
}
376+
377+
class Car {
378+
private final Engine engine; // Engine живёт и умирает вместе с Car
379+
380+
Car(int horsepower) {
381+
this.engine = new Engine(horsepower); // Car сам создаёт Engine
382+
}
383+
}
384+
```
385+
386+
_Агрегация_ — вложенный объект существует независимо, передается извне:
387+
388+
```java
389+
class Driver {
390+
private final String name;
391+
392+
Driver(String name) {
393+
this.name = name;
394+
}
395+
}
396+
397+
class Car {
398+
private Driver driver; // Driver может существовать без Car
399+
400+
Car(Driver driver) {
401+
this.driver = driver; // Car получает Driver извне
402+
}
403+
}
404+
```
405+
406+
Коротко: если `new` внутри класса — композиция, если объект приходит снаружи — агрегация.
407+
408+
Предпочтительнее использовать агрегацию и внедрять зависимости через конструктор. Это автоматически делает код тестируемым и следует принципу Dependency Inversion из SOLID. Композицию стоит применять, когда есть чёткая причина "спрятать" создание объекта внутрь класса.
370409

371410
[к оглавлению](#ООП)
372411

0 commit comments

Comments
 (0)