Me sigo preguntando si es legítimo usar verbos basados en sustantivos en OOP.
Me encontré con este brillante artículo , aunque todavía no estoy de acuerdo con el punto que hace.
Para explicar un poco más el problema, el artículo establece que no debería haber, por ejemplo, una FileWriter
clase, pero dado que escribir es una acción , debería ser un método de la clase File
. Te darás cuenta de que a menudo depende del idioma, ya que un programador de Ruby probablemente estaría en contra del uso de una FileWriter
clase (Ruby usa el método File.open
para acceder a un archivo), mientras que un programador de Java no lo haría.
Mi punto de vista personal (y sí, muy humilde) es que hacerlo rompería el principio de Responsabilidad Única. Cuando programaba en PHP (porque PHP es obviamente el mejor lenguaje para OOP, ¿verdad?), A menudo usaba este tipo de marco:
<?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 );
}
}
?>
Tengo entendido que el sufijo DataHandler no agrega nada relevante ; pero el punto es que el principio de responsabilidad única nos dicta que un objeto utilizado como modelo que contiene datos (puede llamarse Registro) no debería tener la responsabilidad de realizar consultas SQL y acceso a DataBase. Esto de alguna manera invalida el patrón ActionRecord utilizado, por ejemplo, por Ruby on Rails.
Me encontré con este código C # (sí, el cuarto lenguaje de objetos utilizado en esta publicación) el otro día:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Y debo decir que no tiene mucho sentido para mí que una Encoding
o Charset
clase realmente codifique cadenas. Simplemente debería ser una representación de lo que realmente es una codificación.
Por lo tanto, tendería a pensar que:
- No es
File
responsabilidad de la clase abrir, leer o guardar archivos. - No es una
Xml
responsabilidad de clase serializarse. - No es una
User
responsabilidad de clase consultar una base de datos. - etc.
Sin embargo, si extrapolamos estas ideas, ¿por qué tendría Object
una toString
clase? No es responsabilidad de un automóvil o de un perro convertirse en una cuerda, ¿verdad?
Entiendo que, desde un punto de vista pragmático, deshacerse del toString
método por la belleza de seguir una forma SÓLIDA estricta, que hace que el código sea más fácil de mantener al hacer que sea inútil, no es una opción aceptable.
También entiendo que puede no haber una respuesta exacta (que sería más un ensayo que una respuesta seria) a esto, o que puede estar basada en una opinión. Sin embargo, me gustaría saber si mi enfoque realmente sigue cuál es realmente el principio de responsabilidad única.
¿Cuál es la responsabilidad de una clase?