6

私がプログラミングを始めた当初は、すべてを main で書きました。main()しかし、私が学んだように、私は自分の方法でできるだけ少なくしようとしました.

しかし、どこから他のクラス/メソッドにプログラムを引き継ぐ責任を与えることにしましたmain()か? どのようにしますか?

私は次のように、それを行う多くの方法を見てきました。

class Main
{
  public static void main(String[] args)
  {
    new Main();
  }
}

そしていくつかのような:

class Main {

   public static void main(String[] args) {

    GetOpt.parse(args);

    // Decide what to do based on the arguments passed
    Database.initialize();
    MyAwesomeLogicManager.initialize();
    // And main waits for all others to end or shutdown signal to kill all threads.
  }
}

ですべきこととすべきでないことはmain()? それとも銀の弾丸はありませんか?

時間をありがとう!

4

8 に答える 8

17

メイン関数のコード:

  • 単体テストはできません。
  • インジェクションで依存関係を受け取ることはできません。
  • 最初に作成したものと同様の他のアプリケーションで再利用することはできません。

したがって、メイン関数のコード:

  • 機能/システム テストのみに満足できるほど単純である必要があります。
  • 他のすべてのコードで使用される依存関係のボール ローリングを設定する責任を負う必要があります (つまり、main は、アプリケーションを作成する uber-factory のように機能します)。
  • アプリの設定方法に固有のことだけを行う必要があります (つまり、テスト コードやデモ バージョンでまったく同じ方法で行う必要があるものはありません)。

実際には、これは実際のアプリには main があまりないことを意味します。おもちゃのアプリやワンショット プログラムは、いずれにせよテストや​​再利用を計画していないため、主にかなりの量を持っている可能性があります。

実際、上で述べたことのいくつかは C++ 固有のものです。もちろん、Java のメイン メソッドは、テスト コードまたはバリアント アプリから呼び出すことができます。しかし、それらは依然としてオブジェクトをパラメーターとしてとらず、コマンドライン引数のみを受け取るため、テスト中に分離できる範囲、または再利用に関して適切に動作する範囲は非常に低くなります。クラス名を渡してインスタンス化し、残りのアプリを作成するために使用できると思います。

[編集: 誰かがこの質問から「C++、Java」タグを削除しました。つまり、上記の内容は C++ および Java 固有のものです。他の言語では main をそれほど特別ではない方法で処理する場合がありますが、その場合、それを特別に処理する特別な理由はないかもしれません。]

于 2008-11-28T12:25:57.133 に答える
7

私の意見では、大規模なプロジェクトの「メイン」には、約 3 つの関数呼び出しが含まれている必要があります。

  • アプリケーションに必要なすべての設定、設定などを設定する初期化関数を呼び出します。
  • アプリケーションのメイン「コントローラー」の起動
  • メインコントローラーが終了するのを待ってから、「メイン」でクリーンアップする必要があるものをすべてクリーンアップする Termination 関数を呼び出します (ただし、コントローラーは既にほとんどのクリーンアップを処理しています)。

大規模なアプリケーションは、通常、いくつかの階層を持つ機能のチャンクに分割されます。メイン コントローラーには、特定の機能用に複数の子コントローラーが含まれる場合があります。

このようにすると、特定の機能を見つけるのがはるかに簡単になり、関心の分離が改善されます。

もちろん、他の回答者が言っているように、ソフトウェア開発に特効薬はありません。短いプロジェクトでは、物事を迅速に立ち上げて実行するためだけに、すべてをメインに置くかもしれません。言語にも依存すると思います-特定の言語では、一部のオプションが他のオプションよりも簡単な場合があります。

于 2008-11-28T10:46:13.117 に答える
4

彼らが言うように、あなたのボートに浮かぶものは何でも。:) これを達成するために必要なツールを使用して、コードをシンプルで読みやすく、効率的にすることに本当に集中する必要があります。多くのコードをメインに配置する必要がある場合は、そうしてください。オブジェクトが物事をより整理できると感じたら、その方法で行ってください。

の 1 つのインスタンスを作成してから、すべての作業を行うclass Mainインスタンス メソッドを呼び出すMain()ことは、メイン メソッドにすべてを直接記述することと同じくらい優れています。

于 2008-11-28T10:41:36.607 に答える
2

それはあなたの主な機能にあるものではなく、そうでないものだと思います。プロジェクトの複雑さに応じて、「データベース機能」、「表示機能」、「牧師とのハイティー」などの機能セクションに分割する必要があります。

コードの読みやすさがすべてです。あなたのプログラムを見たことのない他の誰かが、そのプログラムに出くわし、最初にそのプログラムが何をするかについて一般化された良いアイデアを得ることができるでしょうか?

次に、メカニズムをもう少し深く掘り下げるためにどこに行くべきかを簡単に確認できますか?

使用する各機能セクションは、プロセスの論理ブロックのみを実行していますか? 1 つのことだけを行う必要はありませんが、台所の流しに加えてすべてを行うべきではありません。

外部ソースが保守できるようにコードを分割します。

天が知っている原因は、結局のところ、誰かがバグを修正できる場合、それはすべて良いことです =)

あなたの質問への直接的な答えとして、メイン、セットアップ、プロセス、および仕上げの各主要コンポーネントへの関数呼び出しを配置し​​て、それを見た人がプログラムの動作の概要をすばやく把握できるようにします。その後、必要に応じてさらにドリルダウンできます。

于 2008-11-28T10:55:58.307 に答える
2

「メイン」メソッドの内容と形式は、言語と環境に大きく依存しています。Java では、すべてのクラスがメソッドを持つことができるため、複数のpublic static void main()メソッドを持つことは完全に実行可能です。

しかしここで、パルナスのモジュール化の法則に従ってこれについて考えてみましょう。「すべてのモジュールには秘密が隠され、その秘密は変更できるものです。」最初に呼び出されるモジュールの「秘密」は、プロセスとオペレーティング システムとのインターフェイスの詳細です。引数の取得や不規則な終了の処理などです。Python では、これは次のようになります。

def main(args=None):
    #argument processing
    #construct instances of your top level objects
    #do stuff

if __name__ == "__main__":
   try:
      main(Sys.Argv)
   except: # everything
      # clean up as much as you can
   else:
      # normal cleanup, no exceptions

ここでのポイントは、環境から可能な限りすべてを取得してから、main() 関数を呼び出すことです。キャッチされていないすべての例外をキャッチし、プログラムが終了する前にそれらに対して何かインテリジェントなことを行います。

于 2008-12-08T02:08:32.987 に答える
0

メインメソッドは、プログラムが起動時に何をするかを説明する必要があると思います。したがって、初期化メソッドを呼び出すことはできますが、ロジックはメソッドに抽出する必要があります。

あなたの例では、 Main() メソッドを作成しませんが、元のメソッドに入れます。

于 2008-11-28T10:38:37.517 に答える
0

プログラムの設計によって、「メイン」の形が決まります。

あなたの主な機能がどうあるべきかを言う「ルール」を持つことは - 私見 - ナンセンスです。

于 2008-11-28T10:55:51.693 に答える
0

誰かがあなたのプログラムがどのように機能するかを理解したい場合、おそらく最初に見るのは main であることを覚えておいてください (少なくとも私はそうします)。ですから、できるだけ少なくするのは得策ではないと思います。しかし、プログラムがどのように機能するかを俯瞰するのに必要な最小限のものを配置するようにします。

したがって、メイン関数を実装する際の最大の関心事は読みやすさだと思います。

于 2008-12-08T02:40:47.867 に答える