3

ここで哲学的な質問 OOP とデータベース、特にクラスがデータベースでバックアップされているプログラムに関しては、これにアプローチする最良の方法は何ですか? たとえば、チーム クラスには選手のコレクションが含まれる場合があります。プログラムは、起動時にデータベースからすべてのチーム データをロードし、メモリ内ですべての操作を行い、終了時にデータベースを書き込みます。それとも、変更が発生するたびに各データ操作をデータベースに書き込む方がよいでしょうか? これがより良い方法である場合、そもそもなぜデータをメモリにロードするのでしょうか?

もう 1 つの懸念は、データベースが 1 つの重要な点で標準の OOP を破っているように見えることです。OOP を使用して、プレイヤーのコレクションを含むチーム クラスを使用すると、プレイヤー クラスはチーム名を保持するためのプロパティを持つ必要がなくなります。プレーヤーは、メンバーであるチーム クラスからチーム名を取得します。ここで、プレーヤーをデータベースに保存するには、各プレーヤー レコードにチーム名 (またはチーム ID、ただし同じこと) の列が必要です。

つまり、GetAllPlayers() メソッドが必要な場合、チーム クラスのメンバー メソッドにして、コレクション内のすべてのプレーヤーをメモリから返すか、プレーヤー クラスで静的メソッドを作成してすべてのプレーヤーを取得しますか?データベースからのプレーヤー?

これらの質問に答える方法に関するヒントはありますか?

プログラミング教室に通うのは久しぶりです。ここでの最善のアプローチを理解するための優れた教科書を知っている人はいますか?

4

2 に答える 2

2

データベースは、より根本的な方法でオブジェクト指向を打ち破ります。(または、オブジェクトがリレーショナル モデルを壊します。それは、中間層の OO 担当者か DBA かによって異なります。)

リレーショナル データベースは定義に基づいて設定され、本質的に宣言型です。オブジェクト指向言語は、オブジェクト インスタンス ベースです。「オブジェクトとリレーショナルのインピーダンスの不一致」のため、この 2 つを連携させることは困難です。これが、非常に多くの ORM ソリューション (TopLink、Hibernate など) を目にする理由です。それらはすべて、オブジェクト指向プログラマーをだまして、オブジェクトを処理するだけでリレーショナル データベースについて心配する必要はないと思わせようとしています。

どのように実装しても、永続性はモデル オブジェクトとは別のものにする必要があると思います。私は通常、リレーショナル コードをインターフェイス ベースのデータ アクセス レイヤーに配置します。そうすれば、モデル オブジェクトは永続化されているかどうかを知る必要がなくなり、CRUD 操作を 1 つのパッケージに分離できます。

推奨される参考文献として、ファウラーのエンタープライズ アプリケーション アーキテクチャのパターンを紹介します。

于 2012-10-01T00:14:36.487 に答える
0

このシナリオの最適なソリューションは、実際には膨大な数の変数に依存します。通常、オブジェクト指向言語では「階層化」アプローチが最も効果的であると考えられていますが、それでも、アプリケーションが対処しなければならない各懸念事項の優先度に基づいて、ほぼ無限の数の順列が存在します。

代表的なオブジェクト (プレーヤー、チームなど) は通常、データベース操作に関与しないでください。たとえば、その責任はデータ アクセス レイヤーに属します。

オブジェクト指向の考え方を学ぶ良い方法は、いくつかの設計パターンを調べることです。私がお勧めするこのトピックに関する「読みやすい」良い本は、「Head First Design Patterns」です。これは Java で書かれており、カバーする各トピックについてさまざまな角度から説明しています。私の意見では、それは「ダミー」の本のレベルと、より抽象的な/理論的な本のレベルとの間の良い架け橋として機能します.

于 2012-10-01T00:29:18.077 に答える