2011-01-01 14 views
8

¿System.out.println viola la ley del demeter?¿System.out.println viola la ley del demeter?

Si no, ¿por qué?

+0

¿En una vista de diseño o en una vista de código? – Mantar

+4

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;) –

+1

También fue mi primer pensamiento, Joe, pero desde SO no se trata de agricultura ... :-) – moritz

Respuesta

2

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:

  1. syste m sí
  2. println() 's parámetros
  3. ningún objeto creado/instanciado dentro println()
  4. componente directa
  5. de objetos del sistema
  6. una variable global, accesible por el sistema, en el ámbito de println()

(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.)

0

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.

+0

Lo más probable es que signifique la llamada en sí. – Esko

+0

Ooooh bien entiendo lo que quieres decir, gracias. – Mehrdad

+0

se refiere a la llamada al método System.out.println(), no a la implementación del método :-) – crnlx

0

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.

1

System.out es en realidad un "estado global", y sí, técnicamente viola la "ley del demeter". Pero:

  • debe evitar el uso de System.out.println(..). Use un registrador (log4j, logback, slf4j) en su lugar.
  • se supone que no debe confiar (y probar) nada que tenga el propósito de iniciar sesión en una consola. (esto no se aplica a sistemas de registro complejos que luego agregan la información registrada)
+0

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). –

+1

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

0

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]

  1. O sí
  2. parámetros de m
  3. Cualquier objeto creado/instanciado dentro de m
  4. objetos componente directa de O
  5. Una variable global, accesible por O, en el ámbito de m < - Éste

- Wikipedia

Por la quinta regla, puede recurrir a cualquier método de la variable global System.out desde dentro de cualquier contexto.

Cuestiones relacionadas