質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

2214閲覧

MVCとオブジェクト指向

wkbiz

総合スコア152

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

2クリップ

投稿2017/06/28 14:12

編集2017/06/29 15:00

よろしくお願いします。
凄く幼稚でバカな質問で恐縮ですがご回答ご教授いただければ幸いです。

デザインパターンにMVCモデルなどがありますが、MVCを守っていれば
自ずとオブジェクト指向になる、と考えても良いのでしょうか。

ある案件の担当者と話していると、MVCとオブジェクト指向は全く別物
なのでMVCを守ってるからと言ってオブジェクト指向になっているとは
言えない、という風なことを言われたのです。
確かにデザインパターンとシステムデザインは別物なのは分かっていますが
MVCを守ろうとすれば自ずとオブジェクト指向で書かざるを得なくなる
のでは?というのが私の見かた、考えです。

鉄と水を同じ単位で見てるようなものかもしれませんが、双方は
関係しあっていると思っているので、全く別ものとは思えないのです。

この私の見かた、考え方で、どの理解が足らないからダメなのか
どう理解すれば正しい理解になるのか。
凄く甘えた質問で恐縮ですが、ご教授いただければ幸いです。

よろしくお願いいたします。

【追記】
私としてはMVCとオブジェクト指向って1セットだと思っているところがあって、そこを相手に説明するにはどうしたらいいだろう?というのが今回の悩みです。

更に言うと、オブジェクト指向の上にMVCが成り立っていると考えているので、オブジェクト指向を知らずしてMVCで作る事なんて出来ないと思っているのです。
が、私の考え方は誤っているのでしょうか。

【追記2】
うまく表現できず申し訳ないですが、いろんなものが不足しているんだなと改めて痛感しました。
様々な方からご意見、ご教授ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

MVCはオブジェクト指向言語でないとできないというわけではありません。

例えば、YesodはHaskellでできたMVCを採用したWebフレームワークです。Haskellは純粋関数型言語であり、オブジェクト指向とはまったくもって無縁の言語です。細かいところを触ったわけではありませんが、オブジェクト指向のオの時も出てくることはないでしょう。

そんなマイナーなものは知らないというのであれば、PhoenixというElixirでできたMVCなWebフレームワークがあります。ElixirはRubyっぽい文法ですが、中身はErlangの別表現です。Erlangこそが唯一のオブジェクト指向言語であるという意見もありますが、(オブジェクト指向の本質を知らない)ほとんどの人は、Erlang(つまりはElixirも)はオブジェクト指向から非常に離れた言語であると考えるでしょう。

オブジェクト指向言語ではないからオブジェクト指向では無いとは一概は言えません(非オブジェクト指向言語Cで作られたオブジェクト指向の実装としてGTK+のような例があります)が、多くの場合、非オブジェクト指向言語に対する無理なオブジェクト指向の採用はその言語の利点を潰してしまいます。上にあげたフレームワークも(細かい点まではみていないのですが)オブジェクト指向とは全く別の考えて作られています(たぶん)。

確かに、Ruby on RailsやPlay Frameworkなどを初めとした多くのMVCフレームワークでは、ScalaやRubyと言ったオブジェクト指向言語(と言われている言語)を用いて、オブジェクト指向の考えの上にMVCを構築しています。しかし、だからといってMVCの上にオブジェクト指向が必須というわけではありません。オブジェクト指向でMVCフレームワークを作る方法については数多くの実例や研究も進んでいるため、やりやすいという側面はあるかも知れませんが、必須とまでは言えないと思われます。

投稿2017/06/28 22:26

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2017/06/29 14:53

ご回答ありがとうございました。 様々な例を取り上げていただき有難うございます。最後の「必須とまでは言えない」というのは確かに。
guest

0

MVCを徹底したからといってオブジェクト指向にはなりません。

極端な話をします。
モデルクラス1つ・ビュークラス1つ・コントローラークラス1つという構成のプロジェクトはMVCと呼べますが、果たしてこれはオブジェクト指向でしょうか。

投稿2017/06/28 14:29

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2017/06/28 14:59

