Ist es eine vernünftige Praxis, eine Klasse zu erweitern, um nur eine einzelne Funktion wiederzuverwenden?


10

Ich entwickle eine Reihe von Post-Filtern für eine WordPress-Site und habe die ersten 4 mit einer einzigen Klasse erstellt.

Die letzten beiden unterscheiden sich im Umfang genug, um nur eine einzige Funktion (die Funktion zum Erstellen der endgültigen Links) in ihren Klassen gemeinsam zu nutzen.

Ist es in diesem Fall oder in einer Reihe ähnlicher hypothetischer Fälle sinnvoll, die ursprüngliche Klasse zu erweitern, um diese Funktionalität zu erhalten, oder gibt es einen besseren Weg?


Ich verstehe diese Frage nicht. Was meinst du damit, Dinge mit einer Klasse zu bauen? Erben diese Klassen von etwas? Hätte die Klasse an der Spitze der Hierarchie nicht bereits die gemeinsame Funktion?
David Thornley

Antworten:


19

Nein, wenn die beiden Klassen so unterschiedlich sind, dass sie nur eine Funktion gemeinsam haben, sind sie wahrscheinlich nicht austauschbar - und würden daher das Prinzip der Liskov-Substitution brechen .

Leiten Sie nur von einer Basisklasse ab, wenn dies logisch ist. Das Teilen eines einzelnen Codeteils ist selten eine Rechtfertigung für die Vererbung :)

In diesem Beispiel klingt es so, als ob Sie diese Funktion stattdessen über die Komposition wiederverwenden möchten ...


3
Komposition lieber als Vererbung! In den meisten Fällen wird dies Ihnen auf lange Sicht das Leben einfacher machen.
Travis

Zusammensetzung FTW!
back2dos

Bemerkenswert ist, dass meine Antwort im Grunde die gleiche ist wie @Sardathrion, ich habe mich gerade mit den relevanten Prinzipien verbunden :)
MattDavey

7

Wenn eine Klassenbeschreibung das Wort " und " enthält, sollte sie in zwei (oder mehr) Klassen unterteilt werden. So wie es aussieht, könnten Sie diese Funktion zu einem Mitglied einer anderen Klasse machen, auf die von denjenigen verwiesen wird, die Sie derzeit haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.