2016-07-28 36 views
-2

Also habe ich ein paar Klassen wie MainWindow, MenuPanel, GamePanel, GameEngine, Player und so weiter ...Java: Instanz wirklich besser als statisch?

Meine Frage ist, obwohl ich viel über statische vs Instanz gelesen habe, die mehr empfohlen werden sollen, zu verwenden, , sieht eine meiner Linien nach wie folgt aus: MainWindow.getGamePanel().getPlayer1().getName().toLowerCase().compareTo(...);

oder MainWindow.getGamePanel().getLabels()[0].getIcon();

glauben Sie, das ist eine gute Praxis ist so hart versucht, nicht Statik zu verwenden, wo jedes Objekt unterschiedliche Eigenschaften und sind die Dinge nicht hat t verallgemeinert, anstatt vielleicht die labels oder die players und names statische deklarieren und eine viel einfach zu wiederverwenden und Code lesen?

Die Idee ist, ich diese langen Codes verwendet, weil sicherlich wäre es peinlich sein, ein GamePanel(visuelle Klasse) Objekt in der Player(mehr wie ein logischen) Klasse zum Beispiel zu erstellen. Also habe ich gerade wie ein Objekt jeder Klasse in MainWindowerstellt (nicht die Hauptklasse, nur die JFrame-Klasse) und erstellt static getters für jeden von ihnen.

+3

Ich habe viel Mühe zu erzählen, was Sie beschreiben ... es klingt, als ob Sie Ihren Code auf eine sehr seltsame Weise strukturiert haben. 'MainWindow.getGamePanel(). GetPlayer1(). GetName(). ToLowerCase(). CompareTo (...);' sieht mir sehr verdächtig aus ... es sieht so aus als ob du immer noch alles mit statischen Referenzen machst, du einfach Verwenden Sie eine statische Methode auf oberster Ebene, die eine bestimmte Instanz zurückgibt. Es ist schwer zu sagen, ohne mehr von Ihrem Code zu sehen, aber ich wette, dass die Dinge neu strukturiert werden könnten, so dass Sie diese langen Zugriffsketten überhaupt nicht benötigen. –

+2

Zeilen wie 'MainWindow.getGamePanel(). GetPlayer1(). GetName(). ToLowerCase(). CompareTo (...);' kann auch durch schlechtes Design verursacht werden, nicht _just_ durch Verwendung von Instanzen. –

Antwort

7
MainWindow.getGamePanel().getPlayer1().getName().toLowerCase().compareTo(...); 

Dies ist eine klassische Verletzung des Law of Demeter, manchmal ausgedrückt „fragen, schauen Sie nicht.“ Die Klasse, die diese Getter aufruft, hat zu viel Wissen über die Gesamtstruktur des Programms, was sie spröde macht. Wenn sich die Beziehung zwischen einer dieser Klassen ändert, wird der gesamte Code, der auf diesen verketteten Gettern beruht, unterbrochen.

Die Idee hinter "ask, do not look" ist, dass die Klasse, die diese Getter aufruft, um den Spielernamen zu erhalten, stattdessen den Spielernamen als Konstruktorparameter benötigen sollte. Wenn das zu einem Konstruktor mit einer großen Anzahl von Parametern führt, verletzt die Klasse wahrscheinlich die Single Responsibility Principle.