Este artículo afirma que una clase de datos es un "olor a código". La razón:
Es normal cuando una clase recién creada contiene solo unos pocos campos públicos (y tal vez incluso un puñado de captadores / establecedores). Pero el verdadero poder de los objetos es que pueden contener tipos de comportamiento u operaciones en sus datos.
¿Por qué está mal que un objeto contenga solo datos? Si la responsabilidad principal de la clase es representar datos, ¿no agregaría métodos que operan en los datos que rompan el Principio de Responsabilidad Única ?
Respuestas:
No hay absolutamente nada de malo en tener objetos de datos puros. El autor de la pieza, francamente, no sabe de qué está hablando.
Tal pensamiento surge de una vieja y fallida idea de que el "verdadero OO" es la mejor manera de programar y que el "verdadero OO" se trata de "modelos de datos enriquecidos" en los que se mezclan datos y funcionalidad.
La realidad nos ha demostrado que en realidad lo contrario es cierto, especialmente en este mundo de soluciones de subprocesos múltiples. Las funciones puras, combinadas con objetos de datos inmutables, son una forma demostrablemente mejor de codificar.
fuente
No hay absolutamente nada de malo en tener objetos de datos puros. El autor tiene una opinión no compartida por los desarrolladores de software que conozco.
Especialmente para el mapeo de bases de datos, en general tiene clases de entidad que solo contienen los campos almacenados en la base de datos y captadores y establecedores. Wikipedia Hibernate (marco)
La idea del agujero de los beans Java utilizados por muchas herramientas / frameworks se basa en clases de datos llamadas beans que solo contienen campos y los captadores y establecedores relacionados. Wikipdia JavaBeans
Fazit:
Si alguien afirma que algo es 'malo' o 'huele a código', siempre debe buscar las razones dadas. Si las razones no te convencen, pregúntale a alguien más por mejores razones o una opinión diferente. (Como hiciste en este foro)
fuente
Un buen argumento por Martin Fowler:
"Tell-Don't-Ask es un principio que ayuda a las personas a recordar que la orientación a objetos se trata de agrupar datos con las funciones que operan en esos datos. Nos recuerda que, en lugar de pedir datos a un objeto y actuar sobre esos datos, en cambio, debería decirle a un objeto qué hacer. Esto alienta a mover el comportamiento a un objeto para que vaya con los datos ".
https://martinfowler.com/bliki/TellDontAsk.html
fuente
baz
como parámetro a un método estático, pero para hacer eso, primero debe preguntarle al objeto. Quizás en un paradigma de programación donde los métodos eran primarios (como, por ejemplo, la programación funcional) esto tiene sentido, pero en un entorno OO, absolutamente no lo hace, porque los objetos son primarios y deben contener tanto los datos como las funciones para actuar sobre ellos. Su afirmación de que eliminar el método del objeto ha aumentado la encapsulación también es exactamente al revés , por lo que puedo decir, porque significa que ahora habaz
aparecido fuera del objeto.Lo que debe comprender es que hay dos tipos de objetos:
Objetos que tienen comportamiento . Estos deben abstenerse de dar acceso público a la mayoría / cualquiera de sus miembros de datos. Solo espero muy pocos métodos de acceso definidos para estos.
Un ejemplo sería una expresión regular compilada: el objeto se crea para proporcionar un cierto comportamiento (para hacer coincidir una cadena con una expresión regular específica y para informar las coincidencias (parciales)), pero la forma en que la expresión regular compilada funciona no es del usuario negocio.
La mayoría de las clases que escribo están en esta categoría.
Objetos que en realidad son solo datos . Estos deberían declarar a todos sus miembros públicos (o proporcionar el conjunto completo de accesores para ellos).
Un ejemplo sería una clase
Point2D
. No hay absolutamente ninguna invariante que deba garantizarse para los miembros de esta clase, y los usuarios deberían poder acceder a los datos a través demyPoint.x
ymyPoint.y
.Personalmente, no uso mucho esas clases, pero supongo que no hay un código más grande que haya escrito que no use tal clase en alguna parte.
Ser competente con la orientación a objetos incluye darse cuenta de que existe esta distinción y aprender a clasificar la función de una clase en una de estas dos categorías.
Si codifica en C ++, puede hacer esta distinción explícita utilizando
class
para la primera categoría de objetos ystruct
para la segunda. Por supuesto, los dos son equivalentes, excepto que esoclass
significa que todos los miembros son privados por defecto, mientras questruct
declara a todos los miembros públicos por defecto. Cuál es exactamente el tipo de información que desea comunicar.fuente