早速ご回答ありがとうございます。 継承、ポリモーフィズム、カプセル化の要素が入っていないとオブジェクト指向とは呼べないってことですよね。 極端と前置きされているので恐縮ですが、実際はソース数は数十、数百となるわけですから継承、多態性、カプセル化を意識して作らないとメンテナンス性は欠けますし、嫌が応にもオブジェクト指向を意識する必要性がでてくるから、結局MVCにオブジェクト指向は内包される。 ・・・っていう言い方は乱暴なんでしょうかね。 私としてはMVCとオブジェクト指向って1セットだと思っているところがあって、そこを相手に説明するにはどうしたらいいだろう?というのが今回の悩みです。
yona

2017/06/28 16:21 編集

1セットではありません。 オブジェクト指向はオブジェクト同士の相互作用によりシステムを作り上げる考え方のことです。 MVCはコードの役割をモデル・ビュー・コントローラーに分割する実装パターンのことです。 この2つは分けて考えるべきです。 さらにMVCはC言語でも実現することはできます。 なぜ、自身がコメントで述べているようにオブジェクト指向をしているものを、わざわざMVCという用語で説明しようとしているのでしょうか?
wkbiz

2017/06/28 16:39

ご回答ありがとうございます。 水と油を一緒にしないで、と仰っておられるわけですよね。 概念、定義は仰っている通りと思っています。しかし実務上において両者を分けて扱うことって無いように思うんです。 MVC使うなら結局オブジェクト指向も使うことになるから1セットにしてしまった方がいいんじゃないのか、という個人的な思いです。
yona

2017/06/28 17:07

私は「MVCであり、オブジェクト指向である」は正しいと思いますが、「MVCだから、オブジェクト指向である」というのは違うと思います。 どうやら、あなたは「MVCだから、オブジェクト指向である」という解答ありきで質問をしているようなので、私の回答では絶対に納得しないと思いますよ。
退会済みユーザー

退会済みユーザー

2017/06/29 01:04

phpはクラス(や名前空間やイテレータ)の概念があって、標準的なMやVやCの動作をクラスの概念を使って実装してそれを継承したものとしてシステムを設計したほうが効率よく作れるから、殆どのphp上のMVCモデル開発出来るプラットフォームがクラスを使っているというだけです。 クラスを使わずにMVCモデル開発することも出来るはずですが、保守性が悪いとか生産性が高まらないなどの理由で誰もやりたがらないのだと思います。
wkbiz

2017/06/29 14:44

ご回答ありがとうございました。
guest

0

オブジェクト指向とは実現しようとしている機能を現実世界に即してアナライズし、モデル化してそれらの相互作用でシステムの動作を実現しようとする考え方です。
継承、ポリモーフィズム、カプセル化などは上記の考え方を実現しようとしたときに必須となったオブジェクト指向の「特徴」またはオブジェクト指向言語を実現するための「要件」です。

いっぽうMVCとは、ユーザーインタフェースをもつ機能を実現する際の役割分担の方法です。WikiPediaからの転載ですが以下のような役割分担をします。
model: アプリケーションデータ、ビジネスルール、ロジック、関数
view: グラフや図などの任意の情報表現
controller: 入力を受け取りmodelとviewへの命令に変換する

両者はイコールではなく、どちらかを実現させたからといってもう一方を満たすことにはなりません。
以下に、同一の機能をMVCで実現するときにオブジェクト指向設計をした場合としなかった場合の2パターンの設計例を示してみます。

■MVC(オブジェクト指向設計無し)

給与/賞与を参照する画面

【クラス名:機能】
CommonView01:給与/賞与照会選択画面

SubView01:給与照会画面
SubView02:賞与照会画面

SubController01:給与照会画面のコントローラー
SubController02:賞与照会画面のコントローラー

SubModel01:給与照会画面の業務ロジック
SubModel02:賞与照会画面の業務ロジック

■MVC(オブジェクト指向設計有り)

給与/賞与を参照する画面

【クラス名:機能】
modeSelectView:給与/賞与照会選択画面

salaryView:給与照会画面
vonusView:賞与照会画面

salaryManager:給与照会画面のコントローラー
vonusManager:賞与照会画面のコントローラー

salary:給与照会画面の業務ロジック
vonus:賞与照会画面の業務ロジック

ちょっと極端な例ですし、名前が変わっているだけですが、前者も後者もMVCモデルで実現できます。
ただし後者のような考え方で設計したほうが各機能で必要な機能がイメージしやすく、役割分担の設計もやりやすい、後から見たときの各クラスの関係性も分かり易い、というのがオブジェクト指向の特徴です。

投稿2017/06/29 00:16

akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2017/06/29 14:49

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問