Esta no es una lista exhaustiva, pero considere algunos de los siguientes factores cuando decida si un objeto debe pasarse a un método como argumento:
¿El objeto es inmutable? ¿Es la función 'pura'?
Los efectos secundarios son una consideración importante para la mantenibilidad de su código. Cuando ve código con una gran cantidad de objetos con estado mutable que se pasan por todas partes, ese código a menudo es menos intuitivo (de la misma manera que las variables de estado globales a menudo pueden ser menos intuitivas), y la depuración a menudo se vuelve más difícil y el tiempo consumidor.
Como regla general, procure garantizar, en la medida de lo razonablemente posible, que cualquier objeto que pase a un método sea claramente inmutable.
Evite (nuevamente, en la medida de lo razonablemente posible) cualquier diseño por el cual se espera que el estado de un argumento cambie como resultado de una llamada a la función; uno de los argumentos más fuertes para este enfoque es el Principio de Menos Asombro ; es decir, alguien que lee su código y ve pasar un argumento a una función es 'menos probable' que espere que su estado cambie después de que la función haya regresado.
¿Cuántos argumentos tiene el método?
Los métodos con listas de argumentos excesivamente largas (incluso si la mayoría de esos argumentos tienen valores 'predeterminados') comienzan a parecer un olor a código. Sin embargo, a veces tales funciones son necesarias, y puede considerar crear una clase cuyo único propósito sea actuar como un objeto de parámetro .
Este enfoque puede involucrar una pequeña cantidad de mapeo adicional de código repetitivo de su objeto 'fuente' a su objeto de parámetro, pero eso es un costo bastante bajo tanto en términos de rendimiento como de complejidad, y hay una serie de beneficios en términos de desacoplamiento e inmutabilidad de objetos.
¿El objeto pasado pertenece exclusivamente a una "capa" dentro de su aplicación (por ejemplo, un modelo de vista o una entidad ORM?)
Piense en la separación de preocupaciones (SoC) . A veces, preguntándose si el objeto "pertenece" a la misma capa o módulo en el que existe su método (por ejemplo, una biblioteca de envoltura de API enrollada a mano, o su capa lógica empresarial principal, etc.) puede informar si ese objeto realmente debe pasarse a ese método.
SoC es una buena base para escribir código limpio, débilmente acoplado y modular. por ejemplo, un objeto de entidad ORM (mapeo entre su código y su esquema de base de datos) idealmente no debería pasarse en su capa empresarial, o peor aún en su capa de presentación / UI.
En el caso de pasar datos entre 'capas', pasar parámetros de datos simples a un método generalmente es preferible a pasar un objeto desde la capa 'incorrecta'. Aunque probablemente sea una buena idea tener modelos separados que existan en la capa 'correcta' en la que pueda asignar en su lugar.
¿Es la función en sí misma demasiado grande y / o compleja?
Cuando una función necesita muchos elementos de datos, puede valer la pena considerar si esa función está asumiendo demasiadas responsabilidades; Busque oportunidades potenciales para refactorizar utilizando objetos más pequeños y funciones más cortas y simples.
¿Debería la función ser un objeto de comando / consulta?
En algunos casos, la relación entre los datos y la función puede ser cercana; en esos casos, considere si un objeto de comando o un objeto de consulta sería apropiado.
¿Agregar un parámetro de objeto a un método obliga a la clase contenedor a adoptar nuevas dependencias?
A veces, el argumento más sólido para los argumentos de "Datos antiguos simples" es simplemente que la clase receptora ya está perfectamente autocontenida, y agregar un parámetro de objeto a uno de sus métodos contaminaría la clase (o si la clase ya está contaminada, entonces lo hará empeorar la entropía existente)
¿Realmente necesita pasar un objeto completo o solo necesita una pequeña parte de la interfaz de ese objeto?
Considere el Principio de segregación de interfaz con respecto a sus funciones, es decir, al pasar un objeto, solo debe depender de las partes de la interfaz de ese argumento que realmente necesita (la función).