2009-05-17 4 views
5

Je me demande simplement si ce qui suit est considéré comme une bonne pratique de programmation ou non? J'aime garder mes fichiers source individuels aussi concis et concis que possible, mais je me demande ce que les codeurs les plus expérimentés penseraient. J'aime particulièrement l'idée de la classe Settings.java pour conserver tous mes "numéros magiques" au même endroit. Quelqu'un at-il des suggestions sur la façon dont je pourrais améliorer les choses?Java - Est-ce une bonne pratique de programmation?

:-) Bonne codage

class ApplicationLauncher 
{ 
    public static void main(String[] args) 
    { 
     SwingApplication mySwingApplication = new SwingApplication(); 
    } 
} 

////////////// 

import javax.swing.*; 

public class SwingApplication extends JFrame 
{ 
    public SwingApplication() 
    {  
     JFrame myJFrame = new JFrame(); 
     myJFrame.setSize(Settings.frameWidth, Settings.frameHeight); 
     myJFrame.setVisible(true);  
    } 
} 

////////////// 

class Settings 
{ 
    static int frameWidth = 100; 
    static int frameHeight = 200; 
} 
+4

Vous pouvez formater le code par par quatre indenter espaces. Cela peut être automatisé en sélectionnant le code et en appuyant sur ctrl-k. À votre santé. – Stephan202

+0

Merci. Je m'habitue toujours au fonctionnement de ce site. Je vais garder à l'esprit ce que vous avez dit pour l'avenir. –

Répondre

6

Il n'y a rien de mal à avoir une classe de paramètres; Cependant, dans votre exemple, les paramètres sont plutôt ambigus en termes de cadre auquel ils s'appliquent, ils ne sont pas non plus des paramètres réels, mais plutôt des valeurs par défaut qui appartiennent strictement à la classe SwingApplication.

Une autre chose sur laquelle nous n'avons pas beaucoup de contrôle est la manière dont le constructeur appelle les cascades Swing dans la boucle de pompage du message du programme.

Pour moi, cela n'a jamais été logique avec un constructeur qui ne retourne jamais (sauf si le cadre est fermé) et fait plus qu'initialiser un objet.

5

avec des classes spéciales ayant des nombres magiques en tant que membres statiques est une bonne pratique de Java. Au fur et à mesure que les programmes se développent, plusieurs classes de paramètres, chacune avec des noms descriptifs, peuvent être utilisées.

3

Macker l'a bien couvert. De plus, le faire de cette façon vous permettra, à l'avenir, de déplacer facilement certains paramètres dans les préférences réelles de l'utilisateur afin qu'ils puissent personnaliser différentes parties du programme. Puisque tous vos paramètres sont déjà isolés dans leurs propres classes, cela nécessitera un minimum d'effort de votre part.

4

Certains aiment regrouper tous ces trucs, les nombres magiques etc ... dans un gros fichier XML moche qui sera lu (et compris) à l'exécution. Votre approche est évidemment acceptable pour un petit projet (par exemple cours général) mais pensez à l'avantage évident d'obtenir ces paramètres à partir d'un fichier XML: vous n'aurez pas besoin de recompiler votre code source pour refléter les modifications apportées à vos paramètres :)

+3

ou un fichier de propriétés – digitaljoel

2

Je pense que cela peut être une bonne pratique tant que les paramètres ne sont pas susceptibles de changer et que vous documentez la relation entre les paramètres. Si ceux-ci sont susceptibles de changer, alors les fichiers de configuration et/ou les arguments de ligne de commande ont plus de sens, car ils ne nécessitent pas de recompilation.

4

Vous utilisez ce que certains appellent "l'antipattern de l'interface des constantes redoutées", bien que généralement les constantes soient dans une interface importée. Cela ne me pose aucun problème, surtout depuis l'avènement des importations statiques, mais peut-être que quelqu'un nous parlera des terribles maux. L'un d'eux semble être "ce n'est pas ce que sont les interfaces".

plus préoccupant est que vous devriez commencer votre interface graphique dans un thread:

//Schedule a job for the event-dispatching thread: creating 
    //and showing this application's GUI. 
    SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame myJFrame = new JFrame(); 
       myJFrame.setSize(Settings.frameWidth, Settings.frameHeight); 
       myJFrame.setVisible(true); 
      } 
     }); 
+2

L'antipattern définissait une interface, puis l'importait, sans l'utiliser comme une classe statique comme celle-ci. Les importations statiques ont particulièrement rendu inutile l'importation et l'interface, tout comme "ce n'est pas ce que sont les interfaces". –

1

Mutable sont une statics très mauvaise idée. Stick avec "Paramétrage d'en haut".

Il a été directement demandé, mais l'exemple de code a d'autres problèmes. Vous avez étendu JFrame (une mauvaise pratique), mais ensuite ignoré cela et créé un autre JFrame à utiliser réellement. De plus, vous devez inclure la plaquette standard pour toujours accéder aux composants Swing sur le Thread Thread Dispatch (EDT) AWT.

2

Si vous utilisez des statistiques pour vos nombres magiques, assurez-vous qu'elles sont également finales, si vous voulez qu'elles ne changent pas.

+0

Faites attention! Si elles sont finales, le compilateur copiera les valeurs dans le code qui les référence (comme une optimisation). Cela signifie que si vous changez les valeurs des constantes, vous devez recompiler tout le code qui utilise ces constantes! (Ceci est particulièrement mauvais si les constantes sont dans un pot séparé) –

0

Une autre solution, qui ne nécessite pas d'importations statiques, serait de créer une classe "ApplicationSettings" complète avec champs, getters et setters, et de passer une instance de cette classe au constructeur de la classe qui a besoin des paramètres. Cela vous permet de conserver un objet de configuration qui peut facilement être conservé ou modifié si vous souhaitez enregistrer la nouvelle taille si l'utilisateur redimensionne la fenêtre, par exemple.

4

Comme d'autres l'ont dit, cela est tout à fait bonne pratique, mais il y a certaines choses que vous pouvez faire pour améliorer le code:

  • donner à la classe Settings un constructeur sans argument privé. Cela rend impossible l'instanciation et rend plus clair son intention en tant que référentiel de constantes.
  • Les paramètres doivent être final (immuable) ainsi que static.
  • En règle générale, les constantes dans Java sont écrites LIKE_THIS plutôt que likeThis.
  • Si vous utilisez Java 1.5 ou supérieur, vous pouvez utiliser import static Settings.FRAME_WIDTH; dans vos classes pour pouvoir utiliser directement FRAME_WIDTH au lieu de devoir écrire Settings.FRAME_WIDTH.

Cela vous finit avec:

class Settings 
{ 
    /** Do not instantiate! */ 
    private Settings() {} 

    static final int FRAME_WIDTH = 100; 

    static final int FRAME_HEIGHT = 200; 
} 
+2

Soyez prudent! Si elles sont finales, le compilateur copiera les valeurs dans le code qui les référence (comme une optimisation). Cela signifie que si vous changez les valeurs des constantes, vous devez recompiler tout le code qui utilise ces constantes! (Ceci est particulièrement mauvais si les constantes sont dans un bocal séparé) –

+0

Wow, je ne le savais pas, mais cela explique certaines choses que j'avais précédemment accusées sur NetBeans. Je pense toujours qu'ils devraient être rendus définitifs pour l'amour de la santé. – Zarkonnen

Questions connexes