Continuo a chiedermi se sia legittimo utilizzare i verbi basati su nomi in OOP.
Mi sono imbattuto in questo articolo brillante , anche se non sono ancora d'accordo il punto che rende.
Per spiegare il problema un po 'di più, l'articolo afferma che non ci dovrebbe essere, ad esempio, una classe FileWriter
, ma dal momento che scrivere è un azione dovrebbe essere un metodo della classe File
. Ti renderai conto che è spesso dipendente dalla lingua poiché un programmatore di Ruby sarebbe probabilmente contrario all'uso di una classe FileWriter
(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ò farebbe rompere il principio di Responsabilità Unica. Quando ho programmato in PHP (perché PHP è ovviamente la lingua migliore per OOP, giusto?), Userei spesso 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 );
}
}
?>
Sono a conoscenza del fatto che il suffisso DataHandler non aggiunge nulla di rilevante ; ma il punto è che il principio della singola responsabilità ci dice che un oggetto usato come un modello contenente dati (può essere chiamato un Record) non dovrebbe avere anche la responsabilità di fare query SQL e accesso a DataBase. Ciò in qualche modo invalida il pattern ActionRecord utilizzato ad esempio da Ruby on Rails.
Mi sono imbattuto in questo codice C # (yay, quarto linguaggio oggetto usato 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 classe Encoding
o Charset
in realtà codifichi stringhe. Dovrebbe essere semplicemente una rappresentazione di ciò che è veramente una codifica.
Quindi, tenderei a pensare che:
- Non è una responsabilità della classe
File
aprire, leggere o salvare i file. - Non è responsabilità della classe
Xml
serializzarsi. - Non è responsabilità della classe
User
interrogare un database. - ecc.
Tuttavia, se estrapoliamo queste idee, perché Object
ha una classe toString
? Non è responsabilità di una macchina o di un cane convertirsi in una stringa, ora è così?
Comprendo che da un punto di vista pragmatico, eliminare il metodo toString
per la bellezza di seguire una forma SOLIDA rigorosa, che rende il codice più gestibile rendendolo inutilizzabile, non è un'opzione accettabile.
Capisco anche che potrebbe non esserci una risposta esatta (che sarebbe più un saggio di una risposta seria) a questo, o che potrebbe essere basata sull'opinione pubblica. Tuttavia, mi piacerebbe ancora sapere se il mio approccio segue effettivamente ciò che è realmente il principio di responsabilità individuale.
Qual è la responsabilità di una classe?