2009-09-28 10 views
5

A veces termino con una jerarquía de clases donde tengo una clase base abstracta con algunas funcionalidades comunes y un par de clases de implementación que se dividen en dos (raramente más) grupos que deseo tratar de manera diferente en algunos casos. Un ejemplo sería una clase abstracta de nodo de árbol y diferentes implementaciones de rama y hoja donde quiero distinguir ramas y hojas en algún punto.¿Tiene mal olor el tener clases vacías en el medio de una jerarquía de clases?

Estas clases intermedias solo se utilizan para las sentencias "is-a" en el control de flujo y no contienen ningún código, aunque he tenido casos en los que "crecieron" algunos códigos más adelante.

¿Te parece mal? En mi ejemplo de árbol, una alternativa sería agregar isLeaf()/isBranch() métodos abstractos a la clase base e implementarlos en las clases intermedias, pero eso no parecía ser mejor para mí, en realidad, a menos que quisiera tener clases que podrían ser múltiples cosas a la vez.

+0

+1 agradable exponerse usted mismo :-) – KLE

+0

@KLE :-) Bueno, gracias por ser mi público.He estado trabajando para mí casi toda mi carrera y a veces puede ser difícil obtener una opinión externa. –

+0

@Hanno Bueno, lo estás haciendo bien, no te preocupes. Solo continúa. ¡Estoy realmente impresionado con tus 158 preguntas! ;-) – KLE

Respuesta

1

En general, las clases vacías son un olor código.

Acepto que sus métodos isLeaf o isBranch son una alternativa correcta. Ellos agregan información sobre los objetos, que es útil. (Esto se debe a que, en la superclase, no se puede expresar que las subclases son "de hoja o rama").


Los dos métodos con resultados opuestos también podría considerarse como la duplicación de código.

Puede usar solo una ... Pero yo recomendaría devolver un valor numerado HOJA o RAMA.

2

Sí, las jerarquías de herencia profunda son un olor de código de todos modos.

0

Una clase que no contiene ningún código es definitivamente un código de olor ....

4

Para mí, utilizar las pruebas "is-a" en el control de flujo es tan desagradable como usar el interruptor/caja. En un buen diseño OO, ninguno es necesario.

+0

Estoy de acuerdo, este es el problema más crítico. –

+2

+1 Acepto. Aunque este tipo de diseño no OO podría usarse temporalmente antes de refactorizar, o también podría usarse si una clase diferente debe tener un aspecto (separación de responsabilidades). ** Encontrar el equilibrio exacto de las jerarquías de clases es un proceso difícil y evolutivo ** por lo general. – KLE

+0

Estoy de acuerdo 100 por ciento. No puedo decirte cuántos argumentos he tenido respecto a que las declaraciones switch no son buenas OO. –

2

Sí, definitivamente un olor a código: no codifique estas clases vacías a menos que esté listo para escribir ese código en él. Piensa en YAGNI (no vas a necesitarlo), no lo hagas a menos que ya lo necesites.

Además, ¿ha considerado casos en los que estas clases solo están disponibles para proporcionar métodos abstractos o para agruparlos según las capacidades en términos de métodos o propiedades?

Si ese es el caso, tal vez lo que realmente necesita son interfaces, ¿no clases abstractas adicionales?

+0

Gracias por las sugerencias adicionales. Sin embargo, en los casos de los que estoy hablando, las interfaces no me ayudarían. –

0

Me parece bien, si va a poner nuevas funcionalidades en el futuro.

Pero si no, generalmente se usa una enumeración aquí.

- Editar

Aunque estoy de acuerdo con Ber, que no se debe generalmente a utilizar 'is-a' de todos modos.

Cuestiones relacionadas