Base
別のタイプのインスタンスを作成する必要がある基本クラスがありますが、それらを構築する方法を知っているTRequired
のは派生クラスだけです。Base
ファクトリメソッドとして抽象プロパティを使用するのは悪いスタイルですか? 例えば
protected abstract TRequired NewTRequired { get; }
何らかの理由でメソッドを使用する必要がありますか? ここでプロパティを使用する必要がある/使用しない理由のガイドはありますか?
Base
別のタイプのインスタンスを作成する必要がある基本クラスがありますが、それらを構築する方法を知っているTRequired
のは派生クラスだけです。Base
ファクトリメソッドとして抽象プロパティを使用するのは悪いスタイルですか? 例えば
protected abstract TRequired NewTRequired { get; }
何らかの理由でメソッドを使用する必要がありますか? ここでプロパティを使用する必要がある/使用しない理由のガイドはありますか?
このメンバーにアクセスすると何らかの処理が行われるため、必ずメソッドを使用する必要があります。メソッドの呼び出しは、その点でコード自体に語らせる良い方法です。
または、別の見方をしたい場合: メンバーの 2 つの後続のアクセスは、異なる結果を返します。驚きの最小化の原則に違反しないように、このような場合は常にメソッドを使用することをお勧めします。
これは変数の結果を読み取っているように見えますが、それNewTRequired
が (フィールドではなく) プロパティであることを知っていても、実際には任意のコードを実行していることもわかっています。
var prototype = Factory.NewTRequired;
prototype
私は、このコードをよく知っている読者でさえも簡単に忘れてしまう可能性があることをよりよく示すために、呼び出された変数に意図的に結果を入れましたNewTRequired
。 . その読者は、次のようなコードの結果にきっと驚かれることでしょう。
var eq = object.ReferenceEquals(prototype, Factory.NewTRequired);
これをファクトリーメソッドと対比してください。今、このコードはわずかな臭いを放つかもしれません:
// hmmm... are we actually using this as a prototype?
// because it sure looks like an instance created just for the occasion.
var prototype = Factory.NewTRequired();
そして、このコードは決してあなたを驚かせることはありません:
// obviously should be false, the code screams "I am creating new instances!"
var eq = object.ReferenceEquals(Factory.NewTRequired(), Factory.NewTRequired());
このルールに従うべきであるにもかかわらず従わなかった有名な例は、DateTime.Now
プロパティです。
代わりに次の方法をお勧めします。
protected abstract TRequired CreateRequired();
創造とは、「仕事」が発生することを意味します。プロパティ ゲッターは通常、多くのコードを実行せずにすばやく返されるものを意味するため、これはメソッドよりもプロパティに適しています。
あなたの質問のタイトル「ファクトリメソッドとしてのプロパティ」でさえ、ファクトリメソッドはメソッドであるべきであることを意味します。
プロパティは、オブジェクトの場所など、フィールドに「似ている」もの用に設計されています。
取得するたびに新しいインスタンスを返すプロパティは、非常に貧弱な設計です。
代わりにメソッドを使用する必要があります。