Me pregunto si es legítimo usar verbos basados en sustantivos en OOP.
Me topé con este artículo brillante , aunque todavía no estoy de acuerdo con el punto que hace.
Para explicar el problema un poco más, el artículo establece que no debería haber, por ejemplo, una clase FileWriter
, pero como escribir es una acción debería ser una método de la clase File
. Llegará a darse cuenta de que a menudo depende del lenguaje, ya que un programador de Ruby probablemente esté en contra del uso de una clase FileWriter
(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 al hacerlo se rompería el principio de responsabilidad única. Cuando programé 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 denominarse Registro) tampoco debería tener la responsabilidad de realizar consultas SQL y acceso a la Base de datos. De alguna manera, esto invalida el patrón ActionRecord utilizado, por ejemplo, por Ruby on Rails.
Encontré este código C # (sí, cuarto lenguaje de objeto utilizado en esta publicación) el otro día:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Y tengo que decir que no tiene mucho sentido para mí que una clase Encoding
o Charset
en realidad 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 responsabilidad de la clase
File
abrir, leer o guardar archivos. - No es una responsabilidad de la clase
Xml
para serializarse. - No es responsabilidad de una clase
User
consultar una base de datos. - etc.
Sin embargo, si extrapolamos estas ideas, ¿por qué Object
tiene una clase toString
? No es responsabilidad de un auto o de un perro convertirse en una cadena, ¿verdad?
Entiendo que, desde un punto de vista pragmático, deshacerse del método toString
por la belleza de seguir un formulario SOLID estricto, que hace que el código sea más mantenible al hacer que sea inútil, no es una opción aceptable.
También entiendo que puede que no haya una respuesta exacta (lo que sería más un ensayo que una respuesta seria) a esto, o que puede estar basada en opiniones. Sin embargo, todavía me gustaría saber si mi enfoque realmente sigue lo que realmente es el principio de responsabilidad única.
¿Cuál es la responsabilidad de una clase?