Przysługa zdarza się, gdy obaj kandydaci się kwalifikują. Problem wskazany w pytaniu zawodzi na tym koncie, ponieważ ma on tylko opcję składu.
„Kompozycja mogłaby również użyć uogólnienia”. Czy to stwierdzenie ma dla nas sens? Jeśli nie, to nie jesteśmy jeszcze gotowi na przyjęcie zasady „przychylności”.
Dlatego preferujemy Composition, ponieważ Composition oferuje więcej możliwości rozszerzenia / elastyczności niż generalizacja. To rozszerzenie / elastyczność dotyczy głównie środowiska wykonawczego / elastyczności dynamicznej (co osiąga się dzięki połączeniu interfejsów i kompozycji).
Korzyści nie są natychmiast widoczne. Aby zobaczyć korzyści, musisz poczekać na kolejne nieoczekiwane żądanie zmiany. Tak więc w większości przypadków ci, którzy trzymali się uogólnienia, zawodzą w porównaniu z tymi, którzy przyjęli kompozycję (z wyjątkiem jednego oczywistego przypadku wspomnianego później). Stąd zasada. Z naukowego punktu widzenia, jeśli możesz skutecznie wdrożyć zastrzyk zależności, powinieneś wiedzieć, który z nich preferować i kiedy. Reguła pomaga w podjęciu decyzji, gdy nie jesteś pewien, który wybrać. Ponownie powinieneś być w stanie zobaczyć obie opcje w pierwszej kolejności, aby faworyzować jedną z nich.
Podsumowanie: Kompozycja: Sprzęganie jest redukowane przez tylko kilka mniejszych rzeczy, które podłączasz do czegoś większego, a większy obiekt po prostu wywołuje z powrotem mniejszy obiekt. Generalizacja: Z punktu widzenia interfejsu API innej firmy zdefiniowanie, że metoda może zostać zastąpiona, jest silniejszym zobowiązaniem niż zdefiniowanie, że można wywołać metodę (pewnie wygrana w przypadku Generalizacji). I nigdy nie zapominaj, że w kompozycji używasz również uogólnienia, z interfejsu zamiast dużej klasy. Niestety cały kredyt należy do składu.