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


12

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

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

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


6
他に何ができますか?
パブ

回答:


11

友だちが指摘しているのは、アプリケーションはmainメソッドによってのみブートストラップされるべきであり、それ以上は何もしないということです。mainメソッドを独自のクラスに含めることにより、アプリケーションロジックから独立した状態に保つことで、その事実を単純に強化できます。メインメソッドの役割は、入力を解析し、それらの入力、およびおそらく他の入力でアプリケーションを初期化することです。

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

考え方は、初期化するためにmainメソッドは必要ないということですFoo。これによりFoo、異なるセマンティクスを使用して、別のコンテキストで簡単に初期化および開始できます。

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

7

main()メソッドは、手続き型プログラミングへのnい先祖返りであり、アプリケーションへのエントリポイントを提供します。それをカプセル化するためにさまざまなプログラミング言語で試みられますが、その性質上、これは難しくなります(パブリックで静的である必要がありますが、プログラム内の他のいかなるものからも呼び出してはなりません。これは非常に矛盾しています)。WPFは成功しました(WPFアプリケーションプロジェクトの奥深くからmain()を隠し、カスタム処理のための構成可能な「フック」を提供しました)。Java(Androidアプリの場合も同様)が、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()は、オブジェクト指向のイベント駆動型アプリケーションを「準備完了」状態にするために、できるだけ少なくする必要があります。


同意しません。main再帰など、他のコンテキストから呼び出すと便利です。
-DeadMG

4
個人的に、メインメソッドを繰り返し使用する場合は、代わりに別のメソッドを呼び出して繰り返し実行する必要があると思います。最も単純なコンテキスト(おおよそ宿題レベルの複雑さ/難易度のコンソールアプリ)でのみ、プログラム内からmain()を呼び出すことは受け入れられます。私はそれを些細な状況と呼びます。
キース

1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.