2010-12-30 17 views
5

Tengo tres objetos; Acción, problema y riesgo. Todos estos contienen un nunber de variables/atributos comunes (por ejemplo: Descripción, título, Fecha de vencimiento, Criado por etc.) y algunos campos específicos (riesgo tiene probabilidad). La pregunta es:Subclase o no a la subclase

  1. Debería crear 3 separada Acción clases, de riesgos y de emisión en cada que contiene los campos de repetición.

  2. Crear una clase padre "Abstract_Item" que contiene estos campos y operaciones en ellos y luego tener Acción, Riesgo y Edición subclase Abstract_Item. Esto se ajustaría al principal DRY.

Respuesta

2

Sí, la adhesión a seco es por lo general una muy buena idea excepto si las clases tienen muy, muy diferentes usos (es decir, tanto las manzanas y los coches pueden ser de color rojo, todavía no me derivar ambos de una clase base llamada ProbablyRed). En su caso, sin embargo, definitivamente iría por una clase base ya que las implementaciones que describe (Action, Issue, Risk) parecen ser una especie de regla comercial con semántica muy similar.

0

Parece que está respondiendo esto usted mismo. Como dices, SECO.

0

La clase principal abstracta suena como el camino a seguir. También hará posible o más fácil (según su idioma) implementar y utilizar funciones que actúen sobre cualquiera de los tres elementos. Por ejemplo, podría tener una función "Obtener una lista de todos los elementos generados por {usuario}".

0

Otra faceta puede hacerse visible si nos fijamos en los casos de uso, probablemente tratando con diferentes subgrupos de las propiedades.

Si, por ejemplo, "etiqueta", "fecha de vencimiento" y "levantado" se utilizan en una aplicación similar y otras propiedades de "Acción" y "Riesgo" prevalecerán al trabajar en esa tarea, puede considerar una agregación de tareas que permite decir (etiqueta, fecha de vencimiento, ...) y el tema que es una referencia a cosas como polimórfica Acción, número o lo que vendrá algún día

4

Mi Perspectiva

digamos si has usado herencia. Durante un período tiene nuevos atributos que son comunes solo a Acción y Número pero no a Riesgo. ¿Cómo manejarás esto? Si los pones debajo de los padres, entonces Risk está heredando cosas que son irrelevantes (Liskov Substituon Principle knocking?). Si lo pones en Acción y Riesgo por separado, entonces estás rompiendo DRY, la razón inicial por la que comenzaste a heredar. El punto es Inhertence para reutilizar es malo. Si no hay "is-a", mejor no lo use y cuando tenga dudas, entonces no hay un verdadero "is-a".

mi preferencia

Hay otras maneras de lograr SECO como se muestra a continuación en el ejemplo de código.Con esta adición de nuevas propiedades, puede ser otro Common2, además del nuevo comportamiento CommonBehavior2 si no son aplicables a las 3 clases; si son entonces simplemente cambiar existente Común y CommonBehavior

public class Common implements CommonBehavior 
{ 
    String Description; 
    String title; 

    public void f() {} 
} 

public interface CommonBehavior 
{ 
    void f(); 
} 

public class Action implements CommonBehavior 
{ 
    private Common delegate; 

    pubic void f() 
    { 
    delegate.f(); 
    } 
} 

También se fijan en mi respuesta a una pregunta similar con otro ejemplo práctico Design pattern to add a new class

+0

Gracias por invitar a la delegación y la buena presentación. ¿Qué piensas al revés (ver más allá, Tarea -> Tema). La pregunta es si la "fecha de vencimiento" realmente es parte de Acción (su delegación) o un artefacto del flujo de trabajo que cumple una función no relacionada con la Acción, solo en la incrustación del contexto del flujo de trabajo. – mtraut

+0

Gracias por mostrar Delegate tan claramente. Lo que tengo para Action, Issue and Risk es de hecho un conjunto de comportamientos comunes. El uso del enfoque delegado hará que el funcionamiento de las clases sea mucho más claro al leer el comienzo del código. Tomando el ejemplo de "Tarea" a continuación, Acción puede ser una tarea pero Riesgo no lo es. La intención de las clases se vuelve muy clara, ya que Action es ahora: "Action implementa CommonBehaviour, Task, MeetingIem", donde Risk is: "Risk implementa CommonBehaviour, MeetingItem". – poulenc

+0

Me alegra que lo haya entendido. Le sugiero que también revise mi respuesta aquí a una pregunta similar http://stackoverflow.com/questions/4512184/design-pattern-to-add-a-new-class/4512234#4512234 –

0

Do not subclass jus t porque los objetos comparten algunos datos u operaciones. Considere la composición como la forma predeterminada de seguir DRY.

En su caso particular, solo cree una clase principal si sus objetos están realmente relacionados, es decir, hay una relación semántica "es una" con la clase principal. Por ejemplo, si Acción, Emitir y Riesgo son todos los objetos de Ticket.