Tengo un conjunto de funciones de propósito único que necesito en dos controladores separados. En este momento solo tengo un código duplicado y quiero deshacerme de él. Este código es parte del controlador y no pertenece a mi capa de servicio. ¿Dónde lo pondrías?
mvc
code-smell
Irlanda
fuente
fuente
Respuestas:
No dijiste qué tipo de lógica es la que estás compartiendo. En resumen, ¿es esta lógica del controlador o una función auxiliar? Los dos métodos para tratar esto en un lenguaje orientado a objetos son la herencia y la composición. La herencia tiene sentido si hay una acción compartida entre los dos controladores. La composición tiene sentido el resto del tiempo. El ejemplo del uso de la herencia se encuentra en mi respuesta original debajo del divisor.
No es raro tener una clase de utilidad o una clase auxiliar según su marco. Por ejemplo, en los marcos web Java y C # puede que tenga un paquete / espacio de nombres para utilidades. En Ruby on Rails, puede estar aprovechando la
Helper
clase que comparte lógica entre controladores y vistas. Básicamente, se vería así:Alternativamente, puede convertirlo en una clase que instancia. La clave del patrón de clase estática anterior es hacer que sus funciones sean funciones puras. En otras palabras, pasa cualquier estado que necesite para hacer su trabajo, y la función no hace referencia a ningún otro estado estático en el sistema.
En cualquier caso, accedería a cada uno de sus controladores de la siguiente manera:
Respuesta original
No dijiste cuál era tu plataforma, ya que eso puede afectar la respuesta. Suponiendo que es un lenguaje orientado a objetos, el enfoque más común es crear una clase base que extiendan ambos controladores. Por ejemplo, en Ruby on Rails podría tener:
También puedes traducir la idea a otros idiomas. El mismo enfoque funcionará para ASP.NET MVC, Apache Wicket, Grails o cualquier otro marco web orientado a objetos. Si su lenguaje no está orientado a objetos, entonces realmente depende de cómo esté diseñado el marco para el mejor enfoque.
fuente