最近のjsプログラムの組み方
僕はコードスタイルが一定しないのですが、最近はクロージャ!クロージャ!
最近は Firefox拡張/Greasemonkey/userChrome.js 系の javascript しか書いてないんだけど、そのあたりで「オブジェクトの継承」とかしたいと思うことがなく、 prototype とかややこしいだけなので全然使わなくなりました。
昔
function myClass(){ this.init.apply(this,arguments); } myClass.prototype.init=function(name){ this.name=name; } myClass.prototype.hoge=function(){ return "hoge" } myClass.prototype.huga=function(){ return this.name+this.hoge()+"huga"; } var a= new myClass("a"); var b= new myClass("b");
prototype にプロパティーを設定していく、ClassExtend みたいなのを作ったりもした。
オブジェクト指向を使いこなせてこそ最高のプログラマ、そう思っていた時代が僕にもありました、という感じ。
方針としては
- 全部プロパティー
- なるべく固める
今
function myClass(name){ function huga(){ return name + hoge() + "huga" } return { // 最後にpublicにする huga:huga, name:name, // そとから参照しない場合はつけない hoge:hoge // あんまり意味がないので最近はつけない } } // 内部の値を使わない関数はなるべく外に function hoge(){ return "hoge"; } // instanceOf とか使いたいとき以外は new もしない var a= myClass("a"); var b= myClass("b");
継承? しないよ。どうしても継承みたいなことがしたい場合は
function myClassTomyBClass(myClassObj, exprop1 ){ myClass.hoge = function(){ return exprop1; } return myClass; } myExObj = myClassTomyBClass( myClass("a"));
こんなかんじかなぁ。
方針としては
- なるべく public=グローバル なものを減らす
- なるべく 塊を分ける
何がいいか?
変数の影響する範囲がよくわかる。再利用もしやすい。変数のスコープをソースコード的に小さくするのが目的で、。
オブジェクトにメソッドとして持たせると、オブジェクトのプロパティーに関係の無い行為までオブジェクトがやっている気がするという”連想”からオブジェクトのメソッドに定義してしまっていたけど、この指針で行くとオブジェクトに関係あるかないかを、オブジェクトの状態に関係あるかないかで判断でき、小さなクラスに分けられる。
あ、オブジェクト定義関数の中で複数のオブジェクト定義してプロパティーにするとかは普通。まとまった機能をクラス内クラスにしてオブジェクトコンポジションで移譲する感じ(ちょっと違うか)。クラス内クラスなので一番外側のクラスのプライベートなプロパティーがグローバル変数気分で使えたりする。
こうしておくと、コピペしやすい! 再利用=コピペ!
this とかまんどくさい。