Est-ce que System.out.println violent la loi de Déméter?
-
14-10-2019 - |
Question
Est-ce que System.out.println
violent la loi de Déméter?
Si non, pourquoi?
La solution
Selon le point de vue.
LOD: Oui, car il utilise la console. Sous LOD vous ne pouvez pas supposer l'accès.
LOD-F: Oui, car il utilise plus d'un point. La LOD-F indique que, dans toute l'utilisation de la méthode que l'objet peut connaître la structure interne de lui-même. IE
System.out.println()
exige une connaissance de la structure du système (qu'il a .out) pour atteindre println (),
Pour le système de ne pas casser LOD-F, il devrait être
System.println()
Pour briser les règles formelles vers le bas avec par exemple, println () (la méthode) peut seule:
-
système
- se
- println () 's paramètres
- aucun objet créé / instanciée à l'intérieur de println ()
- objets composants directs du système
- une variable globale, accessible par le système, dans le cadre de println ()
(je sais, il est une référence ici inversée que le code devrait être la méthode d'appel, mais il oscille en fait dans les deux sens.)
Autres conseils
System.out
est en fait un « état global », et oui, techniquement, il viole la « loi de Déméter ». Mais:
- vous devriez éviter d'utiliser
System.out.println(..)
. Utilisez un enregistreur (log4j, logback, slf4j) à la place. - vous ne sont pas censés compter (et test) tout ce qui est dans le but de l'exploitation forestière à une console. (Cela ne les systèmes d'exploitation concernent complexes qui regroupent plus tard les informations enregistrées)
Je dirais pas vraiment, car il appelle Object.toString()
et ne pas deux étroitement avec une classe de quelque façon; il dit simplement l'objet de se convertir en une chaîne.
Edit:
Si vous voulez dire l'appel lui-même, plutôt que ce qui se passe dans l'appel, alors je dirais que oui, il le fait, car il étroitement couples votre programme sur le terrain de System.out
.
Il brise la loi, car il utilise « plus d'un point », et expose le fait qu'il utilise un autre objet pour l'appel println.
Non.
System.out
est une variable globale.
Plus formellement, la loi de Déméter pour les fonctions exige qu'une méthode m d'un objet O ne peut invoquer les méthodes des types de suivants Objets: [2]
- O lui-même
- paramètres m
- Tous les objets créés / instancié dans les m
- O objets composante directe
- Une variable globale, accessible par O, dans le cadre de m <- Celui
Par la règle 5, vous pouvez invoquer toute méthode de la System.out
variable globale à partir de tout contexte.