私の長くて遅い答えは完全ではありませんが、なぜ私がこのパターン、意見、さらにはいくつかの感情を嫌うのかについての良い説明です。
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) 非常に多くの場合、データ ストア以上のものがあります。ファイル システム (データベース内の BLOB が常に適切な決定であるとは限りません...)、レガシー システム (アクセスされる "方法" を想像してみてください。多くの種類が考えられます。..重要ではありません...)
B) データベース アクセス レイヤー (このレベルでは、ツール メソッド、データベース内のデータに簡単にアクセスするためのヘルパーは大歓迎ですが、AR は、いくつかの構文糖衣を除いて、ここでは何の価値も提供しません)
C) アプリケーション オブジェクト レイヤー: 「アプリケーション オブジェクト」は、データベース内のテーブルの単純な行である場合もありますが、ほとんどの場合、とにかく複合オブジェクトであり、より高度なロジックが付加されているため、このレベルで AR オブジェクトに時間を費やすことは明らかに役に立ちません。 、貴重なコーダーの時間の無駄です。なぜなら、これらのオブジェクトの「真の価値」、「より高いロジック」は、とにかく、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) アプリケーション ロジック - オブジェクトを操作し、アプリケーション ロジック オブジェクトを作成、削除、および一覧表示するロジックを実装します (いいえ、これらのタスクがアプリケーション ロジック オブジェクト自体に固定されることはめったにありません。オフィス内の他のすべてのシートの名前と場所を知っていますか?オブジェクトをリストするための「静的な」方法を忘れてください、それはばかげて、人間の考え方を [some-not-all-AR-framework-like] -]AR思考)
E) ユーザー インターフェイス - ええと、次の行で書くことは非常に、非常に、非常に主観的ですが、私の経験では、AR で構築されたプロジェクトは、アプリケーションの UI 部分を無視することがよくありました - あいまいな抽象化の作成に時間が浪費されていました. 結局、そのようなアプリケーションは多くのコーダーの時間を無駄にし、コーダーからコーダーのためのアプリケーション、内外の技術に傾倒したアプリケーションのように感じました。コーダーは気分が良く (懸命な作業が最終的に完了し、すべてが完成し、紙のコンセプトに従って正しい...)、顧客は「そのようにする必要があることを学ぶ必要があります」。それが「プロフェッショナル」だからです..わかりました、すみません、脱線します;-)
確かに、これはすべて主観的なものですが、それは私の経験です (Ruby on Rails は除外されます。異なる可能性があります。また、そのアプローチに関する実際の経験はありません)。
有償プロジェクトでは、より高いレベルのアプリケーション ロジックのビルディング ブロックとして、いくつかの「アクティブ レコード」オブジェクトを作成することから始めるという要求をよく耳にします。私の経験では、これは際立って頻繁に顧客 (ほとんどの場合、ソフトウェア開発会社) が、製品が最終的にどうあるべきかについての優れたコンセプト、全体像、概要を持っていなかったことに対する、ある種の言い訳でした。それらの顧客は、厳格な枠組みで考え (「10 年前のプロジェクトではうまくいきました..」)、エンティティを肉付けし、エンティティの関係を定義し、データの関係を分解し、基本的なアプリケーション ロジックを定義するかもしれませんが、その後停止します。そしてそれをあなたに手渡し、必要なものはそれだけだと考えてください...彼らはしばしばアプリケーションロジック、ユーザーインターフェース、使いやすさなどの完全な概念を欠いています...彼らは全体像を欠き、詳細を説明し、彼らはあなたにその AR のやり方に従うことを望んでいます。なぜなら、何年も前にそのプロジェクトで機能したのに、人々は忙しくて沈黙していたからです。知らない。しかし、「詳細」男性と男の子を区別する、または..元の広告スローガンはどうでしたか? ;-)
長年 (10 年間の積極的な開発経験) を経て、顧客が「アクティブな記録パターン」について言及するたびに、私の警報ベルが鳴ります。私は彼らをその本質的な概念段階に戻そうとすることを学びました。彼らによく考えさせ、彼らの概念上の弱点を示すように試みます。または、彼らが見分けがつかない場合はまったく避けます (最終的には、まだ理解していない顧客です)。それが何を望んでいるのかを知っている、多分知っているが知らないと思っている、またはコンセプトワークを無料で私に外部化しようとしている、貴重な時間、日、週、月の時間を費やしている、ライブは短すぎる...)。
最後に、これが私がそのばかげた「アクティブ レコード パターン」を嫌う理由です。
編集:私はこれを No-Pattern とさえ呼びます。それは何の問題も解決しません (パターンはシンタックス シュガーを作成するためのものではありません)。それは多くの問題を引き起こします: そのすべての問題の根源 (ここで多くの回答で言及されています..) は、古き良きよく開発された強力な SQL を、パターン定義によって非常に制限されたインターフェイスの背後に隠していることです。
このパターンは、柔軟性をシンタックス シュガーに置き換えます。
考えてみてください。AR はどのような問題を解決してくれますか?