マジックビーンズ【SQLアンチパターン】

MVCのM(モデル)を単純化する

ソフトウェア開発の80%は知的作業であり、そのほとんどが創造的な作業です。 この知的作業を支援してくれるのが、デザインパターンなどの規約です。 Singleton、Facade、Factoryなどのパターン名を使うことで、チームのメンバーにデザインの意図を伝えることができます。

WEBアプリケーションフレームワークを使うと、さらに迅速かつ簡単にコードを書いてアプリケーションに機能を追加できます。 ほとんどのWEBアプリケーションフレームワークは、MVCモデルです。 MVC(モデル・ビュー・コントローラ)アーキテクチャは、デザインパターンとソフトウェアフレームワークの両方が関わります。

MVCモデルはその名前の通り、Model、View、Controlの三つの要素から構成されます。 それぞれの説明は以下の通りです。

  • コントローラー ユーザーの入力を受け入れ、入力に対してアプリケーションが何を返すべきかを定義し、モデルに仕事をさせた後、ビューを呼び出して表示します。

  • ビュー ユーザーインターフェースに情報を表示します。

  • モデル 他の全てを行います。(一般的にデータと同じ部分です。)

コントローラー、ビューの役割は非常に明確なのに対して、モデルの役割は曖昧です。

アクティブレコードとは?

アクティブレコードとは、ほとんどのweb開発フレームワークで使われるデザインパターンの一種となります。 2004年にRuby on railsで使用されて以来、広く使われるようになりました。

web開発フレームワークにおいては、特にシンプルなアプリケーションではモデルを複雑にカスタムする必要はありません。

アクティブレコードが、以下の手順でオブジェクトに必要な操作は(テーブルでの行の作成、変更、削除、参照)を行います。基本的なCRUD操作と呼ばれます。

  1. データベースのテーブルやビューに対するクラスを定義する

  2. クラスメソッドfindを呼び出すことで、そのテーブルやビューの各業に対応したインスタンスが返される。

  3. クラスのコンストラクタを用いて新しい行を生成される

アクティブレコードは、単一テーブルの各業に対するシンプルなインターフェースを提供してくれる、優れたパターンです。

しかし開発者は曖昧さを嫌い、極度に抽象化、シンプルさを保とうとしてしまい、モデルを単なるデータアクセスオブジェクトとみなしてしまうことがあります。

アクティブレコードの間違った使い方: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")