Al navegar por el código que he escrito, me encontré con la siguiente construcción que me hizo pensar. A primera vista, parece lo suficientemente limpio. Sí, en el código real, el getLocation()método tiene un nombre un poco más específico que describe mejor exactamente qué ubicación se obtiene.
service.setLocation(this.configuration.getLocation().toString());
En este caso, servicees una variable de instancia de un tipo conocido, declarada dentro del método. this.configurationproviene de ser pasado al constructor de la clase, y es una instancia de una clase que implementa una interfaz específica (que exige un getLocation()método público ). Por lo tanto, this.configuration.getLocation()se conoce el tipo de retorno de la expresión ; específicamente en este caso, es un java.net.URL, mientras que service.setLocation()quiere un String. Dado que los dos tipos String y URL no son directamente compatibles, se requiere algún tipo de conversión para ajustar la clavija cuadrada en el agujero redondo.
Sin embargo , de acuerdo con la Ley de Demeter como se cita en código limpio , un método de f en la clase C sólo debe llamar a métodos en C , los objetos creados por o pasado como argumentos a f , y objetos celebrada en variables de instancia de C . Cualquier cosa más allá de eso (la final toString()en mi caso particular anterior, a menos que considere un objeto temporal creado como resultado de la invocación del método en sí, en cuyo caso toda la Ley parece ser discutible) no está permitido.
¿Existe un razonamiento válido por el cual una llamada como la anterior, dadas las restricciones enumeradas, debe ser desalentada o incluso rechazada? ¿O solo estoy siendo demasiado quisquilloso?
Si tuviera que implementar un método URLToString()que simplemente llama toString()a un URLobjeto (como el devuelto por getLocation()) pasado como parámetro y devuelve el resultado, podría ajustar la getLocation()llamada para lograr exactamente el mismo resultado; efectivamente, solo movería la conversión un paso hacia afuera. ¿Eso de alguna manera lo haría aceptable? (Me parece , intuitivamente, que no debería hacer ninguna diferencia de ninguna manera, ya que todo lo que hace es mover un poco las cosas. Sin embargo, siguiendo la letra de la Ley de Deméter como se citó, sería aceptable, ya que yo entonces estaría operando directamente en un parámetro a una función).
¿Habría alguna diferencia si se tratara de algo un poco más exótico que recurrir toString()a un tipo estándar?
Al responder, tenga en cuenta que alterar el comportamiento o la API del tipo de la servicevariable no es práctico. Además, en aras de la discusión, digamos que alterar el tipo de retorno de getLocation()tampoco es práctico.