11

バックグラウンド:

これが私が現在取り組んでいるもののコードです。まず、アカウントに関する情報を保持するアカウント クラスであり、ほとんどの部分でクラスのプロパティの値を変更するいくつかのメソッドを持つ基本クラスです。

public class Account {
    private string _username; [...]

    public string Username { get { return _username; } } [...]

    public Account() { }

    public Account(string[] args) { [...] }

    public virtual void ChangePassword(string newPassword) { [...] }
}

次に、アカウントが作成されたときの別のクラスを用意し、これを ActiveAccount と名付けました。これには、アカウントが作成された後にのみ可能になる、アカウントに使用したいアクションのロジックのほとんどが含まれています。質問を説明するために含める必要のないクラスもあります。想像力を働かせて、これらのクラスが何をするかを想定してください。

public class ActiveAccount : Account
{
    private List<Conversation> _conversations; [...]

    public List<Conversation> Conversations { get { return _conversations; } } [...]

    private ActiveAccount() { }

    public static ActiveAccount CreateAccount(Account account)
    {
        // Navigate to URL, input fields, create account, etc.
    }

    public override void ChangePassword(string newPassword)
    {
        // Navigate to URL, input fields, change password, etc.

        // Update property using base method, if no errors.
        base.ChangePassword(newPassword);
    }
}

静的ファクトリ メソッドを使用した理由は 2 つあります。1) カスタマイズ可能で拡張可能なオブジェクトの構築が必要です (たとえば、将来、アカウントを作成するための一般的な情報を提供する AccountTemplate を使用する可能性があります。AccountTemplate パラメーターを使用して、別の静的ファクトリ メソッドのオーバーロードを簡単に作成できます)、および 2 ) パラメーターなしのコンストラクターを使用すると、このオブジェクトをより簡単に XML/JSON にシリアル化できます。

質問:

しかし、Account パラメーターを受け取り、ロジックを実行し、オーバーロードで簡単に拡張できるパブリック コンストラクターを同じように簡単に作成できることに気付きました。パラメーターなしの構築を防ぎ、シリアル化を許可するために、パラメーターなしのプライベート コンストラクターを保持できます。

私はプログラミングにかなり慣れていません。私が疑問に思っているのは、上記で説明したように、パブリック コンストラクターの代わりに静的ファクトリ メソッドを使用する特定の理由があるかどうかです。そして、私がやりたいことをするための好ましい方法は何ですか?

4

3 に答える 3

0

いつ静的ファクトリメソッドを優先する必要があるか、いつコンストラクターを優先する必要があるかについて、私の考慮​​事項があります。

1) コンストラクターでは実行できない追加のアクション/初期化を実行する必要がある場合は、静的ファクトリ メソッドを使用します。たとえば、新しく作成したActiveAccountオブジェクト (例: SomePublicList.Add(ActiveAccount);) を公開する必要がある場合、独自のコンストラクター内から公開するのは悪い習慣です。

2) 継承について考えます。の子孫クラス (例: NewActiveAccout)を作成する必要がある場合ActiveAccountは、非プライベート コンストラクターを で提供する必要がありますActiveAccount。その場合、ファクトリ メソッドよりもコンストラクタを優先する必要があるかもしれません。

3) いくつかのパラメーターを基本クラス ( ) コンストラクターに渡す必要がある場合は、静的ファクトリ メソッドから基本クラス コンストラクターにパラメーターを渡すことができないためAccount、コンストラクターを実装する必要があります。ActiveAccount

于 2014-03-06T12:10:26.520 に答える