web-dev-qa-db-ja.com

クラスを使用するのではなく、Program.cs / mainにコードを書く正当な理由はありますか?

私はかなり大きなアプリケーションと技術リーダーに取り組んでいますが、特定の事柄に目を向けていません。

それらの1つは、コンソールアプリケーションに関するものです。これらのアプリケーションは、シェルスクリプトからC#に移植されています。これらのスクリプトの一部は適度に大きく(変換後300〜400行のコード)、I/O、電子メール、データベースアクセスなどを実行します。

これらのスクリプトごとに、クラスを作成しました。各クラスには、その中にあるすべてのメソッド/操作を呼び出すRunメソッドがあります。 Program.cs/main内で、上記のクラスのオブジェクトを作成し、Runを呼び出します。 Program.csには、4〜5行のコードが含まれています。清潔でシンプル。

私の技術リーダーは、スクリプトクラスを取り除き、program.csのメインメソッド内にすべてを入れたいと考えています。彼の推論は、それが現状ではあまりにも混乱しているということです。

Mainメソッドをいじる必要なしに、クラスがクラスライブラリに再利用可能/パッケージ化可能でなくなるため、この方法で行う必要があるのは厄介です。

Program.cs自体をインスタンス化できるため、単体テストは影響を受けていないように見えますが、これも不格好です。私が見ていない彼のやり方でそれをすることに何か利点はありますか?私のやり方で何かメリットはありますか?主な方法で大規模なアプリケーションやコンテンツを扱う場合の一般的な方法はありますか?

お時間をいただきありがとうございます。

28
JohnnySaxx

Mainメソッドをいじる必要なしに、クラスがクラスライブラリに再利用可能/パッケージ化可能でなくなるため、この方法で行う必要があるのは厄介です。

そうではありませんhaveそのようになります。

たとえば、各スクリプトは同じ構造を持つことができますが、またにはprivate static void Main(string[] args)メソッドがあります。 (必要に応じて非プライベートにすることもできます。すべてはニーズによって異なります。)

そうすれば、スタンドアロン(単一の入力として単一の出力にコンパイルしてから実行できます)で、便利な場合もありますが、クラスライブラリの一部として使用することもできますまたMainメソッドの存在は決して防止結局のところ、他のクラスから使用されているクラスです。

oneProgram.csファイルがあるのか​​、スクリプトごとに1つあるのかは明確ではありません。スクリプトごとに1つあり、それぞれが4〜5行しかない場合、それはやや無意味に思えます。

さて、これは確かに私が通常大規模なアプリケーションを構築する方法ではありません-しかし、ポイントがそれぞれがcanスタンドアロンで実行される複数の「スクリプト」を持つことである場合、各クラスにMainメソッドはそれほど悪くはないようです。

実際、私がよく行うことはdemoの目的で、単一のプロジェクトにMainメソッドを持つ複数のクラスがあり、次に個別のエントリポイント(isProgram.cs)では、リフレクションを使用して他のすべてを検索し、ユーザー/プレゼンターが実行するものを選択できるようにします。

すべてのコードを1つのクラスに含めることが理にかなっている場合は、小さな追加のエントリメソッドを使用してもそれほど問題にはなりません。 実際には単一のクラスに対してコードが多すぎる場合関係なくエントリポイントがどこにあるかは別の問題です。 (したがって、実際に異なるクラスに異なるタスクを与える必要があるときに、単一のScriptClassを持つことに固執した場合、それも悪いことです。)同様に、彼が本当にすべてのコードを単一にすることを主張している場合メソッド、それは間違いなくテストと保守性の問題です。

現時点では、エントリポイントの不一致を脇に置いておくことをお勧めします。コードについてすべてを構造化するための最もクリーンな方法を考えてくださいelseコードについては、Mainメソッドかどうかは実際には問題ではありません。 Program.csまたは別のクラス内に移動します。

35
Jon Skeet

コンソールアプリケーションのエントリポイントが構成可能であることをご存知ですか?

私の好みの方法は次のとおりです。

class MeaningfullyNamedProgram { 
    public static void Main(string[] args) {
        var program = new MeaningfullyNamedProgram(args);
        program.Run();
    }

    public MeaningfullyNamedProgram(string[] args) { 
    }

    public Run() {
        // well structured, broken-out code follows 
    }
}

プロジェクトのエントリポイントをMeaningfullyNamedProgram.Mainにポイントします

注:読者のための演習として残しておきますが、ジェネリックスを使用してこのための基本クラスを作成し、入力を節約することができます。

4
Troy Howard

正直なところ、あなたは自分のために作品を作っていると思います。説明の詳細からはわかりませんが、シェルスクリプトが機能している場合、構造が明らかに必要ない場所に構造化するのはなぜですか?

モジュール性と外部ライブラリへの再パッケージ化はあなたがしなければならないことだとあなたは言っています-私は「なぜ」に反論します。 (これは私が余分な仕事によって意味するものです)。

単一のファイルに単純なメソッドのセットを作成する場合、それは単一のファイルです!定義上、複数のプロジェクトなどで作業する方が簡単です。

そうは言っても、詳細がない限り、私たちが何について話しているのかを知るのは難しいです。それが「毎晩レポートを送信し、これらの人々に電子メールを送信する」場合-ええ、それはクラスライブラリと大量のモジュール性を必要としないものです。メソッドを実行すると、完了です。

4
user1151

あなたの技術リーダーは良い話をする必要があります!すべてをProgram.csに入れることは、前進する方法ではありません。

3
Swomble

まあ、彼の方法は、サブルーチンが発明される前にプログラムがどのように書かれたかという点で、概念的に単純です..。

あなたのやり方はより良いです:それは再利用性をサポートし、修正とデバッグがより簡単になるでしょう。

私が彼のやり方で考えることができる他の唯一の正当化は、あなたが彼のやり方でそれをするよりもあなたがそれをあなたのやり方で行うのにかなり長い時間がかかった場合でした。しかし、それは彼の側の短期的な思考の場合です。あなたのやり方は時の試練に耐えるでしょう。

3
Ann L.

あなたの技術リーダーは間違っています。提案する方法ははるかに合理的です。さまざまなスクリプトを簡単に統合できます。独自のMainメソッドを持つ各スクリプトは、特にこれらのいくつかを一度に実行できるアプリケーションを計画している場合は、扱いにくくなる可能性があります。

2
nickolayratchev

ロジックを個別のクラス(または複数のクラス)に分割するのが方法です。すべてを1つの場所にまとめると、SOLIDおよびDRY設計の原則に違反します。アプローチは間違いなく正しい方向に進んでいます。

クラスを単一の役割に集中させ続けるほど、メンテナンスとテストの生活が楽になります。

1
Mike Parkhill

コンソールプログラム以外の方法で機能を利用できる場合は、もちろん、適切にモデル化されたクラスライブラリにそれらを保持する必要があります。カプセル化された機能を使用してコマンドラインパラメータ処理をエンタンジェリングすることで数行のコードを節約することは、懸念が元々分離されていたという事実を考えると意味がありません。多分あなたの技術リーダーはあなたのためにもっと生産的なタスクを見つけるべきです私見。

1
Jack Wester