なぜDataMapperの継承対ミックスインを使用していますか?
-
19-09-2019 - |
質問
だから私はこのことについて、単に興味ます:
DataMapperのは、そのモデルのためのミックスインを使用しています。
class Post
include DataMapper::Resource
アクティブ・レコードは継承を使用していますが、
class Post < ActiveRecord::Base
DataMapperのはそれをそのように(あるいは、なぜARがないことを選んだ)を行うことを選んだ理由を誰もが知っていますか?
解決
私はアイデアはActiveRecordのは、それがその動作を継承するように、データベースバックアップされた側面は、モデルクラスの重要な特徴であると考えていることだと思います。 DataMapperのは、それがデータベースだけでクラスに追加することができ、クラスの側面であることを担保していると考えるように見えます。
これは私の推測です。イェフダカッツは決定的にあなたを伝えることができます。
他のヒント
それはあなたがDMクラスではない別のクラスから継承することができます。
また、その場でクラスにDMの機能を追加することができます。ここで私は今働いているモジュールからのクラスメソッドがあります:
def datamapper_class
klass = self.dup
klass.send(:include, DataMapper::Resource)
klass.storage_names[:default] = @table_name
klass.property(:id, DataMapper::Types::Serial)
klass.property(:created_at, DateTime, :nullable => false)
klass.property(:updated_at, DateTime, :nullable => false)
columns_with_types { |n, t| klass.property(n, t, :field => n.to_s) }
klass
end
これは私は(非常に軽量)SAXMachineクラスを取り、その場でDataMapperのクラスにそれを回すと、それにDataMapperyものを行うことができます。あなたも、それへのオブジェクトのシングルトンクラスにできた。
私は/ <(私は大量の輸入のためのDMを使用していない)私はXMLから100Kオブジェクトをインポートしていたときに、これは私のメモリフットプリントを下げることを想像するのが好き、と私はそれらを必要なときにのみ、より複雑なデータベース機能に混ぜますP>
DataMapperのパターンは、ドメイン・オブジェクト・モデルは、スキーマから発散することを可能にする層を提供することを目的とします。 ActiveRecordのオブジェクトモデルとリレーショナルデータベース構造を統一する。
あたり Martin Fowler氏でます:
オブジェクトとリレーショナルデータベースは、構造化データのための異なるメカニズムを持っています。そのようなコレクションや相続などのオブジェクトの多くの部分は、リレーショナル・データベースに存在しません。あなたがビジネスロジックの多くのオブジェクトモデルを構築する場合には、優れたデータとそれに行く行動を整理するためにこれらのメカニズムを使用して貴重なのです。そうすることバリアントスキーマにつながります。つまり、オブジェクト・スキーマとリレーショナル・スキーマが一致しません。
あなたはまだ2つのスキーマ間でデータを転送する必要があり、このデータ転送は、それ自体で複雑になります。メモリ内のオブジェクトは、リレーショナルデータベースの構造について知っている場合は、1の変化は、他に波及する傾向があります。
データマッパーは、データベースからメモリ内のオブジェクトを分離するソフトウェアの層です。その責任はお互いからそれらを分離するためにも2との間でデータを転送することです。データマッパーでは、メモリ内のオブジェクトは、データベースの存在があるとさえていることを知っている必要はありません。彼らはSQLインターフェースコード、および確かにデータベーススキーマの知識を必要としません。 (データベーススキーマは、常にそれを使用するオブジェクトの無知である。)は、マッパー(473)の形なので、データ・マッパー自体は、ドメイン層にも不明である。
これは本当に継承v.s.を選択する問題です作曲ます。
クラスとオブジェクトを構築するより自然な方法であることが表示される私は個人的に構図を好むます。
作曲をあなたのクラスに含めるビヘイビア何をより細かく制御できます。継承のためとして、あなたはすべてまたは何もいずれかを取得します。組成物は、あなたが望む行動を選ぶ桜することができます。
ActiveRecordのは本当に継承を使用するのではなく、モデル/クラスに行動(主に持続性)を追加するためのモジュールを含むべきではありません。 ActiveRecordのは、単に間違ったパラダイムを使用しています。
同じ理由で、私は非常にMongoMapperオーバーMongoIdのような、それは開発者に問題のドメインで意味のある何かをモデル化する方法として継承を使用する機会を残しているためます。
これは、Railsのコミュニティのほとんど誰もがそれがはずの方法は、使用する「Rubyの継承」を使用していないことを悲しいです - 。クラス階層を定義するには、単に動作を追加していない