私の長くて遅い回答、完全ではありませんが、この説明、意見、さらにはいくつかの感情が嫌いな理由についての良い説明:
1)ショートバージョン:Active Recordは、データベースとアプリケーションコードの間に「強い結合」の「薄層」を作成します。これは、論理的、何の問題も、まったく問題を解決しません。私見それはプログラマーのためのいくつかの構文糖(リレーショナルデータベースに存在するいくつかのデータにアクセスするために「オブジェクト構文」を使用するかもしれません)を除いて、いかなる値も提供しません。プログラマーに快適さをもたらす努力(IMHO ...)は、低レベルのデータベースアクセスツールに投資する必要があります。たとえば、シンプルで簡単なプレーンな類似のメソッドのバリエーション(もちろん、コンセプトとエレガンスは、使用される言語)。hash_map get_record( string id_value, string table_name, string id_column_name="id" )
2)長いバージョン:私が物事の「概念的コントロール」を持っているデータベース主導のプロジェクトでは、ARを回避し、それは良かった。私は通常、レイヤードアーキテクチャを構築します(少なくとも、中規模から大規模のプロジェクトでは、ソフトウェアをレイヤーに分割します)。
A1)データベース自体、テーブル、リレーション、DBMSで許可されている場合はいくつかのロジック(MySQLも成長しています)
A2)非常に多くの場合、データストア以上のものがあります。ファイルシステム(データベース内のブロブが常に適切な決定であるとは限らない...)、レガシーシステム(それらがアクセスされる「方法」を自分で想像してください。ポイントではありません...)
B)データベースアクセスレイヤー(このレベルでは、ツールメソッド、データベース内のデータに簡単にアクセスするためのヘルパーは大歓迎ですが、ARはここでは値を提供しません。ただし、構文上の砂糖は除きます)
C)アプリケーションオブジェクトレイヤー:「アプリケーションオブジェクト」は、データベース内のテーブルの単純な行である場合がありますが、ほとんどの場合、それらはいずれにせよ複合オブジェクトであり、いくつかのより高いロジックがアタッチされているため、このレベルのARオブジェクトに時間を費やすことはまったく役に立たない、とにかく、これらのオブジェクトの「実際の値」、「より高いロジック」をARオブジェクトの上に実装する必要があるためです。また、たとえば、「ログエントリオブジェクト」の抽象化が必要なのはなぜですか。アプリのロジックコードはそれらを書き込みますが、それを更新または削除する機能を備えている必要がありますか?ばかげて聞こえ、App::Log("I am a log message")
使用するよりもはるかに簡単ですle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
です。たとえば、アプリケーションのログビューで「ログエントリオブジェクト」を使用すると、100、1000、または10000のログ行で機能しますが、遅かれ早かれ最適化する必要があります。ほとんどの場合、アプリのロジックで小さな美しいSQL SELECTステートメントを使用し(ARアイデアを完全に壊します)、多くのコードをラップして非表示にした固定の固定されたARアイデアフレームでその小さなステートメントをラップするのではありません。ARコードの作成や構築に費やした時間は、ログエントリのリストを読み取るためのはるかに優れたインターフェイスに費やされている可能性があります(多くの場合、多くの方法で、空が限界です)。彼らの意図する用途に合わせたアプリケーション・ロジック、および実現するため愚かなパターンを再実装するのではなくます。、それは一目で良い音!
D)アプリケーションロジック-相互作用するオブジェクトのロジックを実装し、アプリケーションロジックオブジェクトの作成、削除、リスト(!)を実装します(いいえ、これらのタスクはアプリケーションロジックオブジェクト自体に固定されることはほとんどありません。あなたのオフィスの他のすべてのシートの名前と場所は?オブジェクトをリストするための「静的」メソッドを忘れてください、それはばかげています。人間の考え方を[一部ではないすべてのARフレームワークのような-] ARの考え方)
E)ユーザーインターフェイス-ええと、次の行で書くのは非常に、非常に、非常に主観的ですが、私の経験では、ARに基づいて構築されたプロジェクトはアプリケーションのUI部分を無視することがよくありました-あいまいな抽象化の作成に時間を浪費しました。結局、そのようなアプリケーションは多くのコーダーの時間を浪費し、コーダーのためのコーダーからのアプリケーションのように感じられます。コーダーは気分が良く(紙のコンセプトに従って、ハードワークは最終的に完了し、すべてが完成し、修正されています...)、そして顧客は「それがそのようである必要があることを学ぶ必要があります」、それは「プロフェッショナル」だからです。わかりました、申し訳ありませんが、私は脱線します;-)
まあ、確かに、これはすべて主観的ですが、私の経験です(Ruby on Railsを除外しました。異なる場合があり、そのアプローチでの実践的な経験はありません)。
有料プロジェクトでは、より高いレベルのアプリケーションロジックのビルディングブロックとして「アクティブレコード」オブジェクトを作成することから始める要求をよく耳にしました。私の経験では、これは非常に頻繁に顧客(ほとんどの場合、ソフトウェア開発会社)が良いコンセプト、大きな見解、最終的に製品がどうあるべきかについての概要を持っていなかったというのは、一種の言い訳でした。これらの顧客は、固定フレーム(「10年前のプロジェクトではうまくいった」)を考え、エンティティを具体化したり、エンティティの関係を定義したり、データの関係を分解したり、基本的なアプリケーションロジックを定義したりするかもしれませんが、その後停止しますそれをあなたに渡して、あなたが必要とするすべてのものであると考えてください...彼らはしばしばアプリケーションロジック、ユーザーインターフェース、使いやすさなどの完全な概念を欠いています...彼らは大きな見方を欠いており、彼らへの愛情を欠いています詳細、そして彼らはあなたにそのARのやり方に従うことを望んでいます。知りません。しかし「詳細」男性と男の子を分けるか、元の広告のスローガンはどうだった?;-)
長年(10年間の積極的な開発経験)の後、顧客が「アクティブなレコードパターン」について言及するたびに、私の警報ベルが鳴ります。私は、彼らをその重要な概念フェーズに戻すように試みることを学び、彼らに2度考えさせ、彼らの概念的な弱点を示すように試みるか、または彼らが気にならない場合は結局それらをまったく避けようとします(結局、まだ知らない顧客それが何を望んでいるかを知っている、多分それは知っているがそうではないと思っている、または無料でコンセプトワークをMEに外部化しようとする、私の時間の多くの貴重な時間、日、週、月を費やしている、ライブは短すぎる...)
だから、最後に:このすべてが私がそのばかげた「アクティブレコードパターン」を嫌う理由であり、私はそうし、可能な限りそれを避けます。
編集:私はこれをノーパターンとさえ呼びます。問題は解決しません(パターンは構文糖を作成するためのものではありません)。それは多くの問題を引き起こします:すべての問題の根本(ここで多くの答えで述べられています..)は、それが単に隠すことです古き良きよく発達し、非常に限られたパターンの定義であるインタフェースの背後に強力なSQLを。
このパターンは柔軟性を構文糖に置き換えます!
考えてみてください。ARはどの問題を解決しますか?