いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

Ext.pass がどうしても使いづらい…

2013年07月10日 14時05分59秒 | Ext JS 系
Ext.pass または、Ext.Function.pass のお話(2つは同じ動作します)

さて、Extjs4 以降はMVCになったので、いろいろと楽です(設計とか)
今回探し回っていたのが下記URLの「関数委譲関数を生成する」の部分
http://code.xenophy.com/wp-trackback.php?p=1882

要するに
”コントローラーでイベントを受信した時に、引数を追加して共通処理を呼びたい。”
って事なんですよ。(要約してない…)
で、このURLを探し当てたわけですよ。

見つけて理解した時「さすがです。痒い所に手が届く!」とか思って読んでました。



しかし、詳しく理解するためにドキュメントを読むと…あれ?
追加の引数が前に来ちゃってますよ…?
そう、Extjsのドキュメントを見ても、src/lang/Function.jsソースの中を見ても、実装して確認しても、
追加する引数が"前(第1引数)"に使われているではありませんかっ!

なぜ?

追加引数が前だと、引数を指定したくない場合(デフォルト動作)の処理が面倒です。

例えば:
  1.イベント引数の場所が決まって居ないので「第1引数の型がAの場合、型がBの場合、型がC…」と処理をわけなければいけない。

  2.引数が不要なのに、空白引数を指定しなければいけない。
Ext.Function.pass(this.onButtonClick, [''], this)

  3.引数の数によって入れ替えをする。
function( arg1, button, e, eOpts ) {
if(arguments.length == 3 ) {
eOpts = e;
e = button;
button = arg1;
arg1 = '';
}
// なんだかの処理
}


などなど、面倒がたくさんです。
ちなみに私の意見
1.本末転倒過ぎる…メソッド分けるわ…
2.あほらしすぎる+チーム全体&保守チームに連携するのダル…
3.ありえ無い…でも僕の頭ではこれが限界…orz
となり、3.を採用しました。
(ちなみに引数が2個、3個と増えれば、その分ずれるので叱らず…)

追加引数が後に付けばこんなこと一切する必要がありません。
というわけで、
なぜ追加引数が前なのだーーーー理由を教えてくれーーーー開発者ーーーー

とか叫びたくなったので書いてみました(笑)



さて、ここまでいろいろ書きましたが、参照URLでこの事について何も記載されていません。
と言う事は「追加引数が前に有ったの方が良い理由があるはずだ!」と思い考えてみても、私の頭では到底思い付きませんでした。
謎は深まるばかり…私には精神ポイントが足りなく、"ひらめき"が使えないようです。

Extjsのソースを見る限り、追加引数を後ろにするのは簡単だけど…
・影響範囲が広すぎるから、後ろにはされないだろうなー…
・前に追加・後ろに追加フラグ持たせるのもなんだかなー…
と言う事で、ずっとこのままでしょう。個人的には残念です。


修正案:(未テスト)
ファイル:src/lang/Function.js
メソッド:pass: function(fn, args, scope) {
修正前:
return function() {
var fnArgs = [].concat(args);
fnArgs.push.apply(fnArgs, arguments);
return fn.apply(scope || this, fnArgs);
};
修正後:
return function() { // 配列に入れる順番を変えれば良いのでは?
var fnArgs = [];
fnArgs.push.apply(fnArgs, arguments);
fnArgs.push.apply(fnArgs, args);
return fn.apply(scope || this, fnArgs);
};


遅くなっちゃうのかな?そのほか理由があるのかな…?ん~悩ましい…



************** コメントへの返信 **************
> Unknown (匿名さん)
> 2013-08-08 16:15:32
いろいろ考えながら書いたので、別記事にしました。
こっち見てね。
http://blog.goo.ne.jp/pianyi/e/71bc79cfee4ee1135583a063063c1cff

コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« JavaScript Compressor | トップ | コメントに対するお返事 »

1 コメント

コメント日が  古い順  |   新しい順
Unknown (匿名さん)
2013-08-08 16:15:32
> 2.引数が不要なのに、空白引数を指定しなければいけない。
> Ext.Function.pass(this.onButtonClick, [''], this)

引数が不要なら Ext.Function.pass(this.onButtonClick) で動くように見えますけども。

--
後ろに追加しない理由は、元々の引数が幅が変動するから、ではないでしょうか。
関数によっては、引数が書いてなくても、後ろに渡ってきている場合があります。

参照サイトの
onButtonClick: function(name) {
// nameに名前が入ってくる
alert(name + ' Button');
}
なんかもそうですね。
nameの後ろに、btnが渡っているとおもいます(多分

仮に、後ろに追加した場合、元々の関数に渡ってくる確実な引数の数がわからないと、追加した引数を処理することが難しいとおもいます。

なので、後ろに追加する不確定なものよりも、幅が作成者の手に委ねられる前の方が確実です。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Ext JS 系」カテゴリの最新記事