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

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

コメント

このブログの人気の投稿

ヨドバシカメラの店舗購入履歴を見るには…

C# の WPF の DataGrid で 行を交互に背景色を変える+選択色を変える+カラムが無い所も変える…

Visual Studio の ホットリロードが動かない場合に確認するところ