grepとかググるだけで、ついでに色々わかったほうがいいよね的視点からみる言語の文法設計
mofmof.js は言語じゃないけど、クラスの定義部分はそれっぽいので、タイトルは勢いです。
忘れちゃうので、自分用メモ。
先週までの mofmof.js は、
mm("Class:Trait") でクラスの特性(Trait)*1を定義できたり、
mm("Class:Parent") で継承できたりしたのですが、
特性を持たせると継承できず、継承してしまうと特性を持たせる事ができなかったんですね。
mm("Hoge:Singleton", { ... });
とシングルトン特性をもたせると、継承できずにしょんぼる。と
解決しようとしたら、いまいちになった
クラスに特性を持たせつつ継承を可能にするために、先週仕様を変更し、以下のようにしたんですが、
mm("Hoge:Parent", { singleton: true // こっちで指定するように });
こうしてしまうと、grep 時に mm.Hoge が singleton かどうかがをぱっと見でわからなくなってしまいました。
つまり、情報量が下がってしまったんです。
hogehoge.js(7):mm("Hoge:Parent", {
こっちのほうが良かったのではないかと
mm("Hoge", {}); // 継承なし mm("Hoge:Parent", {}); // Parentを継承 mm("Hoge:Trait", {}); // シングルトンクラス mm("Hoge:Trait:Parent", {}); // シングルトンクラス + Parentを継承
なので、上記の方法に移行してしまい、
先週の { singleton: true } 方式(↓)は廃止しようかと。
mm("Hoge:Parent", { singleton: true }); // シングルトンクラス + Parentを継承
ただし、prototype.singleton を参照できるようにすると、
if (mm.Hoge.prototype.singleton) { console.log("mm.Hoge はシングルトンです"); }
と、このようにクラスの特性が定義後に分かるという良さもあるので、
リフレクション(UnitTest)用に、このへんは残しておこうと考えています。
一覧性と検索性を念頭においた言語の設計力がいまいちな uupaa でした。
(ε・◇・)з 半分ぐらい反省文だこれ。
Trait ってなに?
・「特徴」的なニュアンス
・クラスに後付けで幾つかのメソッドを合成(追加)できる
・Trait で追加したメソッドは、継承で追加したメソッドよりも優先的に名前解決が行われる
・ぶつかった場合にそなえ衝突解決手段がある
・単一継承クラスベースのOOPにおいて使われるもの。多重継承できる言語だと不要っぽい
・mixinと似ているが、Traitは継承はできない
という事らしいです。WikipediaのTraitをみても、なんのこっちゃなのですが、
PHPのTraitの説明なんかがそれっぽいですね。
mofmof.js では個別に衝突した名前を解決する手段は提供しないのですが、
そこまでの複雑性は恐らくオーバースペックであり、むしろ実装するとだめなんじゃないか説があるので、たぶん実装しません。