Je me demande sans cesse s'il est légitime d'utiliser des verbes basés sur des noms dans la programmation orientée objet.
Je suis tombé sur ce brillant article , bien que je sois toujours en désaccord avec ce qu'il dit.
Pour expliquer un peu plus le problème, l'article stipule qu'il ne devrait pas exister de FileWriter
classe, mais que l'écriture est une action, elle doit être une méthode de la classe File
. Vous vous rendrez compte que cela dépend souvent du langage puisqu'un programmeur Ruby serait probablement contre l'utilisation d'une FileWriter
classe (Ruby utilise la méthode File.open
pour accéder à un fichier), contrairement à un programmeur Java.
Mon point de vue personnel (et oui, très humble) est que cela violerait le principe de responsabilité unique. Quand je programmais en PHP (parce que PHP est évidemment le meilleur langage pour la programmation orientée objet, non?), J'utilisais souvent ce type de 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 );
}
}
?>
Je crois comprendre que le suffixe DataHandler n’ajoute rien de pertinent ; mais le fait est que le principe de responsabilité unique nous dicte qu'un objet utilisé en tant que modèle contenant des données (peut-être appelé un enregistrement) ne devrait pas également avoir la responsabilité d'effectuer des requêtes SQL et un accès à la base de données. Cela invalide en quelque sorte le modèle ActionRecord utilisé par exemple par Ruby on Rails.
L’autre jour, j’ai rencontré ce code C # (yay, quatrième langage objet utilisé dans ce post):
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Et je dois dire que cela n'a pas beaucoup de sens pour moi qu'une classe Encoding
ou une Charset
classe encode réellement des chaînes. Cela devrait simplement être une représentation de ce qu'est réellement un encodage.
Ainsi, j'aurais tendance à penser que:
File
Ouvrir, lire ou sauvegarder des fichiers n’est pas une responsabilité de classe.- Ce n'est pas une
Xml
responsabilité de classe de se sérialiser. User
Interroger une base de données n’est pas une responsabilité de classe.- etc.
Cependant, si nous extrapolons ces idées, pourquoi aurions- Object
nous un toString
cours? Ce n'est pas la responsabilité d'une voiture ou d'un chien de se convertir en chaîne, n'est-ce pas?
Je comprends que d’un point de vue pragmatique, se débarrasser de la toString
méthode pour conserver la beauté d’une forme SOLIDE stricte, qui rend le code plus facile à gérer en le rendant inutile, n’est pas une option acceptable.
Je comprends aussi qu’il n’existe peut-être pas de réponse exacte (ce qui constituerait davantage une dissertation qu’une réponse sérieuse), ou qu’elle pourrait être fondée sur une opinion. Néanmoins, j'aimerais quand même savoir si mon approche suit réellement le principe de la responsabilité unique.
Quelle est la responsabilité d'une classe?