私は新しいプロジェクトを開始していて、最近キャッスル プロジェクトのアクティブ レコードを見つけました。この感覚は何か新しいことを学んだことによるものでしょうか (それに慣れる必要があります)、それとも本当に悪い習慣なのでしょうか?
7 に答える
ActiveRecord の使用について私が奇妙に感じたのは、 から継承する必要がActiveRecordBase<T>
あり、オブジェクトにこれらすべての永続化メソッドを持っている (Save
など) ことでした。
しかし、そうする必要がないことがわかりました。持つ代わりに、次のように言います。
[ActiveRecord]
class Customer : ActiveRecordBase<Customer> { }
あなたはただ持つことができます
[ActiveRecord]
class Customer : inherit from whatever you want { }
を使用しますActiveRecordMediator<Customer>
。基本的に同じ静的メソッドがActiveRecordBase<T>
ありますが、この方法では、オブジェクト モデルをそれらで乱雑にする必要はありません。のさまざまな保護されたメソッド イベント フックが必要ない場合はActiveRecordBase<T>
、これにより作業が簡単になります。
ActiveRecordは、Martin Fowler がPatterns of Enterprise Application Architecturesで最初に命名した設計パターンです。これはかなり一般的で、人気のある Ruby フレームワーク Rails で広く使用されています。
これは、DAO を使用する .Net の世界でのより一般的な開発スタイルとは対照的であり、おそらくそれが不安な理由を説明しています。
提案: あなた自身のプロジェクトに似ているいくつかの Ruby on Rails アプリケーションのソース コードを読み、ActiveRecord を多用した結果のデザイン スタイルがどのように好きかを評価してください。
これは悪い解決策ではありませんが、欠点があります。
エンタープライズ アプリケーション アーキテクチャのパターンで、Martin Fowler は、データベース上に構築されるアプリケーションを設計する方法をいくつか説明しています。これらの方法は、アプリケーションをデータベースから切り離す方法が異なります。彼はまた、デカップリングが増えると、より複雑なアプリケーションが可能になると述べています。Active Record は、より単純なアプリケーションを設計する方法として説明されていますが、より複雑な動作をするアプリケーションでは、データベースから独立したドメイン モデルと、その間にあるオブジェクト リレーショナル マッパーのようなものが必要です。
ActiveRecord は Ruby で非常にうまく機能しますが、すべての言語に簡単に移植できるわけではありません。AR の中心的な偉業は、 table=class, row=instanceの比喩です。クラスはオブジェクトでもあるため、これは Ruby では非常に洗練されています。他の言語では、通常、クラスは特別な種類の構成要素であり、適切に機能させるにはあらゆる種類のフープを通過する必要があります。これにより、Ruby の持つ自然な感覚がいくらか失われます。
いいえ、それは悪い習慣ではありません。.NET でも、現在ではかなり確立されたパターンです。SubSonic ( http://subsonicproject.com ) と LINQ to SQL もこのパターンを使用します。
Subsonic などのパターンの実装は、アプリケーションの CRUD を管理するデータ アクセス レイヤーをすばやく簡単に作成するのに最適です。
これは、すべてのシステムに適したソリューションであるという意味ではありません。大規模で複雑なシステムの場合、おそらくデータ ストアへの結合を減らしたいと思うでしょう。
ドメイン オブジェクトとサービス レイヤーを混在させることは、最大の悪い習慣です (それを悪い習慣と見なす場合)。最終的に user.Save() を呼び出すことになります。つまり、ORM を変更したい場合は、このパターンに依存することになります。2つの選択肢は、CRUD操作を実行するためのレイヤー、別名ファサードクラスのセット、またはこれをドメインオブジェクト内に次のように配置することです
User.Service.Save(user);
.NET を使用している場合、ActiveRecord は明らかに ActiveRecord ベースの Coolstorage、Subsonicなどです。