Yo diría que siga con la forma en que lo hizo antes. La cantidad de parámetros en su ejemplo no es mucha, pero las alternativas son mucho más horribles.
Mapa: está el aspecto de la eficiencia que mencionaste, pero el problema más grande aquí es:
- Las personas que llaman no saben qué enviarle sin hacer referencia a otra
cosa ... ¿Tiene javadocs que indique exactamente qué claves y
valores se utilizan? Si lo hace (lo cual es genial), entonces tener muchos parámetros tampoco es un problema.
- Se vuelve muy difícil aceptar diferentes tipos de argumentos. Puede restringir los parámetros de entrada a un solo tipo o usar Map <String, Object> y convertir todos los valores. Ambas opciones son horribles la mayor parte del tiempo.
Objetos de envoltura: esto solo mueve el problema ya que necesita llenar el objeto de envoltura en primer lugar, en lugar de directamente a su método, será al constructor del objeto de parámetro. Determinar si mover el problema es apropiado o no depende de la reutilización de dicho objeto. Por ejemplo:
No lo usaría: solo se usaría una vez en la primera llamada, por lo que ¿mucho código adicional para tratar con 1 línea ...?
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
SomeObject i = obj2.callAnotherMethod(a, b, c, h);
FinalResult j = obj3.callAFinalMethod(c, e, f, h, i);
}
Puede usarlo: aquí, puede hacer un poco más. Primero, puede factorizar los parámetros para 3 llamadas a métodos. también puede realizar otras 2 líneas en sí mismo ... por lo que se convierte en una variable de estado en cierto sentido ...
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
e = h.resultOfSomeTransformation();
SomeObject i = obj2.callAnotherMethod(a, b, c, d, e, f, g);
f = i.somethingElse();
FinalResult j = obj3.callAFinalMethod(a, b, c, d, e, f, g, h, i);
}
- Patrón de constructor: este es un anti-patrón en mi opinión. El mecanismo de manejo de errores más deseable es detectar antes, no más tarde; pero con el patrón del constructor, las llamadas con parámetros obligatorios faltantes (el programador no pensó en incluirlos) se mueven del tiempo de compilación al tiempo de ejecución. Por supuesto, si el programador coloca intencionalmente null o algo así en la ranura, será tiempo de ejecución, pero aún detectar algunos errores antes es una ventaja mucho mayor para atender a los programadores que se niegan a mirar los nombres de los parámetros del método al que están llamando. Lo encuentro solo apropiado cuando se trata de una gran cantidad de parámetros opcionales , e incluso entonces, el beneficio es marginal en el mejor de los casos. Estoy muy en contra del "patrón" del constructor.
La otra cosa que la gente se olvida de considerar es el papel del IDE en todo esto. Cuando los métodos tienen parámetros, los IDE generan la mayor parte del código por usted, y las líneas rojas le recuerdan lo que necesita suministrar / configurar. Cuando usa la opción 3 ... pierde esto por completo. Ahora depende del programador hacerlo bien, y no hay señales durante la codificación y el tiempo de compilación ... el programador debe probarlo para averiguarlo.
Además, las opciones 2 y 3, si se adoptan de forma generalizada innecesariamente, tienen implicaciones negativas a largo plazo en términos de mantenimiento debido a la gran cantidad de código duplicado que genera. Cuanto más código hay, más hay que mantener, más tiempo y dinero se gasta en mantenerlo.