2016-04-18 5 views
2

laisse supposer que j'ai des classes planète et Star et classe GameLogic de la manière suivante"Bridging" (Connexion) méthodes entre les classes distantes

//Planet.java 
package Game; 

class Planet //invisible outside of package 
{ 
    public String getType() {return "Im a Planet";} 
} 

.

//Star.java 
package Game; 

class Star //invisible outside of package 
{ 
    public String getType() {return "Im a Star";} 
} 

.

//GameLogic.java 
package Game; 

public class GameLogic //notice the PUBLIC keyword 
{ 
    //arrayList of stars 
    //arrayList of planets 

    //a ton of methods for the logic of the game itself 
} 

Tout cela appartient au jeu Game qui ne traite que la logique du jeu sans aucune entrée/sortie. Puis, dans un package différent appelé UI, j'ai la classe Text (UI.Text) qui contrôle les entrées de l'utilisateur, imprime la sortie et a un accès direct au GameLogic car le jeu ne peut être joué qu'en créant une instance de GameLogic classe.

//Text.java 
package UI; 
import Game.*; 

public class Text 
{ 
    //some control vars 

    //MAIN method 
    //input and output methods 
    //bla bla bla 
} 

Donc, la question est la suivante: Le jeu sera instancié dans Text.java en créant une instance GameLogic. Compte tenu de cela, si je voulais sortie les fonctions getType() de Star et Planète, je dois terminer à la « route » qui relie Texte avec Planet/Star de la manière suivante

//GameLogic.java 
package Game; 

public class GameLogic 
{ 
    //same as before 

    public String getPlanetType(int n) {return planetArrayList.get(n).getType();} 
    public String getStarType(int n) {return starArrayList.get(n).getType();} 
} 

En bref, la Les méthodes getType() existent déjà dans une classe "trop ​​lointaine", ce qui me force à créer ces méthodes "bridge" simples et répétitives pour connecter les deux extrémités.

Version TL-DR:

class A has getType() 

class B has array of A 

class C needs to access getType() from array of A in B 

Je crois que c'est une méthode consommant très inefficace et le temps et qu'il ya une meilleure alternative (impliquant éventuellement des interfaces?), Donc si quelqu'un pouvait me donner un peu d'aide , Je serais très reconnaissant.

Merci

+1

en savoir plus sur * La loi de Demeter *, comment vous évitez de le casser, est au cas par cas, mais mon ** avis ** est que vous ne devriez pas revenir ils tapent comme ça mais directement l'objet concerné. –

+2

Pourquoi Star et Planet ne sont-ils pas publics si la classe Text en a besoin? En d'autres termes, si A a besoin d'informations sur C, il ne devrait pas passer par B, il devrait simplement avoir directement accès à C. C'est la "Loi de Demeter". –

+0

@ChrisWohlert Ceci est pour un projet de collège et il est nécessaire de séparer l'interface utilisateur et la logique de jeu dans des paquets distincts, je suppose pour nous apprendre à rendre notre code aussi générique et adaptable que possible. Bien que cela ne soit pas obligatoire, j'ai choisi de ne faire qu'une seule classe publique, donc en important le paquet Game, vous ne pouvez qu'instancier le jeu lui-même à travers une seule classe. – joaoA

Répondre

1

Ne croyez quoi que ce soit en ce qui concerne la performance.

La seule chose qui compte est la réalité.

Et en réalité, le JIT transformera le plus souvent vos tentatives de micro-optimisation à l'envers. Signification: ne vous inquiétez pas des performances (trop) jusqu'à ce que vous voyiez de vrais problèmes. Si vous avez des problèmes, commencez par en mesurant au lieu de faire des suppositions. Au lieu de cela: se concentrer sur des conceptions bonnes et propres; suivez les principes SOLID; et écrire un code propre, lisible et maintenable. Cela paiera cent fois plus que de s'inquiéter de telles subtilités.

(et juste pour vous donner un exemple: une méthode getType() qui retourne une chaîne ressemble déjà à une conception cassée a envisagé d'utiliser énumérations Ou encore plus étrange:.? Vous vous rendez compte que seul en utilisant des classes différentes, vos objets ont différents types?)

Et si vous pensez toujours que vous devriez regarder dans la performance, que commencer par lire sur le JIT, comment cela fonctionne, ce qu'il fait, et ainsi de suite.

+0

J'apprécie la réponse d'une tonne, et doit en effet regarder plus dans le concept SOLIDE. La fonction getType() retournant une chaîne n'était qu'un vague exemple, en passant, c'est pour un projet de collège en Java. J'ai déjà beaucoup de connaissances et de flexibilité en matière de POO, bien que j'essaie de combler certaines lacunes dans ces connaissances. Il est à la fois drôle et triste que les utilisateurs de stackoverflow soient de meilleurs professeurs que ceux dont je paie les salaires. Merci! – joaoA

+0

Vous êtes les bienvenus. – GhostCat