Lo más importante para recordar es que son pautas, no reglas.
Hay casos en que un método simplemente debe tomar un argumento. Piense en el +método para los números, por ejemplo. O el addmétodo para una colección.
De hecho, incluso se podría argumentar que lo que significa agregar dos números depende del contexto, por ejemplo, en ℤ 3 + 3 == 6, pero en ℤ | 5 3 + 3 == 2 , por lo que realmente el operador de suma debería ser un método en un objeto de contexto que toma dos argumentos en lugar de un método en números que toma un argumento.
Del mismo modo, un método para comparar dos objetos debe ser un método de un objeto tomando al otro como argumento, o un método del contexto, tomando dos objetos como argumentos, por lo que simplemente no tiene sentido tener un método de comparación con menos de un argumento
Dicho esto, hay un par de cosas que se pueden hacer para reducir la cantidad de argumentos para un método:
- Haga el método en sí más pequeño : tal vez, si el método necesita tantos argumentos, ¿está haciendo demasiado?
- Una abstracción faltante : si los argumentos están estrechamente correlacionados, ¿tal vez van de la mano y hay una abstracción que te falta? (Ejemplo de libro de texto canónico: en lugar de dos coordenadas, pase un
Point objeto o, en lugar de pasar el nombre de usuario y el correo electrónico, pase un IdCardobjeto).
- Estado del objeto : si el argumento es necesario por varios métodos, tal vez debería ser parte del estado del objeto. Si solo lo necesitan algunos de los métodos pero no otros, tal vez el objeto está haciendo demasiado y realmente debería ser dos objetos.
Una forma es extraer los argumentos en una nueva clase, pero eso seguramente conduciría a una explosión de clases.
Si su modelo de dominio tiene muchos tipos diferentes de cosas, entonces su código terminará con muchos tipos diferentes de objetos. No hay nada de malo en eso.
¿Y es probable que esas clases terminen con nombres que violen algunas de las reglas de nomenclatura (que terminan en "Datos" o "Información", etc.)?
Si no puede encontrar un nombre propio, quizás haya agrupado demasiados argumentos o muy pocos. Entonces, o tienes solo un fragmento de una clase o tienes más de una clase.
Otra técnica es hacer que las variables utilizadas por múltiples funciones sean una variable miembro privada para evitar pasarlas, pero eso expande el alcance de la variable, posiblemente de tal manera que esté abierta a funciones que realmente no la necesitan.
Si tiene un grupo de métodos, todos los cuales operan con los mismos argumentos, y otro grupo de métodos que no lo hacen, tal vez pertenezcan a diferentes clases.
Tenga en cuenta con qué frecuencia usé la palabra "tal vez"? Es por eso que son pautas, no reglas. ¡Quizás tu método con 4 parámetros está perfectamente bien!