Open9

Railsとは何なのか

oenus777oenus777

じゃあ何故、スピードある開発が実現できるのか。
それは下記3つの恩恵を受けているからである。

  • MVCアーキテクチャ
  • リソースベースのルーティング
  • ActiveRecordデザインパターンのRails版
oenus777oenus777

というかscaffoldコマンドこそRailsのスピードある開発を物語っているものである。
コマンド一発でDBスキーマを定義し、テーブルへアクセスできるクラス(モデル)が出来上がり
クライアント側のインターフェイス
(RESTに沿ったルーティング、コントローラー、ビュー)が出来上がり
ドメイン層以降のロジックのみをモデルに書くだけで(コントローラーにも書ける)
機能を実装する事ができる、コードを書く量を減らすこの仕組みがスピードを実現させている。

oenus777oenus777

しかし欠点もある、テーブルとモデルが1対1ではもちろんであるが(ActiveRecordなので)
ユースケースとモデルが1対1であるため、モデルが複数ユースケースで使われ始めると
ファットモデルにもなるし、コードが複雑になり
可読性、変更容易性が落ちメンテナンスコストが上がる。
この現象を発生させる原因はActiveRecordデザインパターンのRails版にある。

oenus777oenus777

ActiveRecordとはデータアクセス層のデザインパターンである。
具体的には下記を対応づける事でテーブル操作、データの扱いが簡単になる。

  • クラスとテーブル
  • インスタンスとレコード
  • カラムとインスタンス変数
  • テーブルのCRUD処理とインスタンスメソッド(クラスメソッド含む)

RailsのActiveRecordは上記に追加機能がある。

oenus777oenus777

追加されている機能は以下の2つである。

  • バリデーション機能
  • コールバック機能

これがめっちゃ便利でバックエンド側でカラムのバリデーションが行えるし
テーブル操作の前後に処理を実行できる。
モデル内で全て書く事ができるのでコード記述量も減り
Railsだからこそのスピードが発揮できる要因にもなっている。
しかし、この組み合わせがアプリケーションの規模が大きくなるにつれて仇になってくる。

oenus777oenus777

それはバリデーションやコールバックは1つのユースケースに密結合している
よってそれらが書かれているモデルは複数のユースケースで使われ始めると
話しが戻るがメンテナンスコストが上がってくるのである。
先人たちの知恵によって様々な対処は考えられてきている。
だがそれもオブジェクト指向を理解していないと使えない代物らしい
(まだ私は理解しきれてないので、らしいと表現した)