現在受け入れられているエンタープライズ アプリケーションの設計パラダイムのメリットについて、率直で思慮深い議論が必要です。
エンティティ オブジェクトが存在する必要があるとは確信していません。
エンティティ オブジェクトとは、"Person"、"Account"、"Order" など、アプリケーション用に構築する傾向がある典型的なものを意味します。
私の現在のデザイン哲学は次のとおりです。
- すべてのデータベース アクセスは、ストアド プロシージャを介して行う必要があります。
- データが必要なときはいつでもストアド プロシージャを呼び出し、SqlDataReader または DataTable の行を反復処理します。
(注: 私は Java EE を使用してエンタープライズ アプリケーションも構築しました。Java 関係者は、私の .NET の例を同等のものに置き換えてください)
私はアンチOOではありません。エンティティだけでなく、さまざまな目的のために多くのクラスを作成します。私が作成するクラスの大部分が静的ヘルパー クラスであることは認めます。
私はおもちゃを作っているわけではありません。私が話しているのは、複数のマシンに展開された大規模で大量のトランザクション アプリケーションです。Web アプリケーション、Windows サービス、Web サービス、B2B インタラクションなど。
OR マッパーを使用しました。いくつか書きました。私は Java EE スタック、CSLA、およびその他の同等のものをいくつか使用しました。私はそれらを使用するだけでなく、実稼働環境でこれらのアプリケーションを積極的に開発および保守してきました。
私は、実体オブジェクトが私たちの邪魔をしているという実戦テスト済みの結論に達しました.私たちの生活はそれらがなければずっと楽になるでしょう.
次の簡単な例を考えてみましょう。アプリケーション内の特定のページが正しく機能していないというサポートの電話を受けました。フィールドの 1 つが本来あるべきように永続化されていない可能性があります。私のモデルでは、問題を見つけるために割り当てられた開発者は、ちょうど 3 つのファイルを開きます。ASPX、ASPX.CS、およびストアド プロシージャを含む SQL ファイル。ストアド プロシージャ呼び出しのパラメーターが欠落している可能性があるこの問題は、解決するのに数分かかります。しかし、どのエンティティ モデルでも必ずデバッガーを起動し、コードのステップ実行を開始すると、Visual Studio で 15 ~ 20 個のファイルが開かれることになります。スタックの一番下に降りる頃には、どこから始めたか忘れてしまいます。私たちは一度に多くのことを頭の中に入れておくことができます。ソフトウェアは、不要なレイヤーを追加することなく、信じられないほど複雑です。
開発の複雑さとトラブルシューティングは、私の不満の 1 つの側面にすぎません。
次に、スケーラビリティについて話しましょう。
開発者は、データベースとやり取りするコードを作成または変更するたびに、データベースへの正確な影響を徹底的に分析する必要があることを認識していますか? 開発コピーだけでなく、本番環境の模倣を意味するため、オブジェクトに必要な列を追加すると、現在のクエリ プランが無効になり、1 秒で実行されていたレポートが 2 分かかることがわかります。選択リストに単一の列を追加したためですか?また、現在必要なインデックスが非常に大きいため、DBA がファイルの物理レイアウトを変更する必要があることがわかりましたか?
抽象化によって物理的なデータ ストアから離れすぎると、スケーリングが必要なアプリケーションに大混乱が生じます。
私は熱狂者ではありません。Linq から Sql、ADO.NET EF、Hibernate、Java EE などへの強力な推進力があるため、私が間違っているかどうかは確信できます。それが何であるか、そしてなぜ私が自分の考えを変える必要があるのか を本当に知りたい.
[編集]
この質問が突然再びアクティブになったようです。そのため、新しいコメント機能が追加されたので、いくつかの回答に直接コメントしました。返信ありがとうございます。これは健全な議論だと思います。
エンタープライズ アプリケーションについて話していることをもっと明確にするべきだったでしょう。たとえば、誰かのデスクトップで実行されているゲームやモバイル アプリについては、コメントできません。
いくつかの同様の回答に応えて、私がここで一番上に挙げなければならないことの1つは、直交性と関心の分離がエンティティ/ ORMに移行する理由としてしばしば引用されることです。私にとって、ストアド プロシージャは、私が考えることができる懸念の分離の最良の例です。ストアド プロシージャ以外のデータベースへのアクセスをすべて許可しない場合、ストアド プロシージャの入力と出力を維持している限り、データ モデル全体を理論的に再設計しても、コードを壊すことはありません。これらは、コントラクトによるプログラミングの完璧な例です (「select *」を避け、結果セットを文書化する限り)。
この業界に長く携わっていて、寿命の長いアプリケーションを扱ってきた人に尋ねてみてください。データベースが存続している間に、いくつのアプリケーションと UI レイヤーが行き来しましたか? データを取得するために SQL を生成する 4 つまたは 5 つの異なる永続レイヤーがある場合、データベースを調整してリファクタリングするのはどれほど難しいでしょうか? あなたは何も変えることはできません!ORM または SQL を生成するコードは、データベースをロックします。