Continuo a chiedermi se è legittimo usare verbi basati su sostantivi in OOP.
Mi sono imbattuto in questo brillante articolo , anche se non sono ancora d'accordo con il punto.
Per spiegare un po 'di più il problema, l'articolo afferma che non dovrebbe esserci, per esempio, una FileWriter
classe, ma poiché la scrittura è un'azione dovrebbe essere un metodo della classe File
. Ti renderai conto che spesso dipende dalla lingua poiché un programmatore Ruby sarebbe probabilmente contrario all'uso di una FileWriter
classe (Ruby usa il metodo File.open
per accedere a un file), mentre un programmatore Java non lo farebbe.
Il mio punto di vista personale (e sì, molto umile) è che ciò infrangerebbe il principio della responsabilità singola. Quando ho programmato in PHP (perché PHP è ovviamente il miglior linguaggio per OOP, giusto?), Spesso uso questo tipo di framework:
<?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 );
}
}
?>
Comprendo che il suffisso DataHandler non aggiunge nulla di rilevante ; ma il punto è che il principio della singola responsabilità ci impone che un oggetto utilizzato come modello contenente dati (che potrebbe essere chiamato Record) non dovrebbe avere la responsabilità di eseguire query SQL e l'accesso a DataBase. Ciò in qualche modo invalida il modello ActionRecord utilizzato ad esempio da Ruby on Rails.
Mi sono imbattuto in questo codice C # (yay, quarto linguaggio degli oggetti utilizzato in questo post) proprio l'altro giorno:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
E devo dire che per me non ha molto senso che una Encoding
o una Charset
classe codifichi effettivamente le stringhe. Dovrebbe semplicemente essere una rappresentazione di cosa sia realmente una codifica.
Quindi, tenderei a pensare che:
- Non è una
File
responsabilità di classe aprire, leggere o salvare file. - Non è una
Xml
responsabilità di classe serializzare se stesso. - Non è una
User
responsabilità di classe interrogare un database. - eccetera.
Tuttavia, se estrapoliamo queste idee, perché dovremmo Object
avere una toString
lezione? Non è responsabilità di un'auto o di un cane convertirsi in una stringa, adesso?
Capisco che da un punto di vista pragmatico, liberarsi del toString
metodo per la bellezza di seguire una rigorosa forma SOLIDA, che rende il codice più mantenibile rendendolo inutile, non è un'opzione accettabile.
Capisco anche che potrebbe non esserci una risposta esatta (che sarebbe più un saggio che una risposta seria) a questo, o che potrebbe essere basata sull'opinione. Tuttavia, vorrei ancora sapere se il mio approccio segue effettivamente il principio della responsabilità singola.
Qual è la responsabilità di una classe?