私はここしばらく (4 か月) Yii Framework で開発を行ってきましたが、これまでに MVC でいくつかの問題に遭遇したので、経験豊富な開発者と共有したいと思います。複雑さのレベルをリストすることで、これらの問題を提示します。
[レベル 1] CR (更新の作成) フォーム. まず、フォームがたくさんあります。各フォーム自体がモデルであるため、それぞれにいくつかの検証ルール、いくつかの属性、および属性に対して実行するいくつかの操作があります。多くの場合、これらの各フォームは、単一のアクティブなレコードオブジェクトを使用してデータベース内のレコードの更新と作成の両方を行います。
-> したがって、このレベルの複雑さでは、フォームは
開いたとき、
db から db に適したデータを人間にわかりやすい方法で表示できるようにする
アクティブなレコード オブジェクトの属性を持つすべてのフォーム フィールドを表示できます。db テーブルからの列の追加、削除、変更は、フォームの表示に影響を与える必要があります。
保存するとき、データを取得する前に、人間に優しいデータをデータベースに適したデータにフォーマットできます
が検証するとき、アクティブなレコード オブジェクトによって適用される基本的な検証を実行できますが、一部のビジネス ルールを満たすために他の検証も実行する必要があります。
検証が失敗した場合、属性に加えられた変更とデータベースに加えられた変更をロールバックし、最初に入力したデータをユーザーに提示できます。
[レベル 2] 拡張 CR フォーム。異なるテーブルのレコードを一括で作成・更新できるフォームです。それだけでなく、フォームがそのレコードの 1 つを作成/更新するかどうかは、他の条件 (より多くのビジネス ルール) に依存する場合があるため、フォームはテーブル A、B のレコードを更新できるが D は更新できない場合があり、A のレコードを更新する場合もあります。 ,D であり、B ではない -> したがって、このレベルの複雑さでは、フォームは次のことを行う必要があることがわかります。
【レベル1】を満たすことができる
特定のレコードを条件付きで作成/更新したり、特定のレコードの特定の列を条件付きで作成/更新したりできます。
[レベル 3] モデルのツリー。アプリケーションにおけるフォームの役割は、多くの点で、ユーザーがアプリケーションと対話できるようにするポートです。要求を満たすために、このポートは他の多くのオブジェクトと対話し、さらに多くのオブジェクトと対話します。これらのオブジェクトのいくつかは、モデルとして見ることができます。Active Record はモデルですが、Mailer もモデルになることができ、RobotArm も同様です。これらのモデルは、相互に使用してユーザーの要求を満たします。各モデルは独自の操作を実行でき、ツリー全体がエラー/失敗の場合に加えられた変更をロールバックできる必要があります。
誰かがこれらの問題に遭遇したか、解決できましたか?
モデル属性を ModelAttribute オブジェクトにカプセル化して、クライアント、サーバー、およびデータベースの層全体に存在するようにするなど、多くのことを考え出しました。
また、モデルのツリーにオブザーバーを与えて観察し、観察されたモデルにエラーが発生したときに変更をロールバックするように通知する必要があると考えました。しかし、複数のオブザーバーが存在できる場合、ノードが親のオブザーバーを使用するが、その子に別のオブザーバーを与えるとどうなるでしょうか。
エンジニア、開発者、Rails、Yii、Zend、ASP、JavaEE、その他の MVC 関係者は、科学のためにこのディスカッションに参加してください。
-- teresko の応答への更新: ---
@teresko 実際には、サービスを作業単位内の実行に組み込み、作業単位が新規/更新/削除を気にしないようにするつもりでした。作業単位内の各オブジェクトは、その状態を担当し、独自の commit() および rollback() を実装する必要があります。エラーが発生すると、作業ユニットはすべての変更を最新の登録済みオブジェクトから最も古い登録済みオブジェクトにロールバックします。これは、データベースを扱うだけでなく、メーラー、パブリッシャーなどを扱うことができるためです。そうでない場合、ツリーは正常に実行されます。 、最も古い登録オブジェクトから最も新しい登録オブジェクトに commit() を呼び出します。このようにして、メーラーはメールを保存し、コミット時に送信できます。
データ マッパーを使用することは素晴らしいアイデアですが、データベース内の列がデータ マッパーとドメイン オブジェクトと一致することを確認する必要があります。さらに、他のモデルに依存する属性を持つ拡張 CR フォームまたはモデルは、検証とデータ型に関してそれらの属性を一致させる必要があります。では、属性はオブジェクトであり、モデルからモデルへと出荷されるのでしょうか? 属性は、それが変更されているかどうか、どの検証を実行する必要があるか、どのように人に優しく、アプリケーションに優しく、データベースに優しくできるかを伝えることもできます。db スキーマを更新すると、この属性が影響を受けるため、この変更を満たすために開発者がシステムを変更する必要がある例外がスローされます。