MVCのM(モデル)を単純化する
ソフトウェア開発の80%は知的作業であり、そのほとんどが創造的な作業です。
この知的作業を支援してくれるのが、デザインパターンなどの規約です。
Singleton、Facade、Factoryなどのパターン名を使うことで、チームのメンバーにデザインの意図を伝えることができます。
WEBアプリケーションフレームワークを使うと、さらに迅速かつ簡単にコードを書いてアプリケーションに機能を追加できます。
ほとんどのWEBアプリケーションフレームワークは、MVCモデルです。
MVC(モデル・ビュー・コントローラ)アーキテクチャは、デザインパターンとソフトウェアフレームワークの両方が関わります。
MVCモデルはその名前の通り、Model、View、Controlの三つの要素から構成されます。
それぞれの説明は以下の通りです。
コントローラー
ユーザーの入力を受け入れ、入力に対してアプリケーションが何を返すべきかを定義し、モデルに仕事をさせた後、ビューを呼び出して表示します。
ビュー
ユーザーインターフェースに情報を表示します。
モデル
他の全てを行います。(一般的にデータと同じ部分です。)
コントローラー、ビューの役割は非常に明確なのに対して、モデルの役割は曖昧です。
アクティブレコードとは?
アクティブレコードとは、ほとんどのweb開発フレームワークで使われるデザインパターンの一種となります。
2004年にRuby on railsで使用されて以来、広く使われるようになりました。
web開発フレームワークにおいては、特にシンプルなアプリケーションではモデルを複雑にカスタムする必要はありません。
アクティブレコードが、以下の手順でオブジェクトに必要な操作は(テーブルでの行の作成、変更、削除、参照)を行います。基本的なCRUD操作と呼ばれます。
データベースのテーブルやビューに対するクラスを定義する
クラスメソッドfindを呼び出すことで、そのテーブルやビューの各業に対応したインスタンスが返される。
クラスのコンストラクタを用いて新しい行を生成される
アクティブレコードは、単一テーブルの各業に対するシンプルなインターフェースを提供してくれる、優れたパターンです。
しかし開発者は曖昧さを嫌い、極度に抽象化、シンプルさを保とうとしてしまい、モデルを単なるデータアクセスオブジェクトとみなしてしまうことがあります。
アクティブレコードの間違った使い方:MVCのモデルとアクティブレコードを同一にしすぎてしまう
アクティブレコードを突き詰めようとするあまり、「SQLを発行するという行為」をやめてしまうことがあります。
特に、webフレームワークの仕組みの「アクティブレコード」がモデルと同じものであると考えた場合、「複数のテーブルを組み合わせてselectする場合」これに対応できなくなる可能性が高いです。
なぜなら、webフレームワークにおける「アクティブレコード」とはデータベースのテーブルやビューなどの粒度で構成されるためです。
https://speakerdeck.com/minodriven/railsdekao-erudomeinqu-dong-she-ji-falsekoadomein
解決策:モデルとアクティブレコードの関係は「is-a」ではなく、「has-a」である
モデルについての万能な解決策を提供することはこんなんです。
なぜなら、モデルはアプリケーションのViewとControl以外の残りの全てを構成する要素だからです。
そのため、そもそもwebフレームワークにある「アクティブレコード」の仕組みだけでモデルを構築することが誤解なのです。
アクティブレコードのようなDAOとモデルの関係は、is-a(継承)ではなくhas-a(集約)の関係であるべきです。
モデルがDAOクラスからの継承ではなくDAOを使う関係にある場合、対象となるドメインの全てのデータを含むようなモデルを設計できます。
ドメインモデルの使用
エリック・エヴァンスは「ドメイン駆動設計」の著作の中で、ドメインモデルと呼ばれる設計手法を提唱しています。
それはすなわち
アプリケーションはビジネスルールのために存在する
データはビジネスルールのために存在する
という考え方です。
つまり、モデルとはアプリケーションのビジネスロジックを実装する場所であり、そのためにアクティブレコードを使い倒すという考え方です。
データベースとのやりとりは、モデルの内部の実装の詳細なのです。
https://speakerdeck.com/minodriven/railsdekao-erudomeinqu-dong-she-ji-falsekoadomein
アクティブレコードの正しい使い方
title:アクティブレコードの正しい使い方
description:webフレームワークの仕組みの「アクティブレコード」がモデルと同じものであると考えた場合、「複数のテーブルを組み合わせてselectする場合」これに対応できなくなる可能性が高いです。
category_script:page_name.startswith("30")
page:https://minegishirei.hatenablog.com/entry/2023/02/11/195416