‘つぶやき’ カテゴリーのアーカイブ

JavaScriptのクラスの書き方の考察

 つぶやき, プログラム
 公開日:2013年5月4日 / 更新日:2013年9月16日

前回の続きです。
今回はさらに考察を進めてみました。

JavaScriptの「クラス」の書き方は大きく分けて、
prototypeなスタイル、

closureなスタイル

の2つになりそうです。
それぞれの長所と短所を考えてみます。

prototypeなスタイルでは、
どんなプロパティやメソッドがあるのかが
closureなスタイルに比べて見やすい傾向。

prototypeなスタイルでは、
メソッドの定義は一度だけだが、
closureなスタイルではインスタンスをnewする度に
定義することになる。

closureなスタイルでは、
ソースがコンパクトになる。
タイピング量も少ない傾向。

closureなスタイルでは、
privateな変数や関数が設定しやすいので、
カプセル化という観点では有利。

prototypeなスタイルでは
後でメソッドを追加した場合は、
既に生成した全てのインスタンスが影響受けるが
(追加メソッドが利用可能となる)
closureなスタイルでは、
以降に生成されるインスタンスだけに影響する。
当然こうなるわけですが、
プログラム組む上で大きな違いとなりますね。

そんな感じで一長一短なので、
書き方をどちらかに統一するとしたら
なかなか悩ましい。
ハイブリッドな感じもアリかも。

個人的にはclosureスタイルが好みなのですが、
newする度にメソッドが定義されるのは、
そのぶん余計にメモリとかCPU時間とかを
喰いそうなのが気になりますね。
検証したわけではないのですが・・・。

公開されているライブラリとか参照してみると、
prototypeスタイルが大勢な感じがします。

突き詰めると、publicなものは
書き換えることが出来てしまうJavaScriptでは、
privateな変数や関数を使って
カプセル化して行儀良い感じに作っても、
汚染できるものは汚染できてしまうわけです。
結局のところ、
規則を決めて運用することになってしまいそうですね。

ということで個人的な結論。
基本はprototypeなスタイルで書くが、
ケースバイケースでclosureなスタイルも検討する。
一個くらいしかインスタンスを生成しないようなクラスなら
closureスタイルで構わないかも。

asm.js

 つぶやき, ゲーム, トピック, プログラム
 公開日:2013年3月22日 / 更新日:2013年5月14日

Firefox22がasm.js採用でネイティブに近い実行速度まで高速化。
だそうです。

聞いたことなかったので、
「asm.js」って何ぞ?
と思ったわけですが、

JavaScriptプログラムをネイティブコード速度の2倍程度の実行時間で済むように最適化するJavaScriptサブセット

とのこと。

ベンチマーク的には以下の様な感じになるらしいです。
これはちょっとスゴイのかも、

こちらをざっと参照した感じでは、
どうやら静的型付けを導入することで高速化を図るっぽいようです。
int と double を使い分けできるようになる感じです。
バイナリを扱うような場合に高速化が期待できそうな気がします。

動的型付けなJavaScriptでは、
数値は全てdouble として扱われるようになってます。
Typed Arrayとかあったりしますが使用は限定的)
整数で済むような場合でも倍精度浮動小数点数で処理されるので、
素直な実装ならそれなりにオーバーヘッドがあったりしそうですね。
asm.jsによって、こういうのとかが改善されるってことなのかな?
実装的には Typed Array をうまく使う感じっぽい。

具体的には、
“use asm”;
とか書いて宣言することで導入されるようです。

静的型付けの表記は以下のようにやるそうです。

実に巧妙な表記になってますね(^_^;)

本来なら、

とかActionScript3風味に記述できれば分かりやすいわけですが、
JavaScriptの言語仕様を変えずに巧妙に仕込んでる所がミソなんだと思います。
静的型付けのための巧妙な表記は上記の2種類しかなさそうなので、
int と double に割り振ったということなのでしょうね、たぶん。

ただ基本的には、
C/C++等 -> LLVM -> Emscripten -> JavaScript
という感じに機械的な変換で適用されることを
念頭に置いているみたいです。
人が書くのにはちょっとメンドーそうだし。

★2013/3/29追記。

UE3とかあっさり動かしてしまったようですよ。
自動変換おそるべし(^_^;)

JavaScriptのクラスの書き方と継承

 つぶやき, プログラム
 公開日:2013年2月18日 / 更新日:2014年10月9日

ふと思ったのですが、
JavaScriptのクラスの書き方が
自分の場合マチマチで統一感が無いなと(^_^;)

