2017-02-23 4 views
5

Lorsque je travaillais sur un de mes projets et que je devais utiliser beaucoup d'objets imbriqués, je suis devenu très incertain de ma conception de la structure en Java quand je voulais définir une variable d'instance d'un objet profondément imbriqué de l'objet supérieur. Il me semble que je manque une compréhension de base peut-être de la conception structurée en Java. Toute idée à ce sujet est appréciée. Imaginez que j'ai un objet qui a une structure logique d'avoir sous-objets imbriqués en tant que variables. Par exemple:java design: méthodes répétitives de sous-objets

Country 
    Capital 
    Palace 
     King 

Si je veux maintenant définir une chaîne variable privée « nameOfKing » à King de l'objet principal (Pays), je dois définir toutes les méthodes dans toutes les classes supérieures du roi. Donc, quelque chose comme ceci:

public class Country { 
    private Capital capital; 

    public void setNameOfKing(String n) { 
     capital.setNameOfKing(n); 
    } 
} 

public class Capital{ 
    private Palace palace; 

    public void setNameOfKing(String n) { 
     palace.setNameOfKing(n); 
    } 
} 

public class Palace{ 
    private King king; 

    public void setNameOfKing(String n) { 
     king.setNameOfKing(n); 
    } 
} 

public class King{ 
    private String nameOfKing; 

    public void setNameOfKing(String n) { 
     this.nameOfKing = n; 
    } 
} 

afin que je puisse appeler country.setNameOfKing(n);. Maintenant, c'est bien si vous avez juste quelques variables, mais que se passe-t-il si les classes King, Palace, Capital ont chacune de nombreuses autres variables et méthodes définies et doivent toutes être appelées depuis Country. Que se passe-t-il si Palace contient aussi d'autres objets comme ThroneRoom, Treasury, Queen, etc ... Cela signifie que pour presque toutes les méthodes des sous classes, il faut exister dans la classe Country, ce qui pourrait Cela signifie potentiellement que vous devez créer une énorme quantité de méthodes simplement pour transmettre des informations aux sous-objets résultant en une très grande classe de pays. Maintenant je suppose que techniquement on pourrait dire que King pourrait aussi être défini dans le pays lui-même, en supprimant les méthodes supplémentaires dans Palace et Capital, mais cela voudrait quand même dire que les méthodes doivent exister dans la classe Country et si cette structure a du sens car en logique groupée, quelle serait la meilleure approche pour cela? Je ne suis pas sûr qu'il y ait un meilleur moyen, mais je ne peux pas oublier que j'ai oublié quelque chose ici.

+0

donc 'getPalace(). SetFoo()' n'est pas une option? –

+0

Donc, vous voulez dire changer le methid dans la classe Country comme ça? 'capital.getPalace().setNameOfKing (n); 'Cela changerait le fait que vous pourriez potentiellement avoir une grande quantité de méthodes dans la classe Country – lokipoki

Répondre

4

Ceci est un problème de responsabilité.

Demandez-vous: "Qui est responsable de savoir qui est le roi?". Quand vous êtes un palais, êtes-vous responsable du roi? Évidemment pas. Le roi n'est pas dirigé par votre palais, mais il est attaché à votre pays par la loi.

Interroger palace.setNameOfKing() est similaire à demander à votre maison de donner un nom à votre nouveau-né. Votre maison n'a pas cette responsabilité et ne devrait pas être autorisée à le faire.

La méthode correcte consiste à récupérer l'instance King et à définir son nom directement.


Maintenant, il y a un problème avec cette approche: vous pouvez avoir à utiliser de nombreux apporteurs pour trouver l'instance King. Mais vous pouvez résoudre ce problème avec une approche fonctionnelle de vos classes.

palace.getOwner() peut renvoyer une interface Owner avec King implements Owner.

Les mêmes règles peuvent être appliquées à vos autres classes.

+2

Oui, c'est un problème de responsabilité et j'irais encore plus loin et je ne permettrais même pas de définir le nom du roi théoriquement partout en fournissant une méthode publique de réglage. –