Seite 1 von 1

OCP

Verfasst: 20. Nov 2009 17:58
von cracker2010
Auch nach der Bearbeitung der Aufgabe 1 ist mir OCP im Bezug auf objektorientierte Sprachen in Verbindung mit Vererbung noch nicht hinreichend klar. Denn wenn ich eine Basisklasse habe und bei Veränderungen immer von dieser Klasse erbe, also die Basisklasse nie anrühre, sondern nur mit der abgeleiteten Klasse arbeite, dann habe ich ja immer OCP erfüllt. Ich verändere ja nie den bestehenden Code der Basisklasse, da ich die Basisklasse nicht anfasse. Wenn man jedoch sagt, dass OCP auch dann verletzt ist, wenn ich eine vorhandene Methode überschreibe, selbst wenn die neue Klasse anschließend LSP-konform ist, dann hätte dies ja katastrophale Folgen für Inferfaces sowie abstrakte Klassen. In Interfaces wird ja nie, zumindest nicht in Java, eine Methode ausformuliert. Dies geschieht ja erst in den Klassen, die das Interface implementieren. Für abstrakte Klassen wäre es insofern problematisch, wenn ich eine in einer Methode ausformulierte Basisfunktionalität für alle Erben gewährleisten möchte, ohne die tatsächliche Funktionalität der späteren Verantwortlichkeit implementieren zu wollen. Und wenn man hier sagt, OCP ist nur bei tatsächlicher Methodenüberschreibung verletzt, dann stellt sich mir die Frage, welchen signifikanten Unterschied es macht, ob ich eine Methode erst in der jeweiligen Klasse ausformuliere oder eine Methode durch überschreiben auf die neue bzw. erweitere Funktionalität anpasse?
Eine ähnliche Unklarheit besteht bei objektorientierten Sprachen ohne Vererbung. Ist OCP hier nicht generell verletzt, selbst wenn ich nur neue Methoden hinzufüge, Bestehende jedoch nie anrühre? Ohne Vererbung habe ich ja gar keine Wahl als den Code in irgendeiner Weise anzufassen, selbst wenn es nur die Erweiterung der Klasse mit neuer Funktionalitäten ist. Neu kompilieren muss ich die neue Klasse so oder so.

Re: OCP

Verfasst: 20. Nov 2009 22:15
von marcel_b
wo steht, dass das Überschreiben von Methoden OCP verletzt? Textpassage?

Re: OCP

Verfasst: 21. Nov 2009 09:14
von cracker2010
Habe nicht behauptet, dass es irgendwo steht. Ich finde jedoch, dass, wenn OCP nur dann verletzt ist, wenn man vorhandene Methoden in der Basisklasse verändert, nicht jedoch wenn man Methoden in abgeleiteten Klassen überschreibt, OCP in objektorientierten Sprachen mit Vererbung eher zu einen akademischen Prinzip wird. Denn um dem fragile base class-Problem zu entgehen, sollte man ja gerade die Basisklasse möglichst nie verändern. Gleichzeitig führt mich das aber zu der Frage, welchen Unterschied es macht, ob in einer objektorientierten Sprache mit Vererbung eine Methode in einer abgeleiteten Klasse zu überschreiben und auf diese Weise zu verändert wird oder in einer objektorientierten Sprache ohne Vererbung die vorhandene Methode direkt? Meines Erachtens wäre es daher sinnvoller, OCP etwas weiter zu interpretieren und eine OCP-Verletzung auch bei Überschreibung von Methoden in abgeleiteten Klassen anzusehen und eine OCP-Verletztung ggf. bewusst in Kauf zu nehmen. Denn so sehr man sich auch bemüht, aber alle Eventualitäten kann man nicht erfassen, ebenso wenig wie neue Anforderungen, die man evtl. bewusst nicht oder noch nicht implementieren möchte.

Re: OCP

Verfasst: 21. Nov 2009 18:39
von sevenclev
cracker2010 hat geschrieben:Denn wenn ich eine Basisklasse habe und bei Veränderungen immer von dieser Klasse erbe, also die Basisklasse nie anrühre, sondern nur mit der abgeleiteten Klasse arbeite, dann habe ich ja immer OCP erfüllt.
Man kann auch die Situation haben, dass man eine Klasse nicht überschreiben kann.
Einfaches Beispiel: Die Klasse ist als final deklariert, beziehungsweise die Methode, die man überschreiben will.
Komplexere Beispiel: Man möchte die bestehende Klasse A um eine Methode erweitern, die dann in der bestehenden Klasse B verwendet werden soll. Nur leider wird die Klasse B in Klasse A instantiiert, man kann also die Erweiterung von A gar nicht in B einschleusen.

