2009-07-06 12 views
4

コードレビューでは、vb.netのリポジトリクラスのセットを調べました。私はこれらのリポジトリクラスが、ドメインオブジェクトのコレクション(他のものの中でも)を返す関数でいっぱいであることに慣れています。しかし、このリポジトリは1つのパブリックプロパティを持っていたし、このようなものに見えた1つのプライベート変数:「取得」で関数の代わりにpublicプロパティを使用してカスタムコレクションを公開する理由<T>

Private _item as Collection (of Customer) 

Public Item as Collection (of Customer) 
    Get... 
    Set... 

を、DALから顧客を取得し、プライベート_itemでそれをロードするコードがあります。

単純な古い関数(customerRepository.GetAllCustomers)の代わりにプロパティ(customerRepository.Item)を使用する利点は何でしょうか? 「不動産」の方法は私にとって奇妙に見えますが、奇妙なことは常に間違っているとは限りません

+0

彼らはセッターで?それは質問のタイプミスですか? – jvanderh

+0

申し訳ありませんが、私は "取得"と言いましたが、実際には他のコードを呼び出すことを意味していました。開発者は、実際にDALにリーダーを呼び出すと、それをループして、_itemコレクション(セット内のすべて)を読み込みます。これは奇妙ですか? – EricCode

答えて

2

この例では、ゲッターはコレクション全体を返しており、ユーザーはコレクションから項目を取得できます。リポジトリパターンでは、リポジトリはコレクションであり、コレクションのセマンティクスでリポジトリとやり取りして、リポジトリに保持されるはずのエンティティの特定のインスタンスを取得します。

この実装の危険性は、このAPIのユーザーがコレクションを別のコレクションに置き換えることができることです。これは悪い練習です、私の意見では

+0

ありがとうございましたjlembke!プロパティが読み取り専用であれば、それは何か違いはありますか?または同様の懸念が存在するか? – EricCode

+0

それは、特定の弱点を助けるだろうが、私の意見では、RepositoryクラスにFind(int Id)のようなCustomerインスタンスを返すような特定のメソッドを与える方が良いです。私は内部のコレクションを完全に隠すだろう。 – jlembke

+0

リポジトリパターンの読み方をちょっと調べて、これがあなたがしようとしていることに合っているかどうか確かめることは価値があるかもしれません。ニースの質問。 – jlembke

0

Get(Setterの代わりに)に「DALから得意先を取得してプライベート_itemにロードするコードがある」という場合は、コードが完了したところでコードを見たことがありますがプライベート_itemがnullかどうかを確認するチェックです。これはキャッシュに変わり、最初にアクセスされたときにDALからのみ読み込まれます。それ以外の場合は、プライベート_itemから直接返されます。

もちろん、GetAllCustomers内でキャッシュシナリオを実行することもできます。

+0

はい、あなたは正しいです。私の悪い。ありがとうございます – EricCode

3

私は、あらゆる種類のDALにアクセスするセッターに操作を加えることは悪い習慣であることに同意します。操作は、あなたは、彼らが結果をキャッシュ考慮しなければならないユーザーに伝えたいことを十分に高価である

  • :とき

    MSDN Property Usage Guidelinesによると、メソッドを使用する必要があります。

  • getアクセサを使用してプロパティ値を取得すると、観察可能な副作用が発生します。

明らかに、上記のプロパティを使用すると、そのガイドラインに違反することになります。

+1

同じMSDNリンクから: メソッドを使用する...メンバーを2回連続して呼び出すと、結果が異なります。 これは、プロパティが呼び出されるたびにデータベースにアクセスするために発生する可能性があります。 db値が変更される可能性があります。 – EricCode

関連する問題