¿System.out.println
viola la ley del demeter?¿System.out.println viola la ley del demeter?
Si no, ¿por qué?
¿System.out.println
viola la ley del demeter?¿System.out.println viola la ley del demeter?
Si no, ¿por qué?
Según la vista.
LoD: Sí, porque usa la consola. En LoD no puedes asumir el acceso.
LoD-F: Sí, porque usa más de un punto. El LoD-F establece que en cualquier uso de método solo el objeto puede conocer la estructura interna de sí mismo. IE
System.out.println()
requiere el conocimiento de la estructura del sistema (que tiene .out) para llegar a println(),
para que el sistema se rompe LD-F que tendría que ser
System.println()
a romper las reglas formales hacia abajo con el ejemplo, println() (el método) sólo puede acceder a:
(lo sé, es una referencia invertido aquí como el código debe ser el método llamándolo, pero en realidad se balancea en ambos sentidos.)
Diría que no realmente, ya que llama a Object.toString()
y no se acopla estrechamente con ninguna clase de ninguna manera; simplemente le dice al objeto que se convierta en una cadena.
Editar:
Si se refiere a la llamada en sí, en lugar de lo que sucede en la llamada, entonces yo diría que sí lo hace, porque las parejas fuertemente su programa para el campo System.out
.
Viola la ley, ya que usa "más de un punto" y expone el hecho de que está utilizando otro objeto para la llamada de impresión.
System.out
es en realidad un "estado global", y sí, técnicamente viola la "ley del demeter". Pero:
System.out.println(..)
. Use un registrador (log4j, logback, slf4j) en su lugar.Idealmente, debería utilizar Aspectos y ocultar por completo el registrador (una cuestión transversal) de su base de origen. Esto le permite intercambiar los registradores según sea necesario (ya que la velocidad, la memoria y otros requisitos son propensos a cambios). –
bien, no siempre. Puede registrar información común, como lo que se invoca, con qué parámetros, tiempos de ejecución, etc. Pero no puede registrar mensajes de depuración intermedios. – Bozho
Nº
System.out
es una variable global.
Más formalmente, la Ley de Demeter para funciones requiere que un método m de un objeto O solamente puede invocar los métodos de los siguientes tipos de objetos: [2]
- O sí
- parámetros de m
- Cualquier objeto creado/instanciado dentro de m
- objetos componente directa de O
- Una variable global, accesible por O, en el ámbito de m < - Éste
Por la quinta regla, puede recurrir a cualquier método de la variable global System.out
desde dentro de cualquier contexto.
¿En una vista de diseño o en una vista de código? – Mantar
bueno, dado que el demeter es una reglementación de la agricultura orgánica en Alemania, yo diría que no, porque no tiene nada que ver con eso;) –
También fue mi primer pensamiento, Joe, pero desde SO no se trata de agricultura ... :-) – moritz