Ich frage mich immer wieder, ob es legitim ist, Verben zu verwenden, die auf Substantiven in OOP basieren.
Ich bin auf diesen brillanten Artikel gestoßen , obwohl ich immer noch nicht der Meinung bin, worauf es ankommt.
Um das Problem etwas näher zu erläutern, heißt es in dem Artikel, dass es beispielsweise keine FileWriter
Klasse geben sollte, aber da Schreiben eine Aktion ist , sollte es eine Methode der Klasse sein File
. Sie werden feststellen, dass es oft sprachabhängig ist, da ein Ruby-Programmierer wahrscheinlich gegen die Verwendung einer FileWriter
Klasse ist (Ruby verwendet eine Methode, File.open
um auf eine Datei zuzugreifen), wohingegen ein Java-Programmierer dies nicht tut.
Mein persönlicher (und ja, sehr bescheidener) Standpunkt ist, dass dies gegen das Prinzip der einheitlichen Verantwortung verstoßen würde. Wenn ich in PHP programmiert habe (weil PHP offensichtlich die beste Sprache für OOP ist, oder?), Habe ich oft diese Art von Framework verwendet:
<?php
// This is just an example that I just made on the fly, may contain errors
class User extends Record {
protected $name;
public function __construct($name) {
$this->name = $name;
}
}
class UserDataHandler extends DataHandler /* knows the pdo object */ {
public function find($id) {
$query = $this->db->prepare('SELECT ' . $this->getFields . ' FROM users WHERE id = :id');
$query->bindParam(':id', $id, PDO::PARAM_INT);
$query->setFetchMode( PDO::FETCH_CLASS, 'user');
$query->execute();
return $query->fetch( PDO::FETCH_CLASS );
}
}
?>
Nach meinem Verständnis fügt das Suffix DataHandler nichts Relevantes hinzu . Der Punkt ist jedoch, dass das Prinzip der Einzelverantwortung uns vorschreibt, dass ein Objekt, das als Modell mit Daten verwendet wird (möglicherweise als Datensatz bezeichnet), nicht auch die Verantwortung für die Ausführung von SQL-Abfragen und den Datenbankzugriff haben sollte. Dadurch wird das ActionRecord-Muster, das beispielsweise von Ruby on Rails verwendet wird, ungültig.
Ich bin neulich auf diesen C # -Code gestoßen (yay, vierte in diesem Beitrag verwendete Objektsprache):
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Und ich muss sagen, dass es für mich wenig sinnvoll ist, wenn eine Encoding
oder Charset
Klasse tatsächlich Zeichenfolgen codiert . Es sollte lediglich eine Darstellung dessen sein, was eine Kodierung wirklich ist.
Daher würde ich eher denken, dass:
- Es liegt nicht in der
File
Verantwortung der Klasse, Dateien zu öffnen, zu lesen oder zu speichern. - Es liegt nicht in der
Xml
Verantwortung der Klasse, sich selbst zu serialisieren. - Es ist keine
User
Klassenverantwortung, eine Datenbank abzufragen. - usw.
Wenn wir diese Ideen jedoch extrapolieren, warum sollte Object
es dann eine toString
Klasse geben? Es liegt nicht in der Verantwortung eines Autos oder eines Hundes, sich in eine Schnur umzuwandeln, oder?
Ich verstehe, dass es aus pragmatischer Sicht toString
keine akzeptable Option ist, die Methode für die Schönheit der Befolgung einer strengen SOLID-Form loszuwerden, die den Code wartbarer macht, indem er unbrauchbar gemacht wird.
Ich verstehe auch, dass es möglicherweise keine genaue Antwort gibt (die eher ein Aufsatz als eine ernsthafte Antwort wäre), oder dass es sich um eine meinungsbasierte Antwort handelt. Trotzdem würde ich gerne wissen, ob mein Ansatz tatsächlich dem Prinzip der Einzelverantwortung folgt.
Was ist die Verantwortung einer Klasse?