Nuestros equipos están teniendo la siguiente discusión:
Digamos que tenemos los siguientes dos métodos:
public Response Withdraw(int clubId, int terminalId,int cardId, string invoice, decimal amount);
public Response Withdraw(Club club, Terminal terminal,Card card, string invoice, decimal amount);
lo que se envía por cable son solo los identificadores.
un lado dice que el primer método es correcto, porque solo tenemos los identificadores de terminal y club, y debe quedar claro que no tenemos nada más, este es mi enfoque.
el otro lado dice que el segundo método es correcto porque es más flexible.
Estamos familiarizados con la idea del parámetro del objeto, el otro lado también piensa que el parámetro del objeto debe tener los objetos como propiedades.
¿Cuál es el enfoque correcto?
Tal vez hay un tercer enfoque aún mejor?
Respuestas:
La respuesta depende del contexto.
Si se espera que el cliente tenga todos esos objetos ya disponibles , usaría los parámetros del objeto. De lo contrario, su código se verá más complicado de lo que debe ser. (Por ejemplo, tendrán llamadas como
club.getId()
, por ejemplo).Si el cliente solo tendrá los identificadores disponibles fácilmente, entonces quizás el segundo enfoque sea mejor, ya que es posible que no desee que el cliente tenga que ensamblar / cargar todos esos objetos si realmente solo necesita los identificadores.
Una opción es proporcionar ambos métodos , para que el cliente pueda elegir cuál usar (dado que esto no satura su API)
En general, los parámetros del objeto son más extensibles, ya que si en el futuro necesita otro dato para hacer el trabajo, no necesita introducir otro método que tome esa información adicional.
Por último, las firmas de su método no deben ser dictadas por los detalles de lo que hace el método (en su caso, qué pasa exactamente por el cable). La API debería tener un sentido abstracto, por lo que si la implementación cambia, no estás jodido.
fuente
El primer enfoque es indicativo de la obsesión primitiva . Debido a que está pasando entradas y cadenas, es muy fácil para el programador cometer un error (por ejemplo, pasar un clubId al parámetro terminalId). Esto resultará en errores difíciles de encontrar.
En el segundo ejemplo, es imposible pasar un palo cuando se espera una terminal; esto le daría un error de tiempo de compilación.
Aun así, todavía lo miraría
string invoice
. ¿Es una factura realmente una cadena? Queamount
significa Es más probable que sea un valor monetario.Usted mencionó en su pregunta "lo que se envía por cable son solo los identificadores". Esto es correcto, pero no permita que este requisito enturbie su dominio.
La mejor explicación que he visto a favor de este enfoque fue en la regla 3 de Object Calisthenics :
fuente
No hay una respuesta correcta para esta. Cualquiera de las opciones podría ser adecuada para el trabajo. Bueno, casi de cualquier manera, el argumento de la factura me hizo fruncir el ceño, no tengo idea de qué es eso al leer el código.
Si envía una identificación, ambos sistemas deben estar estrechamente acoplados a lo que eso representa. ClubID es clave en la tabla de clubes. Más aún, tanto la persona que llama como la persona que llama deben acordar cómo se llama la tabla Clubs y en qué base de datos se encuentra. Si no quiere o no puede imponer esa restricción, entonces pasaría el objeto usando una descripción común, nativo, serializado, xml, nombre = valor lo que sea, un archivo ini :)
Eso, como lo identificó, le costará "por cable". Evitar eso simplemente enviando el identificador le cuesta a otro lado. Entonces, cuál te duele menos, ahora (o puede ser más tarde ...) es el indicador de lo bueno frente a lo malo.
fuente