私はデザイン パターンのスキルを磨こうとしているのですが、これらのパターンの違いは何なのか知りたいです。これらはすべて同じもののように見えます。つまり、特定のエンティティのデータベース ロジックをカプセル化して、呼び出しコードが基礎となる永続化レイヤーを認識しないようにするのです。私が簡単に調べたところ、これらはすべて、標準の CRUD メソッドを実装し、データベース固有の詳細を抽象化しています。
命名規則 (例: CustomerMapper と CustomerDAO と CustomerGateway と CustomerRepository) 以外に、違いがあるとすれば何でしょうか? 違いがあるとすれば、どちらを選択するのでしょうか?
以前は、次のようなコードを書いていました (当然ながら簡略化されています。通常はパブリック プロパティを使用しません)。
public class Customer
{
public long ID;
public string FirstName;
public string LastName;
public string CompanyName;
}
public interface ICustomerGateway
{
IList<Customer> GetAll();
Customer GetCustomerByID(long id);
bool AddNewCustomer(Customer customer);
bool UpdateCustomer(Customer customer);
bool DeleteCustomer(long id);
}
すべてのメソッドに特定のデータベース ロジックを実装するクラスを用意しますCustomerGateway
。インターフェイスを使用せず、CustomerGateway のすべてのメソッドを静的にすると (そうするとテストしにくくなることはわかっています)、次のように呼び出すことができます。
Customer cust = CustomerGateway.GetCustomerByID(42);
これは、データ マッパー パターンとリポジトリ パターンでも同じ原則であるように思われます。DAO パターン (ゲートウェイと同じものだと思います) も、データベース固有のゲートウェイを推奨しているようです。
何か見落としているのでしょうか? まったく同じことをするのに 3 〜 4 通りの方法があるというのは少し奇妙に思えます。
ベストアンサー1
例として挙げた用語、DataMapper、DAO、DataTableGateway、Repository はすべて目的が似ていますが (いずれかを使用すると、Customer オブジェクトが返されることを期待します)、意図/意味と結果として生じる実装は異なります。
あリポジトリ 「より複雑なクエリ機能を備えている点を除けば、コレクションのように動作します」[エヴァンス、ドメイン駆動設計] とみなされる可能性がある「メモリ内のオブジェクト ファサード」(リポジトリの議論)
あデータマッパー 「オブジェクトとデータベースの間でデータを移動しますが、それらを互いに、またマッパー自体から独立させておきます。」(ファウラー、PoEAA、マッパー)
あテーブルデータゲートウェイは「データベーステーブルへのゲートウェイ(外部システムまたはリソースへのアクセスをカプセル化するオブジェクト)。1つのインスタンスがテーブル内のすべての行を処理します。「(ファウラー、PoEAA、TableDataGateway)
あダオ 「データ リソースのクライアント インターフェイスをそのデータ アクセス メカニズムから分離する / 特定のデータ リソースのアクセス API を汎用クライアント インターフェイスに適合させる」許可する「データを使用するコードとは独立して変更できるデータ アクセス メカニズム」(太陽の青写真)
リポジトリは非常に汎用的で、データベースの相互作用の概念を公開していません。DAO は、さまざまな基盤データベース実装を使用できるようにするインターフェイスを提供します。TableDataGateway は、具体的には単一のテーブルを囲む薄いラッパーです。DataMapper は、モデル オブジェクトがデータベース表現とは独立して進化できるようにする仲介者として機能します (時間の経過とともに)。