Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Grundlagen der Programmierung: Codemetriken

Vererbungstiefe

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Mit der Vererbungstiefe können Sie einschätzen, wie gut Ihre Vererbungshierarchien sind. Evtl. stellt sich aber die Frage, wie gut Vererbung generell ist.
06:54

Transkript

Als eines der Haupt-Features der objektorientierten Programmiersprachen wird uns häufig die Vererbung verkauft. Tatsächlich kann diese einige Nachteile aufweisen und welche das sind und wie wir sie mit Hilfe der Vererbungstiefe und der Anzahl der Nachfolger analysieren, sehen Sie in diesem Video. Ausgehend von der UML hat sich etabliert, dass wir Klassen als Rechtecke darstellen. Besteht eine Abhängigkeit zwischen Klassen, wird dies über einen Pfeil dargestellt. Meine linke Klasse ist jetzt abhängig von meiner rechten Klasse. Vererbung stellt auch eine Form der Abhängigkeit dar. Dies wird in aller Regel durch einen geschlossenen Pfeil gekennzeichnet, während einfache Abhängigkeiten über einen offenen Pfeil gekennzeichnet werden. Hier haben wir es also mit einer einfachen Abhängigkeit zu tun. An dieser Stelle haben wir es mit Vererbung zu tun. Das Problem an dieser Darstellung ist, dass sie dem Umstand der Vererbung eigentlich nicht gerecht wird. Wir verwenden zwar die Funktionalität der rechten Klasse in der linken erneut, aber tatsächlich ist es so, dass durch die Vererbung die linke Klasse eine Übermenge der Funktionalität der rechten darstellt. Die erbende Klasse kombiniert somit die gesamte Funktionalität all der Klassen, von denen Sie erbt. Und dabei müssen wir in einer Sprache nicht mal Mehrfachvererbung als Feature zur Verfügung haben. Es reicht, wenn die Klasse, von der wir erben, ebenfalls von Klassen erbt. Das ist gefährlich, denn je weiter wir das Ganze jetzt treiben, desto mehr können sich Änderungen in den Basisklassen in unserer Klasse auswirken. Nehmen wir diese Klasse "ActionBarViewModel". Diese erbt von zwei Elementen, von "ReactiveObject" als Klasse und "IActionBarViewModel" als Schnittstelle, als Interface. Die Metrik, mit der wir eine solche Hierarchie, eine Vererbungshierarchie analysieren können, ist die "Depth of Inheritance". Für unser "ActionBarViewModel" beträgt diese nun 2. Die 2 kommt aber nicht dadurch zustande, dass sie eben von "ReactiveObject" und "IActionBarViewModel" erbt, sondern tatsächlich kommt diese nur zustande durch "ReactiveObject", denn wie es bei C# und Java üblich ist, erben alle Klassen von der "Object"-Klasse. Schnittstellen zählen demnach nicht in die "Depth of Inheritance" hinein, da sie nur vorgeben, wie die öffentliche Schnittstelle einer Klasse aufgebaut sein soll beziehungsweise die öffentliche Schnittstelle einer Methode. Sie geben aber nicht vor, wie diese implementiert sein soll. Sie haben damit keine direkte Auswirkung auf den Grad der Abhängigkeit zwischen Schnittstelle und implementierende Klasse. Wenn wir also eine solche Klassenhierarchie haben wie diese und wir betrachten die "Personen"-Klasse sowie die "Teacher"-Klasse, dann können wir deren Werte gegenüberstellen. Die "Personen"-Klasse hat insgesamt 3 Nachfolger, während die Vererbungstiefe von "Teacher" bei 2 liegt, denn "Teacher" ist zwei Vererbungsebenen tiefer als "Person", von dem es erbt. Diese beiden Werte sind wichtig, denn die Anzahl der Nachfolger gibt an, wie stark sich Änderungen an der "Personen"-Klasse auswirken können innerhalb unserer Code-Basis, da sie ja Auswirkungen auf alle nachfolgenden Klassen in der Vererbungshierarchie haben können. Bei der Vererbungstiefe wird nur der vorangegangene Strang beobachtet, denn Änderungen eines "Student" haben ja keine Auswirkung auf "Teacher". Bei beiden Werten sollten Sie versuchen, diese so niedrig wie möglich zu halten. Betrachten wir das am Beispiel von "ActionBarView". "ActionBarView" hat eine Vererbungstiefe von 9. Dies kommt dadurch zustande, dass "ActionBarView" nicht von "Object" erbt, sondern von "Window". "Window" ist eine Standardklasse aus dem .NET-Framework und erbt selbst von sehr vielen Basisklassen. Dies ist häufig in Frameworks so und ist in dem Fall für uns erst einmal nicht kritisch, weil wir die Basisklassen eines Frameworks durchaus als konstant betrachten können. Haben Sie aber beispielsweise einen unzuverlässigen Zulieferer von Frameworks, dann kann eine solche tiefe Vererbungshierarchie durchaus negative Einflüsse auf Ihren Code haben. In Ihrem eigenen Code haben Sie direkten Einfluss darauf. Eine Depth of Inheritance von mehr als 2 oder 3 empfinde ich beispielsweise als persönlich viel zu hoch. Als Alternative zur Vererbung sollten Sie aus diesem Grund hier die Komposition bevorzugen. Das ist eine Lehre, die wir aus dem Clean Code gezogen haben, wo es die eindeutige Vorgabe von "favor composition over inheritance" gibt. Welche Vorteile wir bei der Komposition von Funktionalität gegenüber Vererbung haben, sehen wir hier. Stellen wir uns zum einen vor, wir haben eine Klasse, hier einmal als Quadrat dargestellt. Und von dieser Klasse erben wir mit zwei weiteren Klassen. Dem stellen wir gegenüber, dass wir mehrere Einzelklassen haben und diese Einzelklassen werden dann kombiniert, also, die einzelnen farbigen Bereiche sind die Funktionalität, die wir wiederverwenden wollen. Wir wollen Sie aber gezielt wiederverwenden. Das ist dargestellt durch die gefärbten Vierecke basierend auf den Farben der wiederzuverwendenden Funktionalität. Die Komposition erlaubt mir nun, dass ich die vorhandene Funktionalität immer neu kombiniere, so wie ich es gerade brauche. Ich muss also für die einzelnen Klassen keine Funktionalität mitschleppen, die ich eigentlich nicht benötige und die mir durch die Vererbung einfach nur vorgeschrieben wird. Darüber hinaus wirken sich Änderungen an bestimmten Bestandteilen nur partiell aus. Bei der Vererbung ist es so, dass wenn ich etwas in der Basisklasse ändere, wirkt sich dies automatisch auf alle Kinder aus. Bei der Komposition ist es so, dass Änderungen an dem Bestandteil sich nur auf die Bestandteile auswirken, die ihn auch tatsächlich verwenden. Wenn Sie also Vererbung einsetzen, dann halten Sie diese so gering wie möglich. Bei Funktionalität sollten Sie eher auf die Komposition als auf die Vererbung setzen.

Grundlagen der Programmierung: Codemetriken

Lernen Sie Methoden, Prinzipien und Werkzeuge kennen, mit deren Hilfe Sie die Qualität Ihrer Software dauerhaft sicherstellen können.

1 Std. 43 min (20 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:25.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!