c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

オブジェクト指向の継承をあるWEBデザイナーに説明した

オブジェクト指向プログラミング(以後OOP)ってなんなんですかー」
「それはなー、継承がなー、動物ってクラスがあって、それが人で、犬で…」
「もー、意味わからんっす」


「…じゃあさあ、あなたが仕事でやってる事をつかって説明しようか」

Includeは判る?

「Includeって判るよな?」
PHPとかの?」
「そう、たとえば、test.phpってphpを作って」

<html><body>
  <div id="text">
    <? include("text.txt") ?>
  </div>
</body></html>

「こんな風にすれば、外部ファイルを読み込める」

<!--text.txtの中身 -->
本文のテキスト本文のテキスト
<!--text.txtの中身 -->

「こんなtext.txtをIncludeしてるなら、完成出力は」

<html><body>
  <div id="text">
<!--text.txtの中身 -->
本文のテキスト本文のテキスト
<!--text.txtの中身 -->
  </div>
</body></html>

「こんな感じになるよな」
「そうっすね」

Includeの逆

OOPでよくある継承ってのは、要はこのincludeの逆なんだよ」
「はあ?」
「子をIncludeする、の逆で、親を継承する、という感じ」


「具体的には?」
「text.txtをよびだしたら、前述のtest.phpと同じ出力になるようにしたいんだよ」
「…つまり?」


「こんな構文はないけど」

<? include_from ("template.html") ?>
<!--text.txtの中身 -->
本文のテキスト本文のテキスト
<!--text.txtの中身 -->


「って書いたら、ヘッダーフッタが入って、前述の完成出力がでてくるという事。これが継承」
「…へー」
「つまり、HTMLの外側から内側の要素を引っ張ってくるんじゃなくて、中から外側を引っ張ってくるんだよ」
「…ふーん」


「へーとかふーんってなんだよ」
「…これ何が嬉しいんですか?」


「嬉しいんだよ、たとえば全部のページにヘッダーフッターがあったとして、今までなら」

htdocs/index.php
htdocs/about.php
htdocs/sitemap.php
htdocs/form.php
text/index.txt
text/about.txt
text/sitemap.txt
text/form.txt
template/header.html
template/footer.html

「とかいうファイル郡ができることは想像に難くないだろ?」
「そっすね、まあ一つの方法としては」


「これが前述の関数がもしあれば、こんな風になる。」

htdocs/index.txt
htdocs/about.txt
htdocs/sitemap.txt
htdocs/form.txt
template/template.html

「…おお、ファイルが減りました!」
「そう、ファイルがすくない」

ダマしてる?

「えーでもダマされてるみたいです、よく考えたらそれぞれのindex.txtに」

<? include("header.html") ?>
本文
<? include("footer.html") ?>

「とかやればいいじゃないですか、ちょっとファイル増えますけど。」


「そーね」
「そーねって…」
「あくまで概念を話しているだけだから、そういう事もあり得る」
「あり得るって…」


「その方法は、index.txtを親にして、header.htmlを子にし、上下関係を逆にした、という事なんだけれど」
「…ああ、そうですね」
「でも、これだと子も親も修正しなきゃいけないケースがふえちゃう」
「え?最初からこういう風に作っておけばいいんじゃないですか?」
「後で修正はざらでしょ?」
「たしかに」


「たとえば、それはヘッダー、本文、フッターの形になっているけれど、本文の左側に追加でメニューをいれるとしたらどうする?」
「そっすね、sidemenu.htmlって新しくつくって、全部のファイルにincludeを追記します」
「めんどくさいじゃん」
「そっすか?こんなの大抵のサイトは気合い入れて2〜3時間あればできますよ」
「…まあそれでもいいけどさー。でも全部のファイルを都度いじるのってめんどうくさいじゃん」
「そうっすかねえ?」
「まあ、面倒くさいってことにしておいてよ」
「はい」


「それだと、index.txtにIncludeを増やして、そんでsidemenu.htmlってのを追記して、必要なら、header.htmlにcssを追記、みたいな事をするよね?」
「そっすね」
「そうなるとさ、たくさんファイル修正しなきゃいけないじゃない。そういう場合に前述のinclude_fromをつかって親を継承している形だと、template.htmlに修正するだけでしょ?」
「…template.htmlって一体どんな構造になってるんですか?」
「例だし、架空だし」
「…」


「そうねーこんな感じじゃね?」

<html>
<body>
  <div id="text">
    <? include_to($txt) ?>
  </div>
</body>
</html>


「重ねて言うけど、こんなものはないよ」
「なるほど、これに追記して」

<html>
<body>
  <div id="sidemenu">
	・LINK
	・TO
	・OTHER
  </div>
  <div id="text">
    <? include_to($txt) ?>
  </div>
</body>
</html>

「みたいな風に修正すれば、できるってことですね」
「そーそー、そういうこと」


「あれ?これどっかで見たことあるとおもったら、テンプレートシステムってこんなノリですよ?」
「そうね」
「テンプレートシステムが、オブジェクト指向なんですか?」
「インスパイアは凄くされているとおもうけれど、ちょっと違う。テンプレートシステムは子のtxtから親のテンプレートを呼び出している訳ではなくて、テンプレートシステムからtxtと、テンプレートhtmlを読み込んで合成しているから*1
「ふーん」


「とにかく、親が子を、じゃなくて、子が親を、という風になっているのが継承。親を変えれば子を一切書き換えずに色々な形に書き換えできるだろ?」
「うん、そうですね、まだダマされている気分ですし、なにが嬉しいのかさっぱりわからないんですが」
「HTMLの例だから、何が嬉しいかっていわれるとねえ…。なんか良い例が思い浮かんだら教えるわ。これは一段だったけれど、これが何段にもなったりする。極端な例を言えば、index.txtをよびだしたら、Apacheまで起動するようなのがOOPだ」
「それは極端じゃないですか?」
「そーね、でもホントそんな感じよ」

  • -

次回に続く、かもしれない

*1:物にもよりますが