2009-05-19 20 views
0

私は現在、例としてClientOrderとProducts Tableという2つのテーブルを持っています。 LINQのを使用して、私はクライアントのオーダーによって 1.検索を実行したいすべてのクエリを記述することができました クライアント名2.検索 製品名 プロダクトID 4.検索ここでどのようなデザインパターンが提案されていますか?

I 3.検索上記の各クエリのメソッドを作成する必要があります。 ?どんなパターンがここに適していますか?ファクトリパターンは、それぞれのオブジェクトが同じデータコンテキストを使用することがわかっているので、法案に適合していないようです。

4つの静的メソッドを使用して静的クラスを作成する方が賢明ですか?

注:私は

答えて

2

あなたが使うべきものをデザインパターンわからない場合、あなたはより良いものを使用していないと思いプログラミングの世界と初心者で5ヶ月です!この非常に単純なケースでは、私はdesingパターンが提供できるどんな有用な付加も考えることができません。おそらく、4つのクエリとその結果を制御する関数を実装する方法を知りたいだけでしょうか?

+0

バ、 私は静的メソッド/クラスを実装することができます。私はコミュニティから、どのパターンを使用するのか、なぜそれを使用するのかをよりよく理解したかったのです。おそらく、私はプログラミングの世界と初心者で5ヶ月ということを付け加えておいたほうがいいでしょう。 –

+0

+1 - このような状況で実装するよりも 'パターン'が優れていません。必要なメソッドでクラスを作成します。一度それが大きくなりすぎる/複雑になるとリファクタリングします。 –

0

私はおそらく、メソッドをインスタンスメソッドとして持つ単純なクラス(たぶんシングルトン)を探し、それをデータアクセスレイヤーと呼んでいます。必要なデータベースに対してインスタンス化し、適切な方法で必要なものだけをLINQします。

1

静的メソッドでクラスを拡張することをお勧めします。次のようなもの

IEnumerable<Client> Client.GetByName(String Name) { } 

IEnumerable<Product> Product.GetByName(String Name) { } 

Product Product.GetById(Guid Id) { } 

私はあなたがエンティティにSQLまたはLINQにLINQを使用すると仮定し、あなたが簡単に生成された部分calssesを拡張することができます。コレクションやインスタンスを返却した場合、IEnumerableIQueryableIListListなど、必要に応じて選択した場合。

+0

こんにちは@DanielBrückner! ドメインオブジェクトの実装をクエリロジックで汚染しない方が良いと思いませんか?つまり、私にとっては、別のオブジェクトにクエリを処理する責任を与えることが理にかなっています。 また、サブクラスの静的メソッドをオーバーライドすることもできないため、クラスの拡張性を制限しています。どう思いますか? – nick2083

2

私はMartin FowlerのPatterns of Enterprise Application Architectureがデータベーステーブルへのアクセスの構造を学習するのに役立つことを発見しました。これらのパターンの一部はhereと記載されています。

単純なタスクでは、4つの静的メソッドを持つ1つのクラスが完全に合理的に聞こえます。しかし、独自の静的メソッドクラス(および標準命名規則を使用)で各テーブルへのすべてのアクセスをパッケージ化するFowlerのテーブルデータゲートウェイパターンを考慮する必要があります。

2

すべての最初に、ファクトリメソッドパターンの意図を確認してみましょう:

オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがインスタンス化するクラスを を決めましょう。ファクトリメソッドは、クラスがサブクラスに対して のインスタンスを延期することを可能にします。

問題に該当しますか?クエリを管理する方法について、ドメインオブジェクトの作成よりも心配しています。

IMHO、私は静的なクラス/メソッドを含む実装の代替方法を避けます: 静的なクラスから継承することはできませんので、モデルの拡張性を制限しています。非静的クラスの静的メソッドも同じです。サブクラスではオーバーライドできません。

これらのクエリメソッドをドメインオブジェクトに追加することはありません。現実の世界をモデル化するためにOOPを使用していることを覚えておいてください。注文を他の注文を検索するように求めるのは意味がありますか?

実際のところ、特定の情報(日付、顧客の名前または製品)を取得するために注文を使用します。注文を探したいときは、どこに保管してもそれを探す(ファイルキャビネットなど)。つまり、他の注文を検索するために注文を使用しません。

これを念頭において、この状況をソフトウェアでモデル化する必要があります。あなたはすでに注文と製品をモデル化したオブジェクトを持っています。あなたが欠けているのは、注文を保存して検索するために使用する場所をモデル化するオブジェクトです。

一般に、これらの種類のオブジェクト(他のオブジェクトを保存または取得する)はリポジトリと呼ばれます。あなたの場合は、ClientOrderRepositoryという名前にすることができます。 このオブジェクトは何をしますか?さて、すでに言及しました。あなたが必要とする4つの異なるクエリを実行します。のは、そのインターフェイスのための可能な定義を見てみましょう:

public interface IClientOrderRepository { 
    ClientOrder FindOrderWithIdMatching(int anOrderId); 
    ClientOrder FindOrderWithClientNameMatching(string aClientName); 
    ClientOrder FindOrderWithProductNameMatching(string aProductName); 
    ClientOrder FindOrderWithProductIdMatching(string aProductId); 
} 

あなたはシングルトンパターンを使用することができ、このインタフェースを実装するクラスのインスタンスを1つだけ持っている必要がある場合。後で変更することが困難な実装の選択肢(静的メソッドのようなもの)に頼らないでください。

最後に、問題を解決する特定のパターンが見つかったとしても、オブジェクトと、タスクを完了するための共同作業の仕方について考えてみることをお勧めします。実生活のメタファを使用して、欠落しているオブジェクトや責任を満たす必要があるかどうかを見つけ出すのに役立ちます。結局のところ、それはオブジェクト指向のパラダイムの本質に関するものです。リポジトリのパターンについてより深い情報については

、ここにあなたが始めるためにいくつかのリソースは次のとおりです。

+1

さらに柔軟性を持たせるために、次のようなものを追加することもできます。 'IEnumerable Find(述語クエリ)'。 –

+0

もちろん、それは素晴らしいアドバイスです!私は@umbが彼がプログラミングでは新しいと言ったので、私は物事をまとめることを望まなかったので、私は概念的なものにもっと集中しようとしたのです。 – nick2083

関連する問題