Decir que tengo una clase Person
que tiene variables de instancia age
, weight
y height
, y otra clase Fruit
que tiene variables de instancia sugarContent
y texture
. La Person
clase no tiene métodos, excepto setters y getters, mientras que la Fruit
clase tiene setters y getters y métodos lógicos como calculateSweetness
. ¿Es la Fruit
clase el tipo de clase que es mejor práctica que la Person
clase? Lo que quiero decir con esto es que la Person
clase parece que no tiene mucho propósito; existe únicamente para organizar datos, mientras que la Fruit
clase organiza datos y en realidad contiene métodos para la lógica.
8
Respuestas:
Si su persona realmente no está haciendo nada, entonces no hay necesidad de realizar ninguna acción al respecto. Es posible tener clases que solo recopilan datos y luego habrá clases que operan con estos datos. En su caso, es posible que no tenga ninguna acción sobre una sola persona, pero puede haber acción sobre un grupo de personas, como CalculateAverageHeight (). En este caso, tiene sentido tener solo Persona sin acción y luego tener otra clase (puede ser amiga) que trabaje en esto.
fuente
CalculateAverageHeight()
ser un método estático en elPerson
que se toma una colección dePerson
objetos. De esa manera, aunqueCalculateAverageHeight()
no es aplicable a una instancia individual dePerson
, aún lo mantiene cerca de los datos en los que opera.Es difícil llegar con una regla que diga que todas las clases deben tener cierta lógica. En general, las clases sin ninguna lógica se consideran AnemicDomainModel .
Incluso entonces, es mejor organizar los datos si la información relacionada se está volviendo grande. Por ejemplo, en este caso aún puede necesitar una colección de Persona que muchas colecciones no relacionadas.
fuente
El DataTransferObject es un buen ejemplo de una clase que no tiene lógica, sólo los datos. Sin embargo, ese es su propósito; Es explícitamente una excepción a la regla general que todas las clases deben implementar la lógica de negocios que afecta su estado interno. Tener una clase cuyo estado interno es cambiado por la lógica externa es a menudo un olor de diseño. No siempre está mal, pero casi siempre es algo que debería considerar refactorizar.
fuente
Invierta la pregunta, mire el otro extremo. Si tiene una colección de información que obviamente pertenece, ¿debería mantenerla separada solo porque no hay métodos que pueda agregar a esa clase? ¿Debería verse obligado a inventar métodos arbitrarios solo para justificar la clase?
fuente
Los modelos no tienen fin en sí mismos: debe agregar funcionalidades a una clase cuando realmente las necesite en su programa, no suponiendo que las necesitará probablemente en el futuro. Entonces, es natural que en un momento dado tengas clases sin métodos "reales", y luego, cuando determines que tiene sentido agregar métodos a la clase, haces exactamente eso. La calidad de un modelo no se mide con "¿tengo métodos aquí y no hay métodos allí?", La calidad se mide con "tengo todos los métodos que mi aplicación realmente necesita allí".
Por ejemplo, cuando su aplicación en la versión 1.0 necesita algo como
calculateSweetness
para unFruit
, pero no realiza ninguna operación enPerson
excepto obtener y establecer los atributos, entonces su modelo debe reflejar exactamente eso al no tener ninguna lógica en la clasePerson
. En la versión 2.0, puede tener sentido agregar algo de lógica a unaPerson
, así que cuando esté en ese punto, agregue los métodos en cuestión.fuente
Creo que esto depende del idioma y de cómo lo esté utilizando.
En el caso trivial, algunos idiomas insisten en que todo esté en una clase, por lo que, por ejemplo, las colecciones de constantes deben ir a una clase que luego puede o no tener lógica, en otros idiomas pueden terminar en un espacio de nombres.
En lenguajes de paradigmas múltiples, también puede depender de a qué paradigma desea que se adhiera su diseño. Tomando prestado el ejemplo de CalculateAverageHeight (), ya que probablemente debería residir en una clase PersonCollection, sin embargo, eso presupone una solución OOP. en un diseño más funcional, puede usar una función de orden superior con una colección genérica, por ejemplo, en C #
y luego la lógica no está en PersonCollection o incluso estáticamente en Person. De hecho, las funciones de orden superior y los tipos de datos genéricos en general significan que es más probable que termines con objetos que son solo bolsas de datos, ya que la lógica funciona a un nivel de abstracción más alto que tu modelo de datos específico .
fuente
Parece que de lo que estás hablando es de un POD (datos antiguos simples). Los diferentes lenguajes pueden representarlos de diferentes maneras: podría ser una clase con miembros públicos, por ejemplo, o una estructura con solo miembros públicos en C ++.
La organización de datos es una razón perfectamente válida para que exista una clase: a menudo puede hacer que el código sea más limpio y fácil de leer.
std::pair
en STL de C ++ es un buen ejemplo de una estructura que existe únicamente para organizar datos, simplemente una estructura que contiene dos valores de cualquier tipo llamadofirst
ysecond
. Probablemente una de las clases más útiles en todo el STL (en mi opinión de todos modos :))fuente