2012-09-20 61 views
5

Estamos tratando de hacer las cosas de la manera más clara y limpia posible en una arquitectura de 3 niveles.Arquitectura, muchos métodos y largas listas de parámetros

Pero la complejidad de nuestro sistema nos deja confundidos sobre la mejor manera de proceder.

Si utilizamos muchas cadenas de funciones que pasan por la capa de servicio, con listas de parámetros más pequeñas, esto parece claro en términos de lo que se está haciendo, pero parece que se repite una gran cantidad de funcionalidades a través de estos métodos.

Sin embargo, si utilizamos menos métodos y tenemos una gran lista de parámetros para cambiar la funcionalidad dentro de los métodos, esto parece salirse de control.

Nuestra elección por el momento es tener más funciones ya que esto se siente más fácil de manejar que las funciones monolíticas con muchos flujos lógicos dentro de ellas. Esto obviamente significa trozos más pequeños de código más manejable.

Es solo que escuchamos sobre DRY mucho, así que esto parece que hay alguna repetición dentro de los métodos. Pero parece más flexible.

+1

Es difícil responder a esta pregunta sin un ejemplo más concreto de lo que quiere decir. – Paddy

+0

extraer la repetición en un método separado? – auser

+0

Significa que tenemos el nivel web, el nivel de dominio y el nivel de db. Y DI está siendo usado. Así que es una buena práctica técnica, pero tiene una carga general en términos de implementación. Siento que es relevante porque los gastos generales significan que tenemos que escribir más código para navegar a través de cada uno de los niveles, lo que significa que la sobrecarga entre muchas funciones o muchos parámetros se siente con más fuerza. –

Respuesta

1

La mayoría de las personas prefiere firmas de métodos más pequeños que las grandes. Hace que sea más fácil razonar sobre los métodos (¡sin mencionar probarlos!), Sin embargo, no debe usar esto para justificar violaciones de los principios DRY.

¿Hay alguna razón por la que no se pueden tener firmas de métodos pequeños y factorizar el código común y replicado en los métodos internos de ayuda?

+1

Si bien las otras respuestas aquí son excelentes, esta es la respuesta que estaba buscando. –

0

Supongo que los "muchos métodos" hacen la misma función y lo único que varía son los parámetros.

Mi apporach sería pasar los datos con unos pocos objetos, similar a cómo se pasan los parámetros a GridBagLayout en los objetos GridBagConstraints. Por ejemplo, para una consulta de búsqueda paso un "Filtro" de frijol con todas las condiciones posibles, el código en el método es largo pero no complicado ("es condición X especificada -> agregue filtro X a consulta") y puede dividirse fácilmente en algunas funciones auxiliares.

1

Realmente creo que para las aplicaciones empresariales no hay nada mejor que una buena arquitectura en capas, con la buena intención de revelar nombres para clases y métodos, y algunos patrones de diseño aplicados en toda la solución. Siguiendo esta regla, es contradictorio tener métodos largos porque probablemente romperán el Principio de Responsabilidad Individual, por lo que no expresarán por su nombre lo que realmente están haciendo. Si desea utilizar el principio DRY, simplemente mantenga sus métodos y clases limpios, cortos y claros, y aplique algunos patrones de diseño para reutilizarlos en toda la solución.

Recomiendo leer Domain Driven Desing (Eric Evans) y Clean Code (Robert C. Martin) para ver más sobre este tipo de "código de filosofía" en detalle.

0

Suele ser un síntoma de aplicaciones fuertemente acopladas. Para ir de A a B tienes que tomar quince giros y luego retroceder un poco.

Una buena forma de reducir el acoplamiento es introducir eventos de dominio. Por ejemplo, cuando se crea un usuario va a generar un evento de dominio llamado UserCreated cuando está suscrito por la clase SendWelcomeEmail y NotifyAdminsOfNewUser o SendIntroductionaryOffer

El punto es que cualquier persona puede actuar sobre un evento que efectivamente reduce la complejidad, ya que Don Ya tienes que unir fuertemente tu código.

2

Creo que será mejor proporcionar 2 ejemplos de lo que quieres decir. Parece uno de los siguientes:

  1. Tiene un mal diseño.
  2. Tiene una interacción/comportamiento extendido a través de muchos objetos.
  3. Está utilizando un patrón de diseño DI \ incorrectamente.
  4. Su código es realmente de procedimiento y no de OO.

Como no proporcionó ningún ejemplo, lo revisaré en breve para conocer todas estas opciones.

1. Tiene un mal diseño.

3. Está utilizando el patrón de diseño DI \ incorrectamente.

Quizás deba dividir su código de manera diferente, quizás debería usar DI o volver a visitar cómo lo está usando. Tal vez deberías aplicar algunos patrones de diseño para que el problema sea manejable.

2. Tiene una interacción/comportamiento extendido a través de muchos objetos. Considere utilizar el DCI http://alexsmail.blogspot.com/2012/09/dci.html para resolver este problema.

4. Su código es realmente de procedimiento y no de OO. Vi código escrito en Java por el programador que son regulares para escribir código de procedimiento. Tiene muchos parámetros que modifican la ejecución del método. La solución será rediseñar su código y (re) entrenar a sus programadores.

+0

Gracias por el descuidado. Cualquiera de estas opciones que haya declarado podría ser verdad. Vamos a refactorizar a medida que avanzamos. Pero creo que nos mantendremos en muchas funciones pequeñas en general. –

+0

Cuando dice que su código es de procedimiento y no de OO. ¿Qué quieres decir? Seguramente, ¿todo código OO tiene algún código de procedimiento? Tenemos objetos DB, objetos de dominio, modelos de vista, clases de ayuda, servicios, interfaces, repositorios. ¿Eso significa que tenemos OO usado lo suficiente? –

+0

Según la descripción anterior, no creo que tengas el último problema. :-) Todos los códigos OO tienen algún código de procedimiento. Lo que quiero decir es que acabo de ver el código de procedimiento escrito en Java, sin servicios, interfaces, etc. :-) – alexsmail

Cuestiones relacionadas