0

私のプログラムは、コマンドラインで渡されたパラメーターを使用してオブジェクトをインスタンス化します。これらのパラメータを使用してオブジェクトをインスタンス化できる必要がありますが、作成する必要があるのは1回だけです。私はこれらの投稿12を読みましたが、どちらのアプローチが優れているのかまだわかりませんでした。

1 - var myInstance = MyClass.Instance.Create("param1", "param2");

また

2 - var myInstance = MyClass.Instance;
    myInstance.setParam1("param1");
    myInstance.setParam2("param2");

最初のアプローチでは、渡されるパラメーターの異なるペアごとに新しいインスタンスCreateが作成されます。Createこれを防ぐ唯一の方法は、作成されたインスタンスを返すフラグを内部に設定することです。

MyClass2番目のアプローチでは、のコンストラクターがとに依存する場合、問題はどうparam1なりparam2ますか?

それで、あなたは何を提案しますか?

4

3 に答える 3

1

最初のアプローチも使用できます。

MyClass.Instance.Create("param1", "param2")

わずかな違いがありますが、必要に応じて、次のように名前付きパラメータを使用すると、パラメータが必須ではなくなる可能性があります。

MyClass.Instance.Create(param1 = "param1", param2 = "param2")

したがって、(呼び出し中に)パラメーターを使用することをまったく避け、宣言で提供されるデフォルト値を使用することができます。

于 2013-02-17T16:50:49.147 に答える
0

私は:

  • パラメータを受け取るパブリックコンストラクタを使用して不変Configクラスを作成します
  • Config ParseCommandLine(string)コマンドラインをConfigオブジェクトに変換する静的メソッドを作成します。

    これは純粋関数(副作用やグローバル状態なし)であるため、これをテストするのは簡単です。

  • 実際のコマンドラインを取得して上記のメソッドを呼び出す静的メソッドConfig ParseCommandLine()(グローバルな可変状態にアクセスするため、少し見苦しい)
  • 最後に、「シングルトン」Config.SetInstance(ParseCommandLine())のプロパティをバックアップするために使用します。Instanceこれは少し醜いですが、シングルトンを使用することはそもそも醜いです。

この「シングルトン」は、実際には単一の構成があることを強制するものではありませんが、デフォルトのインスタンスに近いものです。私の経験では、実際のシングルトンが必要になることはめったになく、デフォルトのインスタンスでさえ一種のハックです。

あなたはこのようなものになってしまうでしょう:

public class Config
{
    public string Param1{get;private set;}
    public int Param2(get;private set;}

    public Config(string param1, int param2)
    {
        Param1=param1;
        Param2=param2;
    }

    // take a string[] if you prefer to use Environment.GetCommandLineArgs
    public Config ParseCommandLine(string commandLine)
    {
        string param1=...;
        int param2=...;

        return new Config(param1:param1, param2:param2);
    }

    public Config ParseCommandLine()
    {
       return ParseCommandLine(Environment.CommandLine);
    }
}

また、静的Instanceプロパティを破棄して、それを必要とするオブジェクトに構成を挿入することも検討します。しかし、過剰に設計されている可能性のある小さなプログラムの場合。

于 2013-02-17T17:04:24.270 に答える
0

あなたの場合、シングルトンを使用しない方が良いです。

シングルトンの意図:

  • クラスのインスタンスが1つだけ作成されていることを確認してください。
  • オブジェクトへのグローバルアクセスポイントを提供します。

http://www.oodesign.com/singleton-pattern.html

1つのインスタンスのみが許可されるようにする必要がある場合は、プライベート静的属性をフラグとして使用します。

アップデート:

public class MyClass {

    private static boolean isAlreadyInitiated = false;

    public MyClass() {
        if(isAlreadyInitiated){
            throw new IllegalStateException("Only one instance allowed.");
        }
        isAlreadyInitiated = true;
    }
}
于 2013-02-19T17:34:13.370 に答える