観てきたけどねえ。
感想は、そうだなあ。シンジくんはドキュンだなあとか……ほんとに、あらためてドキュンでした。
まあもともと、エヴァっていうかガイナックス作品全般に共感できないほうなんだけど(エニアグラムにもそんなこと書いてあったし(笑))、それにしてもダメ。
ていうか普通に、典型的な、監督が仕事してない映画です。
でもまあ、そういうところ見てない人も多いしね。使徒の動きとかはだいぶパワーアップしてたので、そのあたりを観にいく人にはむしろいいんでは。
というわけで、あしたからSF大会いきます。
ていうかきのうからいってる予定だったんだが、仕事でな。どうにもなー。
というわけで、なにやら憂鬱な障害対応系の日々を終えまして、明日から夏休みらしいです。無駄に水曜まで。
しかもなんだか、明日の夜はエヴァンゲリヲンを観にいくことにしたらしいですよ。なんつーかどちらかといえばエヴァ否定派のこのわたしが、なにしにいくのかしらんけど(笑)。
昨日書いたこととか考えてるうちに、ふと思いついてやってみた。ていうか人を馬鹿にしたソースなので信じないように。
いわゆるテンプレートメソッドなんだけど、これはさらに強力です。SolidTemplateなら、子クラスに勝手なメソッドを定義させません!
堅牢なアーキテクチャの実現のためにどうだろう。
class HogeSolidTemplate {
protected static $methods = array(
'getHoge' ,
'getPiyo' ,
);
protected final function __construct($hoge , $piyo) {
$this->hoge = $hoge;
$this->piyo = $piyo;
}
public static function getInstance($class , $hoge , $piyo) {
$instance = new $class($hoge , $piyo);
return new Alias($self::methods , $instance);
}
}
↑このHogeSolidTemplateが親クラス。
これを継承したらnew禁止なのでgetInstanceでインスタンス生成する。生成時にクラス名を渡すというかっこ悪さだけど、ここではがまん。
けど、これが返すのは実は↓のインスタンス。
class Alias {
private $class;
private $methods = array();
public function __construct($methods , &$instance) {
$this->methods = $methods;
$this->class = &$instance;
}
public function __call($method , $args) {
if(in_array($method , $this->methods)) {
return call_user_func_array(array($this->class , $method) , $args);
} else {
die('許可されていないメソッドです');
}
}
}
宣言した以外のメソッドを呼ぶと、突然dieする(笑)。もうソースを荒らさせません!
わたしなら、こんなの使うといわれたら全力で反対するがなー。
PHP5では「new self()」と書ける。ところがこれが罠で、親クラスの静的メソッドにこれを書くと、子クラスじゃなく親クラスをnewしようとするんである。
まあそれ自体は考えてみればそうかもと思うけど、じゃあクラス名を取得する定数である__CLASS__ではどうかというと、これも親クラスの名前をもってくる。他に方法ないかと思っていろいろ調べたら
$trace = debug_trace();
$class = $trace$_lb0$_rb$_lb'class'$_rb
なんてのを見つけた。ムリヤリもいいとこだけど(笑)
PHP4ではこれでいいらしい。しかし、これもPHP5では親クラスの名前がとれてしまう。
なんとなくnew child()とか書いてみてももちろんエラー。
newされてるならclassname($this)でよさそうだけど、静的メソッドでは使えない。
というわけで、静的メソッドが「呼び出されたクラス」を取得する方法はひとつもないらしい。たとえばシングルトンのテンプレートクラスを作るきれいな方法はないということになる。
まあこれは、クラスを使う他の言語でもわりとそうっぽいけど。でもじゃあ__CLASS__ってなんに使うの?(笑)
オブジェクトという言葉が悪い、というのはもうずっと思っていることだ。
オブジェクトを訳せば「物体」である。物体はなにしろ物体じゃないか。モノなのにメソッドを持ってて命令を処理できたり、変身(ポリモーフ)したりするのは変だ。
そもそも「車オブジェクト」を継承して「バスオブジェクト」と「タクシーオブジェクト」を作ることはできない。だって、どうしたら同じ車がタクシーにもバスにもなるというのか。
そんなのは不可能なのだ。トランスフォーマーオブジェクトなら作れると思うけど。
そのあたりの感覚的な矛盾を無視して言葉を使うから、初心者はけっきょく丸憶えするしかなくなってしまう。けっきょくオブジェクト脳は育ちえないし、普通はサブルーチンを作る以上の発想につながらない。
というか、一つの車がタクシーにもバスにもなると感じられる「オブジェクト脳」なんてものをもった性格破綻者にしか理解できないのなら、やっぱり、それじゃダメじゃないか。
だが。
人間はもともと、タクシーが車を継承していると感じる能力を持っているのである。もちろんそれは物体としてではなくて、意識の中にしか存在しない概念としてというか……。
そこでわたしは提唱したい。これからは「クオリア指向」でどうだろう。
……うーん。わたしもダメだと思う。
[2007.08.28 13:28]あおき :
「クラス」と「インスタンス」という言葉のほうがてらしま君の感覚にはあいそうだなーと思った。でなければ、「タイプ」とか?
あと実装レベルだと、抽象データ型+継承=OOというのもわかりやすそう。
[2007.08.28 16:20]中田 :
そもそも「オブジェクト」に型があるものとしている時点で、いくらかクラス指向に毒されてるわけで。
型なんか存在しなくても「オブジェクト」は「オブジェクト」なのにね。そういう意味ではとりあえずなんでもリストでとりあえず入ってきたものを評価すればOKなLispとかこそ真のオブジェクト指向言語なのかも、とかなんとか。
[2007.08.29 20:38]拓真 :
物体ではない、概念的なものをオブジェクト(物体)としてコーディングしようとするとどこに境界線を引けばいいのかちんぷんかんぷん^^;
[2007.08.29 23:03]てらしま :
たとえばDiceという物体が、はたしてほんとにroll()メソッドを持ってるのかみたいな。まあ実際のところは「あまり深く考えなければ持ってる」あたりですかねー(笑)
[2007.08.30 02:57]中田 :
真に「なんでもオブジェクト」な世界なら、そもそもroll()だってオブジェクトじゃなきゃいけないはずで、roll()とdiceの関係はroll()がdiceを引数に取りうる、というものになるはずだー、とかなんとか。
[2007.08.31 02:49]あおき :
中田さんはlisp脳だなあ。rubyは結構オブジェクトをいじっている気持ちが強いですね。