質問
を始めた時は、プログラミングに書いたもの主なものです。していましたが、もともと学びたいなっ 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()
?はありません-シルバ?
の時間!
解決
私の意見では、「メイン」大規模なプロジェクトには、約3つの関数呼び出しが含まれている必要があります。
- アプリケーションに必要なすべての設定、設定などを設定する初期化関数を呼び出します。
- メインの「コントローラー」の起動アプリケーションの
- メインコントローラが終了するのを待ってから、「main」でクリーンアップする必要があるものをすべてクリーンアップする終了関数を呼び出します。 (ただし、コントローラーはほとんどのクリーンアップをすでに処理しています)。
サイズの大きいアプリケーションは、通常いくつかの階層を持つ機能のチャンクに分割されます。メインコントローラーには、特定の機能のために複数の子コントローラーがある場合があります。
この方法で行うと、特定の機能を見つけるのがはるかに簡単になり、懸念の分離が優れています。
もちろん、他の回答が言っているように、ソフトウェア開発に特効薬はありません。短いプロジェクトの場合、物事をすぐに実行できるようにするために、すべてをmainに入れます。言語にも依存すると思います-一部のオプションは特定の言語の他のオプションよりも簡単かもしれません。
他のヒント
メイン関数のコード:
- 単体テストはできません。
- インジェクションによって依存関係を受信できません。
- 最初に作成したアプリケーションと同様の他のアプリケーションでは再利用できません。
したがって、メイン関数のコード:
- 機能テスト/システムテストのみに満足できるように、シンプルにする必要があります。
- 他のすべてのコードで使用される依存関係のボールローリングを設定する必要があります(つまり、メインはアプリケーションを作成する超工場のように機能します)。
- アプリの設定方法に固有のことだけを行う必要があります(つまり、テストコードまたはデモバージョンがまったく同じ方法で行う必要はありません)。
実際には、これは実際のアプリには主に多くのものがないことを意味します。玩具アプリとワンショットプログラムは、いずれにしてもテストや再利用を計画していないため、メインにかなり多く含まれている可能性があります。
実際、上記で述べたことの一部はC ++固有のものです。もちろん、Javaメインメソッドは、テストコードまたはバリアントアプリによって呼び出すことができます。ただし、オブジェクトはパラメーターとしては使用せず、コマンドライン引数のみを使用するため、テスト下でオブジェクトを分離したり、再利用に関して適切に動作したりする程度は非常に低くなります。クラス名を渡してインスタンス化し、アプリの残りの作成に使用できると思います。
[編集:誰かが" C ++、Java"を削除しましたこの質問のタグ。だから、私が上で言ったことは、C ++とJava固有です。他の言語はmainをそれほど特別ではない方法で処理する場合があります。その場合、特別に処理する特別な理由はないかもしれません。]
彼らが言うように、あなたのボートに浮かぶものは何でも。 :)これを達成するために必要なツールを使用して、コードをシンプルで読みやすく、効率的にすることに真剣に取り組む必要があります。 mainに多くのコードを配置する必要がある場合-そうします。オブジェクトが物事をより組織的にするだろうと思うなら、そのようにしてください。
class Main
の単一のインスタンスを作成してから、すべての作業を行うインスタンスメソッド Main()
を呼び出すことは、mainメソッドにすべてを直接書き込むのと同じくらい良いです。
すると思うのではないからメイン機能が、どのようなります。によって複雑なプロジェクトは、通りを少し入った場所で機能部のように"データベース"、"表示機能"、"高い茶のVicar"など。
すべては読みやすくするための工夫コードです。できる人、見たことのないプログラムの前の出来で、最初に、節うたっているか。
を簡単に以下を参照してください掘り少し深めのメカニズムは?
各機能部を使うだけの論理ブロックプロセス?いるだけでなくこれでよいはずがありませんう すべ プラス、キッチンのかけ流し。
Break downコードとなるようにしてくださいの維持による外部ソースです。
原因は天知る、ことがよく伝わってくるので、よければそちらもどうぞ-他で不具合を修正しましたのではない=)
としての質問に直接お答えする答えは、私の関数呼び出しをそれぞれの主要部品をメインに、プロジェクトが設定し、工程や仕上げ、ないですがどのようにプログラムです。もしドリルダウンからは、この提案のなお書きが必要です。
見て、" main"の内容と形式メソッドは言語と環境に大きく依存します。 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()関数を呼び出すことです。キャッチされなかったすべての例外をキャッチし、プログラムが終了する前にそれらで例外的なことをします。
メインメソッドで、プログラムの起動時の動作を説明する必要があります。 したがって、初期化メソッドを呼び出すことができますが、ロジックをメソッドに抽出する必要があります。
あなたの例では、Main()メソッドを作成しませんが、元のメソッドに入れます。
プログラムの設計により、「メイン」の形状が決まります。
"ルール"それはあなたの主な機能がどうあるべきかということです-私見-ナンセンス。
誰かがあなたのプログラムがどのように動作するかを知りたい場合、最初に見えるのはおそらくメインです(少なくとも私はそうするでしょう)。ですから、できる限り少なくするのは良い考えだとは思いません。しかし、私はあなたのプログラムがどのように機能するかの鳥瞰図を得るために必要なものをできるだけ少なくしたいと思います。
したがって、メイン関数を実装する際の最大の懸念は読みやすさです。