<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>ECWorks Blog &#187; MVC</title>
	<atom:link href="http://blog.ecworks.jp/archives/tag/mvc/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.ecworks.jp</link>
	<description>CakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。</description>
	<lastBuildDate>Fri, 09 Dec 2011 07:24:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.ecworks.jp/archives/tag/mvc/feed" />
	<div id='fb-root'></div>
					<script type='text/javascript'>
						window.fbAsyncInit = function()
						{
							FB.init({appId: 122492164489250, status: true, cookie: true, xfbml: true});
						};
						(function()
						{
							var e = document.createElement('script'); e.async = true;
							e.src = document.location.protocol + '//connect.facebook.net/ja_JP/all.js';
							document.getElementById('fb-root').appendChild(e);
						}());
					</script>	
						<item>
		<title>【CakePHP】フレームワークにおける「秩序」とは何なのだろう？</title>
		<link>http://blog.ecworks.jp/archives/1092</link>
		<comments>http://blog.ecworks.jp/archives/1092#comments</comments>
		<pubDate>Sat, 20 Feb 2010 20:47:24 +0000</pubDate>
		<dc:creator>MASA-P</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[プログラミング全般]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[携帯ライブラリ]]></category>

		<guid isPermaLink="false">http://blog.ecworks.jp/?p=1092</guid>
		<description><![CDATA[Twitterで議論になって、ちょっと大事だよなと思ったことがあったので、言葉足らずだった部分についてもちょっと補足したりして記事として残しておこうと思います。
なお、これはあくまでも私の一個人としての「考え」であって、正解というわけではないと思います。ただ「こういった考え方もある」という点だけ伝わったら嬉しいです。
で、まあよくあるフレームワークにおける「MVC」の話なんですが、例えば「コントローラやモデルの中でヘルパーとか使ってもいいんじゃないか？」という点について。つまり、MVCで役割を分割しているのに、その領域を乗り越えて機能を実現することについてどうなのか、ということです。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.ecworks.jp%252Farchives%252F1092%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%80%90CakePHP%E3%80%91%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%80%8C%E7%A7%A9%E5%BA%8F%E3%80%8D%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%AA%E3%81%AE%E3%81%A0%E3%82%8D%E3%81%86%EF%BC%9F%22%20%7D);"></div>
<p><!--:ja--><img src="http://blog.ecworks.jp/wp-content/uploads/2009/02/cake-logo.jpg" title="cake-logo" width="180" height="180" class="alignleft size-full wp-image-336" />Twitterで少し議論になって、これってちょっと大事だよなと思ったことがあったので、言葉足らずだった部分についてもちょっと補足したりして記事として残しておこうと思います。<br />
なお、これはあくまでも私の一個人としての「考え」であって、正解というわけではないと思います。ただ「こういった考え方もある」という点だけ伝わったら嬉しいです。</p>
<p>で、まあよくあるフレームワークにおける「MVC」の話なんですが、例えば「コントローラやモデルの中でヘルパーとか使ってもいいんじゃないか？」という点について。つまり、MVCで役割を分割しているのに、その領域を乗り越えて機能を実現することについてどうなのか、ということです。<br />
CakePHPでも、ヘルパーの機能で汎用的に使いたい（そして実際に使える)機能があったり、逆にヘルパー内からモデルとかを呼び出して情報を取り出したりすることが出来るっちゃー出来ます。実際にコアヘルパーでもそのようなことをしている部分もあったりします。<br />
正直言いまして、Cakeはかなり自由度が高く、やろうと思えば何でもできると思います。ちょっと不自由な点があっても、最悪コアコードをちょろっとextendsして置き換えるか書き換えるだけで、大抵のことは出来る。PHPなので、PHP的な書き方をすればそのような期待したことは出来ちゃうんですよね。たぶんPHPフレームワークで出来ちゃう方の部類。言い換えれば「ゆるい」です(笑)。ClassRegistoryの仕組みが出来てからは特に！(笑)</p>
<p>で、MVCの話なんですが「MVCを侵害することは何事だ！」「いや、使える技を使わないのはどうなんだろう」と対極の意見が生まれることもまた当然で、どちらも主張は大変によく分かります。MVCで機能をしっかり分けてコーディングをすることも大切なことですが、それによってとても面倒で回りくどい、あるいは無駄なコードを書かなければならなくなるけどちょっと工夫するだけで出来ちゃう場合もある。納期を守るために時間短縮は大切だし、そのためのフレームワークでもある。色々と意見はあると思います。</p>
<p>私の考えをシンプルに答えるのなら「どちらもアリだし大切」。MVCを守ることは大切だし、使える技は使っていく…これもまた重要だと思います。<br />
しかし…私の考えはもしかしたらここから先は人と違うかもしれません。</p>
<p>2008年10月、「CakePHPカンファレンス東京」という大きなイベントが開催され、そこで当時CakePHPのプロジェクトマネージャであったGarett氏がCakePHPの理念について、このようにスピーチされました。</p>
<p>「State of Nature(ありのままに出来る自由)」<br />
「Social Contract(ルール作り)」</p>
<p>CakePHPは自由に実現できるツールである。しかしそれだけでは無秩序になってしまい効率が悪い。ある程度のルール作りをしてそれに乗ってもらうことで、フレームワークの機能とかそういう部分以外に考えを注力してもらいたい…そのような意味が込められていると私は感じました。<br />
この考え方に私は大賛成です。それは「以前に自作のフレームワークを作って業務を回していた」ことと「(現在も)オープンソース(?)なプロジェクトを公開している」点の二つのバックボーンが自分にあるからかもしれません。</p>
<p>まあ自作のフレームワークといってもそれはみすぼらしいもので、データを取得するクラスと自作のテンプレートシステムをくっつけてソースを分離しただけのもので、MVCとは言えないかもしれませんが。基本的に、一つ作ったプロジェクトをテンプレートにして使い回すことで、かなりの時間稼ぎが出来ていました。ただ、プロジェクトがこう佳境になってくると、脇が甘くなってくるというか、MVCなんて言っていられなくなってくるんですよね。データ取り出す部分でHTMLなんかも加工しちゃったりとか、何でもあり状態に。まあそうやって時間に間に合わせちゃうわけです。</p>
<p>まあ、この頃はほぼ一人でやっていて、それで回っちゃっていたので問題視することはなかったんですが、部下が一人つきまして、このなんちゃってフレームワークを勉強してもらうことに。<br />
まあ分からないですよね。自分だったらたぶん分からないです。人の書いた、しかもぐちゃぐちゃに行き来するコードを追うことなんて(笑)。<br />
でも、見よう見まねで頑張って書いてくれて、機能の役割なんかも分かってきつつあったみたいで、じゃあお願いということで別のプロジェクトを任せてみたんですけど…でも、やっぱり無秩序から生まれたものは無秩序でして、彼の書いたコードの何割かは自分の理解出来ないものに(笑)。別に彼が悪いんじゃないと思います。そういうなんちゃってフレームワークを書いた自分に責任があると思います。</p>
<p>時間をかけて覚えてくれたものなのに、できあがってみれば書いた本人しか理解の出来ないものになってしまうわけでして、これじゃあいけない！　ということでオープンソースフレームワークを導入するに至った経緯があります。ただ、がっちがっちで不自由だらけのものでは小回りがきかなくて業務に差し支えがある場合もあるので、ある程度の自由さも検討し、またたまたまPHP4問題も当時ありまして、結局CakePHPしかない状況になったのですが(笑)。でも、もっともっと前にCakeがあったら違った世界になっていたかもしれません(<a href="http://blog.ecworks.jp/archives/5">こちら</a> と <a href="http://blog.ecworks.jp/archives/929">こちら</a> を参照)。<br />
こういった経緯もあって、秩序というのはとても大切に思っているわけでして、だからといってそうも言っていられない状況もあって、この二つと要領よくつきあっていくことが、フレームワークを効率的に便利に使っていくための大切な事なんじゃないかと思います。</p>
<p>ですが…途中でも書いたのですが「無秩序のものは無秩序を生む」。ここも大切だと思うんですよね。特に、初めてそれを触る人にそのやり方を見せて「何故そうなるのか」を理解しないままそれを「こうやって書くものだ」と覚えられてしまうことが大変に厄介で、そうなったらもうそれが主流になっちゃうんですよね。<br />
何が言いたいのかというと、そういうルールから外れる裏技的な使い方は、出来るということは分かっていて使うこともアリっちゃーアリだけど、それを主流にしてはいけないんじゃないか、ということです。<br />
主流にすることは結構簡単で、Cakeだったらブログなんかにやり方を書いちゃえば、あるいはフォーラムやBakeryで書いちゃえば、簡単にあっという間に広まっちゃうことも。センセーショナルな使い方なら、なお早いかもしれない！</p>
<p>でも、フレームワークの制作者側の立場としては、思想と反対のことを広めたくないはずです。Cakeに「ありのままの自由」「ルール作り」という２つのテーマ(ほかにも箇条書きであったのですが)があるのなら、使う側にもそれを十分に理解する必要があると思うのです。<br />
Cake Software Foundationに肩入れしているような発言かもしれないのですが、それは自分もKtai Libraryというプロジェクトを公開しているからでして、「こういう風に使ってもらいたい」ってのはやっぱりあるからですね。今のところ想定外の使い方をされているところはないですけど(使いようもないのですが、強いて挙げればCake用と思われてしまっている点かな。一応汎用的に使えるのに(^^;;;)、間違った方向にプロジェクトが進んでしまって欲しくないと思いますから。Cakeの裏技って結構あると思うんですよね。でも、それが場合によっては、こういった情報がプロジェクトにとって「毒」になってしまうこともあるんじゃないかと。</p>
<p>なので、もし「こうしたらもっと便利に使える」という点があるのなら、それは合法的(?)に解決していくべきかなーと思います。つまり、もしその裏技が本当に他の開発で役に立つのなら、チケットなんかで「この機能はヘルパーだけど、汎用的に使えるからコアライブラリにした方が良い」とか、「この機能はヘルパーでも使いたい」とかフィードバックしていく方が。むしろ積極的に。でなければ、裏技は裏技にとどめておいて、分かる人だけの特権にしておいた方が、フレームワーク個体としてはいいものになっていくのではないかと思います。</p>
<p>個人的に、こういった「ゆるさ」というか書きたいことが書けちゃうCakePHPは醍醐味で、止められない理由の一つでもあるのですが(笑)。とてもいいツールだと思うので、これからもより良い方向で発展してくれることを願い、また「Cakeはとてもいいんだよ！」と啓蒙していきたいと思います。偉そうなことを言える立場ではないと思いますが、こんなにどっぷりはまってしまって、しかも本まで出してしまった以上、もうただ使っていくだけの一ユーザには戻れないかなーなんて(^^;;;。</p>
<p>なんか議論していた以上のことをついでに一気に書いてしまった感じなんですけど、自分の考えを再認識するいい機会でした。こういった議論が出来たことを感謝しています！<!--:--></p>

<div class='wpfblike' style='height: 40px;'><fb:like href='http://blog.ecworks.jp/archives/1092' layout='default' show_faces='true' width='400' action='like' colorscheme='light' send='false' /></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ecworks.jp/archives/1092/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.ecworks.jp/archives/1092" />
	</item>
	</channel>
</rss>

