28 votes

Méthode principale Java, bon style de codage

J'ai eu une longue discussion avec un ami sur l'utilisation correcte et judicieuse de la méthode main en Java. En gros, nous avons une classe comme celle-ci :

public class AnImporter implements Runnable {
  // some methods, attributes, etc.
}

Mais où placer la méthode principale ? Je considère que c'est une bonne pratique de "garder le code là où il doit être", transformant ainsi le code ci-dessus en

public class AnImporter implements Runnable {
  public static void main(String [] args){
    // Startup code for Importer App here
  }
  // some methods, attributes, etc.
}

Alors que mon ami soutient que "le code de démarrage n'a rien à voir avec l'application elle-même", et qu'il devrait donc être placé dans une autre classe, comme ceci :

public class AnImporter implements Runnable {
  // some methods, attributes, etc.
}

public class AnApplication {
  // Nothing here
  public static void main(String [] args){
    AnImporter a = new AnImporter();
    // Startup code here
  }
  // Nothing here
}

Bien que nous ayons discuté de la question pendant un certain temps, nous n'avons pas réussi à déterminer quelle était la meilleure approche pour Java. Quelle est votre opinion sur ce sujet ? Où et surtout pourquoi placez-vous votre méthode principale là où vous l'avez placée ?

28voto

Clint Miller Points 6339

Je suis d'accord avec votre ami. Vous construisez un service potentiellement réutilisable dans AnImporter qui pourrait être utilisé dans plusieurs programmes avec plusieurs main. Donc, faire une main spéciale et l'intégrer dans AnImporter n'a pas beaucoup de sens.

13voto

digiarnie Points 4894

Je serais probablement d'accord avec votre ami car je préfère sortir de la classe avec la méthode principale le plus rapidement possible. Cela facilite les tests lorsque vous voulez tester de manière atomique (juste la classe exécutable) ou que vous voulez simuler des choses. Plus tôt vous sortez de la méthode principale, plus vous avez d'options. Si vous avez une classe avec la méthode principale et d'autres choses à l'intérieur, cela peut vite devenir compliqué. (même si cela ne semble pas être le cas avec un exemple simple comme celui que vous décrivez).

Mais je dirais que la lisibilité et la testabilité sont deux bonnes raisons de sortir de la méthode main (et de la classe qui l'englobe) dès que possible. Mais bon, ce n'est que moi ;)

9voto

cletus Points 276888

Je ne polluerais pas une classe Runnable avec une méthode main. Il en va de même pour pratiquement toutes les classes qui font quelque chose dans votre application. En général, j'ai une classe comme celle-ci :

public class App {
  public static void main(String args[]) {
    Thread t = new Thread(new Blah());
    t.start();
      synchronized (t) {
        t.wait();
      }
  }
}

public class Blah implements Runnable {
  public void run() {
    // do normal stuff
  }
}

au lieu de :

public class Blah implements Runnable {
  public void run() {
    // do normal stuff
  }

  public static void main(String args[]) {
    Thread t = new Thread(new Blah());
    t.start();
    synchronized (t) {
      t.wait();
    }
  }
}

C'est tout simplement plus propre.

6voto

Uri Points 50687

Je sépare toujours le code principal du reste du code, pour plusieurs raisons :

1) Un main est, en quelque sorte, un hack pour permettre à votre programme de démarrer à partir de la ligne de commande. Toute classe qui le contient devrait avoir une seule responsabilité : permettre au programme de démarrer à partir de la ligne de commande. En la plaçant avec votre exécutable principal, vous polluez l'exécutable.

2) Vous pouvez finir par avoir plusieurs réseaux (par exemple, avec certains paramètres par défaut, avec des modes spéciaux, etc.)

3) Vous pourriez finir par exécuter le programme à partir d'un environnement différent (par exemple, un plugin Eclipse ou un module OGSI, une applet, un outil basé sur le web, etc.) Dans ce cas, vous voudrez restreindre l'accès à votre programme principal. Le fait de le placer avec la fonctionnalité permet d'éviter cela.

4) Il est parfois plus facile de laisser le code principal dans le paquetage par défaut pour accélérer l'exécution (par exemple, java myblabla par1 par2 par3), mais vous ne voulez absolument pas que le reste de votre code soit dans le paquetage par défaut.

2voto

S.Lott Points 207588

L'interface avec main (une liste de chaînes de caractères) est à peu près inutile, sauf pour le shell du système d'exploitation.

Votre fichier principal doit contenir le moins de code possible.

En effet, votre public class ThisIsMyApp {...} ne devrait être rien d'autre que l'interface du système d'exploitation avec le véritable travail, qui se trouve ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X