Hey Leute,
Wie dem Titel zu entnehmen geht es bei meiner Frage um Clean Code. Um genauer zu sein um den Teil der losen Kopplung im Roten Grad.
Leider fehlt mir noch der Sinn hinter dem ganzen. Aber lasst mich mal meine Ansicht an Hand eines Beispiels erklären:
Ich möchte mehrere Tiere (Warum auch immer) in einem Programm abbilden. Nehmen wird den Hund, die Katze und die Maus. Alle Tiere sind in der Lage zu Fressen. Ich könnte mir nun eine Klasse Tier schreiben, in der ich die Methode eat() unterbringe. In dieser Methode befindet sich ein Algorithmus, der mit Hilfe von vorgefertigten Variablen errechnet, wie lange das jeweilige Tier essen muss, bis es satt ist.
Diese Klasse wird von allen Tieren geerbt und aufgerufen sobald es ums essen geht.
Mit einem Interface könnte ich die Tiere zwar dazu bringen die Methode eat() anzunehmen, doch müsste ich diese, da sie ja nur abstract ist, in jedem Tier noch einmal ausformulieren.
Möchte ich diese nun ändern muss ich das beim Interace in jeder Tierklasse machen und bei der Vererbung nur in einer.
Ich habe mir schon einiges durchgelesen doch habe ich noch keinen wirklichen Vorteil der losen Kopplung gefunden (oder verstanden)
Ich hoffe hier kann ein wenig Licht ins dunkel der losen Kopplung gebracht werden.
Wie dem Titel zu entnehmen geht es bei meiner Frage um Clean Code. Um genauer zu sein um den Teil der losen Kopplung im Roten Grad.
Für die Wiederverwendung von Funktionalität kennt die Objektorientierte Programmierung (OOP) zwei sehr bekannte Kandidaten: Die Vererbung (whitebox – reuse) und die Komposition (blackbox – reuse). Verwendet man Funktionalität wieder durch das Ableiten von einer Klasse, so ist die Subklasse abhängig von der Elternklasse. Dies macht ein System in vielen Fällen unnötig komplex, schlechter testbar und erschwert das Austauschen von Funktionalität zur Laufzeit. CCD hat für das korrekte Ableiten das Liskov Substitution Prinzip (LSP) bereit, das es dabei zu befolgen gilt.
Bei der Komposition verwendet eine Klasse eine andere. Verwendet man dazu eine klar definierte Schnittstelle, fördert das die Entkopplung. Auch können verschiedene Implementationen einfach ausgetauscht werden. Bevor man sich also der Liskov Substitution stellt, fordert Favour Composition over Inheritance, sich die Frage zu stellen, ob man der Komposition nicht Vorrang geben kann.
„Because inheritance exposes a subclass to details of its parent’s implementation, it’s often said that ‚inheritance breaks encapsulation„. (Gang of Four 1995:19)
Leider fehlt mir noch der Sinn hinter dem ganzen. Aber lasst mich mal meine Ansicht an Hand eines Beispiels erklären:
Ich möchte mehrere Tiere (Warum auch immer) in einem Programm abbilden. Nehmen wird den Hund, die Katze und die Maus. Alle Tiere sind in der Lage zu Fressen. Ich könnte mir nun eine Klasse Tier schreiben, in der ich die Methode eat() unterbringe. In dieser Methode befindet sich ein Algorithmus, der mit Hilfe von vorgefertigten Variablen errechnet, wie lange das jeweilige Tier essen muss, bis es satt ist.
Diese Klasse wird von allen Tieren geerbt und aufgerufen sobald es ums essen geht.
Mit einem Interface könnte ich die Tiere zwar dazu bringen die Methode eat() anzunehmen, doch müsste ich diese, da sie ja nur abstract ist, in jedem Tier noch einmal ausformulieren.
Möchte ich diese nun ändern muss ich das beim Interace in jeder Tierklasse machen und bei der Vererbung nur in einer.
Ich habe mir schon einiges durchgelesen doch habe ich noch keinen wirklichen Vorteil der losen Kopplung gefunden (oder verstanden)
Ich hoffe hier kann ein wenig Licht ins dunkel der losen Kopplung gebracht werden.