4

Base別のタイプのインスタンスを作成する必要がある基本クラスがありますが、それらを構築する方法を知っているTRequiredのは派生クラスだけです。Base

ファクトリメソッドとして抽象プロパティを使用するのは悪いスタイルですか? 例えば

protected abstract TRequired NewTRequired { get; }

何らかの理由でメソッドを使用する必要がありますか? ここでプロパティを使用する必要がある/使用しない理由のガイドはありますか?

4

3 に答える 3

8

このメンバーにアクセスすると何らかの処理が行われるため、必ずメソッドを使用する必要があります。メソッドの呼び出しは、その点でコード自体に語らせる良い方法です。

または、別の見方をしたい場合: メンバーの 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プロパティです。

于 2013-07-15T22:02:24.747 に答える
5

代わりに次の方法をお勧めします。

protected abstract TRequired CreateRequired();

創造とは、「仕事」が発生することを意味します。プロパティ ゲッターは通常、多くのコードを実行せずにすばやく返されるものを意味するため、これはメソッドよりもプロパティに適しています。

あなたの質問のタイトル「ファクトリメソッドとしてのプロパティ」でさえ、ファクトリメソッドはメソッドであるべきであることを意味します。

于 2013-07-15T22:02:32.967 に答える
4

プロパティは、オブジェクトの場所など、フィールドに「似ている」もの用に設計されています。

取得するたびに新しいインスタンスを返すプロパティは、非常に貧弱な設計です。

代わりにメソッドを使用する必要があります。

于 2013-07-15T22:03:01.240 に答える