OCP ist auch nicht so absolut gedacht. Natürlich kann man grundsätzlich einfach alle Klassen erweitern und in der Erweiterung alle Methoden neu implementieren. Das würde dann auch als OCP-Verletzung gelten.
Es geht eher darum, dass ein Design auf wahrscheinliche Änderungen eingestellt ist. "Wie einfach ist es eine wahrscheinliche Änderung ein zu pflegen?". Wenn ich reimplementieren muss, also Code dupliziere, ist das nie einfach.
cracker2010 hat geschrieben:Eine ähnliche Unklarheit besteht bei objektorientierten Sprachen ohne Vererbung. Ist OCP hier nicht generell verletzt, selbst wenn ich nur neue Methoden hinzufüge, Bestehende jedoch nie anrühre? Ohne Vererbung habe ich ja gar keine Wahl als den Code in irgendeiner Weise anzufassen, selbst wenn es nur die Erweiterung der Klasse mit neuer Funktionalitäten ist. Neu kompilieren muss ich die neue Klasse so oder so.
Der Ausschlag-gebende Faktor ist nicht Vererbung, sondern ob die Sprache eine Form von Abstraktion unterstützt. Ohne Abstraktion kein OCP.
cracker2010 hat geschrieben:Gleichzeitig führt mich das aber zu der Frage, welchen Unterschied es macht, ob in einer objektorientierten Sprache mit Vererbung eine Methode in einer abgeleiteten Klasse zu überschreiben und auf diese Weise zu verändert wird oder in einer objektorientierten Sprache ohne Vererbung die vorhandene Methode direkt?
Das Problem ist, dass du meistens den Code einfach nicht ändern kannst. Stell dir mal vor die Jungs bei Sun entschließen sich dazu, dass List.get(int index) jetzt nicht mehr das (index+1)-te Element, sondern das (index)-te Element zurück liefert. Dann werden nicht viele Menschen auf Java 1.7 umsteigen, da sie dann Code an unzähligen Stellen ändern müssten.
cracker2010 hat geschrieben:Denn so sehr man sich auch bemüht, aber alle Eventualitäten kann man nicht erfassen, ebenso wenig wie neue Anforderungen, die man evtl. bewusst nicht oder noch nicht implementieren möchte.
Alle Eventualitäten kann man nicht erfassen, aber die wahrscheinlichen schon, beziehungsweise das zu können macht einen guten Software Engineer aus (und braucht viiiel Erfahrung).

Re: OCP

Verfasst: 23. Nov 2009 00:14
von Wambolo
Was ist eigentlich wenn ich ein neues Attribut für eine Klasse einführen möchte, sagen wir mal in einer Klasse Auto und Auto hat einen Preis und eine Methode die den Preis berechnet und von diesem Attribut abhängt. Dann wäre OCP verletzt, wenn ich das ganze in Auto direkt implementiere, aber was wäre wenn ich, obwohl es wenig sinnvoll erscheint eine Klasse SuperAutoMitTollemAttribut von Auto erben lasse? Wäre das auch eine OCP Verletzung?

Re: OCP

Verfasst: 23. Nov 2009 00:50
von Wambolo
achja, wenn ich in einer Klasse eine Metode hinzufüge und sonst alles beim alten lasse, ist das OCP-konform? Ich bin mir nur unsicher, weil es ja heißt, dass keine Änderungen im Source Code vorgenommen werden sollen und wenn ich eine Klasse verändere, dann ist das ja auch eine Änderung, irgendwie stehe ich da etwas auf dem Schlauch.

Re: OCP

Verfasst: 23. Nov 2009 09:43
von marcel_b
Wir gehen davon aus, dass (gar) keine Änderungen an bestehenden Klassen vorgenommen werden. Nimm an, das Firma A die Klassen entworfen hat und du keine Möglichkeit hast diesen Code zu verändern.

Re: OCP

Verfasst: 23. Nov 2009 09:44
von marcel_b
Wambolo hat geschrieben:Was ist eigentlich wenn ich ein neues Attribut für eine Klasse einführen möchte, sagen wir mal in einer Klasse Auto und Auto hat einen Preis und eine Methode die den Preis berechnet und von diesem Attribut abhängt. Dann wäre OCP verletzt, wenn ich das ganze in Auto direkt implementiere, aber was wäre wenn ich, obwohl es wenig sinnvoll erscheint eine Klasse SuperAutoMitTollemAttribut von Auto erben lasse? Wäre das auch eine OCP Verletzung?
Führst du einen neue Superklasse ein, musst du die bestehende Klasse ändern, oder? Das würde also nicht gehen.

Re: OCP

Verfasst: 23. Nov 2009 10:03
von Wambolo
ich habe mich mit dem SuperAuto etwas in der Wortwahl vergriffen - eigentlich meinte ich eher ein tolles Auto, das von Auto erbt und einfach noch ein paar weitere Attribute besitzt. Also die alte Klasse wird zur Superklasse von TollesAuto.

Re: OCP

Verfasst: 23. Nov 2009 10:20
von marcel_b
sorry, überlesen/nicht genau gelesen. Das klingt doch voll ok, oder nicht? Du must keinen Code der Superklasse ändern, brngst neue Funktionalität dazu - ganz "open" für diese Art der Erweiterung.

Re: OCP

Verfasst: 23. Nov 2009 13:30
von sevenclev
Wambolo hat geschrieben:achja, wenn ich in einer Klasse eine Metode hinzufüge und sonst alles beim alten lasse, ist das OCP-konform?
Vielleicht sollte man noch erwähnen, dass OCP-Konformität eigentlich nicht beim Erweitern der Klasse eingehalten werden muss. OCP bezieht sich auf das bestehende Design, dass dann erweitert wird.
Eine Erweiterung, die nicht im Sinne von OCP durchgeführt werden kann, weist auf eine OCP-Verletzung im bestehenden Design hin.