web-dev-qa-db-ja.com

メインメソッドは、オブジェクトの作成とメソッドの呼び出しのみで構成する必要がありますか?

私の友人は私に、ベストプラクティスはmainメソッドを含むクラスはMainという名前で、mainメソッドのみを含むことだと私に言った。また、mainメソッドは、入力を解析し、他のオブジェクトを作成し、他のメソッドを呼び出すだけです。 Mainクラスとmainメソッドは他に何もすべきではありません。基本的に、mainメソッドを含むクラスは次のようになるべきだと彼が言っていること:

public class Main
{
    public static void main(String[] args)
    {
        //parse inputs
        //create other objects
        //call methods
    }
}

それはベストプラクティスですか?

12
user

あなたの友人が言っている点は、アプリケーションは単にmainメソッドによってブートストラップされるべきであり、それ以上のものではないということです。 mainメソッドを独自のクラスに含めることにより、アプリケーションロジックから独立させることで、その事実を強化するだけです。 mainメソッドの役割は、すべての入力を解析し、それらの、場合によっては他の入力を使用してアプリケーションを初期化することです。

public static void main(String[] args){
    new Foo().start(args[0]);
}

アイデアは、Fooを初期化するためにneed mainメソッドを使用しないことです。これにより、Fooを別のコンテキストで簡単に初期化して開始できます。

public Foo initSomewhereElse(String arg){
    Foo f = new Foo();
    f.start(arg);
    return f;
}
11
Jeremy Heiler

Main()メソッドは醜い 手続き型プログラミングへの逆戻り。アプリケーションへのエントリポイントを提供します。さまざまなプログラミング言語でカプセル化する試みが行われていますが、その性質上、これは困難です(パブリックで静的である必要がありますが、プログラム内の他のものから呼び出さないでください。非常に矛盾しています)。 Javaと同じように(Androidアプリの場合と同様に)、WPFアプリケーションプロジェクトの奥深くにmain()を隠し、構成可能な「フック」を提供することで、WPFが成功しました。 、しかしWinFormsと他のほとんどのタイプのアプリはまだmain()を扱うようにさせます。

そのため、ほとんどの専門家は、main()関数のLOCは可能な限り低くする必要があると述べています。 main()関数が1行のアプローチが1つあります(少しやり過ぎだと思います)。

public class Program
{
   private Program(string[] args)
   {
      //parse args and perform basic program setup
   }

   //Reduce the ugliness to the absolute minimum
   public static void main(string[] args)
   {
      new Program(args).Run();  
   }

   private void Run()
   {
      //kick off the driving O-O code for the app; i.e. Application.Run()
   }    
}

これは少し多いですが、私は基本原則に同意します。 main()は、オブジェクト指向のイベント駆動型アプリケーションを「準備完了」状態にするために、可能な限り少なくする必要があります。

7
KeithS

関数をサポートする言語では、mainは通常の関数なので、ユーザーが言ったこと以外にそれを使ってできることはありません。そしてそこに ばかげた すべてをオブジェクトにすることを優先して関数を捨てる言語、つまり 関数が必要になるたびに、不要なクラスにラップする必要があります

まあ、十分なとりとめ。私が言おうとしている点は、Mainは実際にはクラスではなく関数であるため、入力を解析し、他のオブジェクトを作成し、他のメソッドを呼び出すだけでよいのです。できる。

1
Pubby