RailsにおけるMVCについて

f:id:ryoutaku_jo:20190308003730p:plain

【結論】
MVCとは、デザインパターンの一種で、
 Ruby on Railsにも取り入れられている

デザインパターンとは、先人が試行錯誤して編み出した
 プログラミングの設計手法を体系化して、
 誰でも簡単に取り入れられる様にしたもの

MVCでは、「Model・View・Controller」の3つに
 機能を分離して、保守性を高めている


【目次】


【本題】

MVCについて

MVCとは、デザインパターンの一種です。

デザインパターンとは、先人が試行錯誤して編み出した
プログラミングの設計手法を体系化して、
誰でも簡単に取り入れられる様にしたものです。

Ruby on Railsは、
MVCに基づいて設計されたフレームワークです。

デザインパターンを開発に取り入れる目的

そもそものデザインパターンを取り入れる目的は、
主に下記の3つです。

・開発の効率化
既に先人がたどり着いた知見を流用する事によって、
開発手法を一から考える手間が省けます。
また、自身より優秀なエンジニアの設計手法を取り入れる事で、
自分一人で考えるより、効果的な方法で開発が行えます。

・可読性の向上
統一されたルールに従ってコーディングする事で、
コードの可読性が高まります。
これはチームで開発を行う場合はもとより、
自身でコーディングした内容を見返す際にも役立ちます。

・コミュニケーションコストの軽減
開発メンバー間で同じ設計思想を共有する事で、
開発手法について話し合う際の意思伝達がスムーズになり、
コミュニケーションのコストを軽減させる事に繋がります。

MVCの概要

では、MVCの内容に話を戻します。

MVCは、下記3つの機能を分離させる設計手法です。

Model(モデル)・・・データの操作(ビジネスロジック担当)
View(ビュー)・・・コンテンツの表示(画面表示担当)
Controller(コントローラー )・・・クライアントからのリクエストに応じて処理を行う(リクエスト処理担当)

それぞれの頭文字を取って、MVCと名付けられています。
では、次に個々の役割を細かくみて行きます。

Model

データベースや外部APIなどへアクセスし、
データの操作を行います。
具体的には、データの登録/更新/削除/検索です。

View

コンテンツの表示を担当します。
HTML/CSS/JavaScriptで記述している部分が、ここにあたります。
ただコンテンツを表示するだけでなく、クライアントからの操作を
受け付ける為のインターフェイスとしての役割も担っています。

Controller

クライアントからのリクエストに応じて、処理を行います。
必要に応じて、モデルへデータの操作を指示し、
取得したデータをビューに渡すという、モデルとビューの仲介を行います。
データの操作が不要であれば、自身だけで処理を完結し、ビューにデータを渡します。

単一責任の原則(SRP)

MVCの様に、機能を分離するという方法は、
プログラミングにおける基本原則の一つで、
「単一責任の原則(SRP)」と呼ばれています。

これは、一つのクラスやメソッド・関数には、
二つ以上の役割を持たせてはいけない
という考え方にも通じます。

その目的は、下記3点の様な保守性の向上です。

・可読性の向上
機能毎に分離されていれば、どこにコードを書いたか
判断しやすくなるので、コードリーディングが捗ります。

・仕様変更の内容が伝わりやすい
仕様変更を行った際にも、機能毎にコードを分けていれば、
どの機能の変更を行ったかも、一目瞭然にわかります。

・影響範囲の最小化
機能を集約してしまうと、一つの機能を仕様変更した際に、
他の機能にも悪影響を与えてしまい、修正に手間が掛かるケースがあります。

ファットコントローラー

Ruby on Railsは、MVCに基づいて設計されたフレームワークですが、
MVCに則ってコーティングしなくても、プログラムは機能します。
(極端な話、ビューに全てのロジックを記述する事も可能)

その悪い事例の一つに、「ファットコントローラー 」と呼ばれるものがあります。

これは、本来モデルに記述すべきビジネスロジックを、
コントローラーに記述した事で、コントローラーが肥大化(コード量の増加)した状態
を指します。

前項の単一原則の法則で説明した通り、
この状態だと保守性が下がってしまいます。

この解消策は、コントローラー に記述していたビジネスロジックを削除して、
モデルにクラスとして定義させる
事です。

《今日の学習進捗(3年以内に10000時間に向けて)》

休息日

学習開始からの期間 :90日
今日までの合計時間:876h
一日あたりの平均学習時間:9.8h
今日までに到達すべき目標時間:822h
目標との解離:54h
「10,000時間」まで、

残り・・・「9124時間!」