Mejores prácticas: HashMap en lugar de una lista de parámetros, ¿buena idea?

Hola, comunidad de Stackoverflow:

Estoy trabajando en un código donde se envía una lista de criterios opcionales a mi dao. La firma del método contiene la lista de +/- 10 parámetros, que realmente no me gustan y quiero reformatear. Además, me gustaría evitar tener que refactorizar todas las firmas de métodos de diferentes capas solo porque agrego o elimino un criterio

List searchParams(String name, Long countryCode, ...){
...
}

se convertiría

List searchParams(HashMap<String,Object> map) {
    BeanUtils.populate(this,map);
    ...
}

Estoy un poco preocupado de que esto suceda porque es una mala práctica, porque cedo el control de lo que se pasa en el mapa para darme esa flexibilidad. Entonces mi pregunta es si estoy en el camino correcto procediendo de esa manera.

preguntado el 22 de mayo de 12 a las 21:05

4 Respuestas

Cuando me encuentro con situaciones como esta, tiendo a crear una Params clase y pase que alrededor. Los beneficios son que:

  • a diferencia de cuando se usa un Map, puede tener captadores/configuraciones significativas, validación adecuada, etc.
  • es de tipo seguro y autodescriptivo (lo que significa que es fácil encontrar los parámetros disponibles y sus tipos).
  • puede agregar nuevos parámetros sin tener que refactorizar ninguna capa intermedia.

contestado el 22 de mayo de 12 a las 21:05

Podría definir una nueva clase para contener/manejar su conjunto de parámetros, de modo que obtenga un poco más de control del que le daría un HashMap. Molesto de escribir, o al menos tedioso, pero parece un mejor equilibrio entre flexibilidad y control.

contestado el 22 de mayo de 12 a las 21:05

Podría mirar sus parámetros y ver si puede envolverlos como un grupo lógico en un objeto. Por ejemplo, un nombre y un código de país podría ser un objeto de persona

public Person {
    private String name;
    private String countryCode;
}

Luego, solo pasará este objeto y podrá usar captadores para obtener los datos, lo que debería ser más fácil de leer y mantener que la necesidad de conocer todas las claves para el HashMap en múltiples capas.

contestado el 22 de mayo de 12 a las 21:05

El único caso en el que es apropiado usar un mapa es cuando está diseñando una fábrica y necesita pasar diferentes tipos de parámetros a las diferentes clases que se están creando. En todos los demás casos, sería preferible una solución con una clase de información de parámetro especializada.

Para ver un ejemplo de dónde es apropiado pasar un mapa, mire el DriverManager.getConnection método: este método necesita pasar parámetros a los constructores de implementaciones específicas del controlador del Connection que se está creando, por lo que envuelve un mapa en Propertiesy permite que el usuario lo pase a través de la conexión específica del controlador. Tenga en cuenta que DriverManager no tiene otra solución que sea a prueba de futuro.

Desaconsejaría encarecidamente el uso de un mapa en todos los demás casos: la flexibilidad adicional cambia la detección de errores del tiempo de compilación al tiempo de ejecución, lo que tiene un gran potencial de multiplicar su dolor de cabeza más allá de lo creíble.

contestado el 22 de mayo de 12 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.