2011-03-15 21 views
5

¿Cuál de los dos debería preferirse?Clase base vs Clase de utilidad

Hay algunos métodos que son llamados por clase A, B y C.

caso de estos métodos puede encapsular en una clase D (base de A, B y C)?

O

caso de encapsular dichos métodos en una clase de U y otras clases creats que es objeto de utilizar los métodos según se requiera.

¿Sobre qué base se debe tomar una decisión?

Gracias.

+4

¿Existe alguna relación conceptual entre las clases A, B y C? –

+0

¿Qué tal hacer una interfaz e implementar eso por A, B, C? –

+0

@p: solo que construyen datos usados ​​por la clase D. A requiere entradas diferentes que otras clases. @Srinivas: la implementación de esos métodos es exactamente la misma para A, B y C. – Azodious

Respuesta

9

Debe hacer una clase de utilidad static.

Utilice únicamente la herencia si es realmente significativa si — A, B y C realidad son un D.

+0

sí, supongo. D tiene métodos que invocan algunos algoritmos de tres tipos. A, B y C construyen datos específicos para el algoritmo y llaman a esos métodos comunes para su ejecución. – Azodious

+0

@Azo: el detalle siempre ayuda. En ese caso, tal vez deberías usar inheritance, con un método 'abstract' anulado por' A', 'B', y' C'. – SLaks

+0

Estoy totalmente de acuerdo con su segundo punto, pero solo recomendaría el uso de una clase de utilidad estática donde los métodos de utilidad no tienen ningún estado (es decir, no variables estáticas) y no realizan operaciones con efectos secundarios (archivo IO o actividad de base de datos, etc.) . Si está probando las unidades A, B y C, es (casi) imposible desacoplarlas de una clase de utilidad estática con objetos simulados. Es mucho mejor utilizar una clase de utilidad no estática que se pasa a A/B/C mediante la inyección del constructor. Entonces el código es altamente configurable y adquiere comportamientos a través de la agregación. – sheikhjabootie

2

Tendría tendencia a la herencia a menos que haya una relación obvia es-a. Sospecho por su descripción anterior que este no es el caso. Mis soluciones preferidas serían:

  1. inyectar una instancia de una clase de utilidad en su A, B, C
  2. tienen A, B, C instanciar los clases de utilidad apropiadas

La ventaja de inyectar la clase es que puedes proporcionar diferentes implementaciones trivialmente. Esto es especialmente útil para las pruebas. Los singletons o clases con métodos estáticos tienden a causar problemas por la misma razón: no puede anularlos o sustituirlos fácilmente.

3

Basaría la decisión en lo que los métodos están haciendo, si están haciendo cosas específicas para las clases A, B y C, entonces deberían estar en la clase base. Esto ayuda a mantener el código limpio, al ocultar la funcionalidad relacionada con la clase lejos del resto del sistema. (por supuesto, estoy asumiendo que A, B y C o bien heredan de D, o están obviamente relacionados)

Si están haciendo cosas con otros tipos, eso no es inherente a lo que A, B y C hacer, entonces, para maximizar las oportunidades de reutilización, deberían estar en una clase de utilidad.

Si están haciendo las cosas con otros tipos que son específicos a ese otro tipo (por ejemplo de impresión legible de una fecha y hora) consideran haciéndolos métodos de extensión para el tipo que.

+1

+1: Me ganaste. Como lo menciona SLaks, también parece que el OP no conoce las funciones estáticas. Quizás vale la pena mencionar eso también para la clase de utilidad. –

0

Usar la clase base Si va a escribir algo de lógica solo en función de la clase base, entonces tiene sentido crear una clase base. En ese caso, su clase derivada debe ser completamente sustituible para su clase base. No debería haber ninguna lógica de conmutación para verificar el tipo derivado y actuar en consecuencia.Ver principio de sustitución de liskov: http://en.wikipedia.org/wiki/Liskov_substitution_principle

Uso utilidad de la clase Algunas lenguas tienen la limitación de que no son compatibles con la herencia múltiple. Si ya tiene una clase base significativa, entonces necesita ir a la clase de utilidad. Además, cuando usa herencia, está creando un acoplamiento estrecho entre la clase dervied y la clase base.

Iría por la clase base si la clase derivada es naturalmente sustituible por su clase base. Si el propósito es solo compartir algún código reutilizable entre clases, entonces tiene más sentido ir con la clase de utilidad.