ライブラリのクラスを継承する場合は、
その流儀に倣った方が良いかなと思うので、
その影響もあるかもしれません。

ときに、
JavaScriptはクラス・ベースでは無く
プロトタイプ・ベースな言語なので、
「クラス」という言い方は厳密には正しくないのかもしれませんが・・・。

それはともかく、
どんな書き方をするべきなのか気になったので、
ググってみたらこんな感じに色々ありますね。

自分は、
プロトタイプに追加な書き方、

プロトタイプを上書きな書き方、

でやってたりすることが多いようです。

また、
enchant.jsライブラリを利用している場合は、
こちらに示されているように、
以下のようにスマートな感じに書くことができます。

ただ、これらの書き方だと
privateな変数や関数はどうしたものかという問題があります。
個々のメソッドをクロージャにすれば可能ではあるけど、
インスタンスで共有なprivateなのは作れないですよね。
そんな時は以下のようにアンダースコアな名前にして、

this._privateProperty = 'secret!?';

privateを装ったりするわけですが、
実際は丸見えなpublicなわけです。
自分はあんま気にせずやったりしますが・・・(^_^;)

privateなのを作りたい時のクラスの書き方はどうすべきなんだろうと、
調べてみたらこちらを見つけました。
クロージャー・パターンとか言うみたいです。

上記の書き方だと、
プロトタイプな書き方に比べて、
どんなプロパティやメソッドがあるのかが、
ぱっと見でちょっと分かりにくい感があるけど、
なるほど悪くないなと思いました。

例えば、
コンストラクタがパラメータを持ち、
そのパラメータをメソッドが参照するような場合、
プロトタイプな書き方だと以下のようになりますが、

クロージャー・パターンだと以下のようになります。
コンストラクタのパラメータをプロパティとして持たなくてもよいので、
スッキリと書けますね。
これはイイかも。

さらに、
全インスタンスに共有な関数や変数まで考慮すると
以下のように書けそうですね。
無名の即時実行関数を利用してクロージャ化します。

続いて、
JavaScriptのクラス継承の書き方について考えてみます。

こちらが参考になりますね。
こちらのように継承用の関数を使うやり方もありますが、
独立して完結する以下の様な書き方が個人的には好みな感じです。

ちなみに、

Extend.prototype.constructor = Extend;

をやらなくても実用上は問題なかったりします。
というのは、
new 演算子は以下の様な感じになっていて、
prototype.constructorを呼び出しているわけではないようなので。
(間違ってたらすいません)

とは言え、省かずにちゃんと書いておいた方が無難だと思います。
例えば、

のように、特定クラスの識別とかで利用している場合があるかもしれないので。

通常は、継承クラスのコンストラクタ内で
スーパークラスのコンストラクタを呼び出すわけですが、
以下のようにメソッド内に書くことも可能だったりします。
クラス・ベースな言語には真似できない芸当ですね(^_^;)

上記のようなのはあまり無いと思うのですが、
スーパークラスのコンストラクタがパラメータを要求する場合に、
そのパラメータがすぐに確定できなかった時とかで使えるかもしれません。

JavaScriptにおける「クラス継承」と言うのは、
他クラス(というか他オブジェクト)の実装を
自オブジェクトに導入するという感覚なんだと思います。

ところで、
今回こちらのページを見て気になったことがありました。
それはコンストラクタで

return this;

とかやっていることです。
なんじゃこれは? 必要なのか? 
と思ってググってみたら、
こちらの解説を見つけました。
いや~、これは知りませんでした。

要するに、
コンストラクタがオブジェクトを返した場合はそれがインスタンスと成る
ということのようです。
new は暗黙的に return this; してたんですね。

JavaScriptはなかなか奥が深いです(^_^;)

★追記 さらに考察してみました。

回る女

 つぶやき, トピック
 公開日:2013年1月19日 / 更新日:2013年1月20日

なんかこんなの見つけた。

それにしても彼女はナゼ回るのか?

こちらの場合は人によって回転方向の左右が異なるっぽいそうです。

東京とかで7年ぶりくらいに大雪っぽい

 つぶやき
 公開日:2013年1月15日 / 更新日:2013年1月17日

「大雪」とかなってますが、
雪国な地方に比べたら積もった内に入らないかもしれませんね。

例のごとく都会人の脆弱性が露呈(^_^;)
自転車とかもう無理ゲーなので、
超ひさしぶりに長靴とか引っ張りだして歩くしか無い感じ。
倍くらい時間かかります。

謎なアートとか出現したらしいです(^_^;)