Java: Cómo definir las capacidades de una instancia de subclase que se puede derivar de la superclase

StackOverflow https://stackoverflow.com/questions/5822358

  •  26-10-2019
  •  | 
  •  

Pregunta

Para que mi pregunta sea más concreta, déjame plantearla como un problema:

Descripción de la situación:

Tenemos 3 conceptos abstractos:

Boss:  which has a number of employees
Worker:  that can execute some types of tasks
Task:  contains the semantics needed for a worker to execute it

En la implementación/subtipos tenemos varios tipos diferentes de trabajadores y diferentes tipos de tareas. Un tipo específico de trabajador puede ejecutar ciertos tipos de tareas (subconjunto de todos los tipos)

problema para resolver

Ahora el jefe tiene una tarea de tipo conocido que desea ver ejecutado, no conoce los tipos de trabajadores que tiene (solo tipo/interfaz abstracto). ¿Qué tipo de interfaz (s) podría implementar el trabajador/qué podría hacer el jefe para averiguar?

formas de resolverlo en las que puedo pensar

Encontré estas dos maneras, pero probablemente haya otras y mejores formas:

1) Hacemos una clase para cada tipo de tarea que implementa la interfaz de tarea vacía, le da al trabajador una función de ejecución (tarea): en la implementación de ejecutar (tarea) intente tipecark/emitir tarea a todos los tipos de tareas que el tipo de trabajador puede realizar. Si no pasa ninguna de las typechecks, lanzamos una TaskNotSupportedException. El jefe ahora puede dar tareas a los trabajadores hasta que no se lance la excepción.

2) Ahora no tenemos clases de tareas, pero definimos una interfaz de capacidad para cada tipo de tarea con la función DotaskType (TaskInfo) Una implementación de trabajadores ahora puede implementar interfaces de capacidad que dependen de cuáles son sus capacidades. El jefe ahora puede verificar hasta que se encuentre un trabajador con la capacidad adecuada (typechecking) y luego darle la tarea sabiendo que puede ejecutarla.

No probé 2 y no tengo tanta experiencia en Java, pero esto debería ser posible (o algo muy similar).

También prefiero 2 sobre 1, porque 1 parece incorrecto (en cascada de moldes) y las interfaces son una forma natural de definir lo que puede hacer una instancia de una clase, también con las interfaces que podría agrupar las capacidades/crear jerarquías. (También en mi implementación actual (1) la interfaz de tareas está vacía, por lo que las tareas no tienen mucho en común y la información se pasa a través del constructor (que serían parámetros de funciones en el método 2) y se recuperan por Gets.

Me preguntaba de qué otra forma podría implementar (ajustar 1 o 2?) Esto o cuál de los dos prefiere y por qué. (¡La eficiencia no es importante, la modulación/abstracción/mantenibilidad es!)

¿Fue útil?

Solución

No use excepciones para esto. Las excepciones deben usarse para situaciones excepcionales, y no poder realizar alguna tarea parece ser normal.

Agregaría un método

boolean isAbleToExecute(Task task)

en la clase de trabajadores, y haga que el jefe ite a través de sus trabajadores y encuentre un trabajador capaz de ejecutar la tarea antes de asignarla.

Otros consejos

La interfaz de los trabajadores podría incluir un método compatible con tareas que devuelven una lista de tareas. Luego, podría mantener un mapa, mapeando la tarea a la lista de trabajadores que apoyan esa tarea. Entonces su jefe no necesita iterar, pero simplemente puede buscar a todos los trabajadores que respalden una tarea determinada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top