hayakawaの日記: 教えて、エロいひと! 4
日記 by
hayakawa
ずっと前から、いまいちピンときていないことがあるんです。
匿名メソッドってあるじゃないですか。個人的には「メソッド宣言なしでメソッドを作る方法」程度の理解しかないんですが、あってるのかな?正直なところ、こいつがなぜ便利なのかというところが、いまいちよくわかっていないのです。
まあ、普段はJavaScriptとかPHP、C言語とかでコーディングする機会しかないので、他の言語でごにょごにょやる人にはメリットがあるのかもしれないのですが、暇な方がいたらご教示いただきたく。
……とか、無知をひけらかして恥をさらしてみるテスト。
名前空間を食いつぶすのが良くない (スコア:2, 参考になる)
Cなら、「関数へのポインタ」を外部に晒しておいて、関数自体は static で宣言して、初期化の時にポインタを初期化する(必要に応じて関数を切り替える)というのはやると思いますが…あれも、こいつの一種だと思えばよいかと。
ようするに物に名前をつけようとしても、「判りやすい名前」というのには限りがある。一方でオブジェクト指向っぽいプログラミングパラダイムは
「似たりよったりなものを沢山作っておいて、状況に応じて切り替える」
というスタンスなので、ますます同じような名前ばかりになる。それだと区別するのが難しいよね?
で、一方でそういう場合に指定したいのは「関数の実体」であって「関数の名前」じゃなかったりするよね??!じゃぁ、名前なしで関数をポイントする方法があればいいじゃん。裏でよしなにやっておくよ…というのがこの方式の判りやすい説明ではないかと。
.
「static 宣言した関数を複数用意して、そいつへのポインタを切り替える」カタチのコードを組む、という例に戻ると。リンクが完了したら strip して外部に見せない関数とかの名前を全部消しちゃうことってできるよね。そうすると、ほら、static 関数は実質的に名無しになる。
もちろん、strip してしまったバイナリのバグをデバッガで追いかけようとすると、
「今ジャンプしたここは、ソースコードで言うとどこ??」
という対応がつかなくなって、ドえらく難儀します。なので、このメソッドの場合、裏では「よしなにするための名前」が自動生成されているのですが、それはプログラマからは見えない/気にしなくていい。
デメリットは 大域的静的デバッグ (ようするにソースコードを参照するだけで、実際に実行することなく、バグの在処を探そうとする行為)がますます困難になること。多分機械にやらせないと、あるメソッドの実体はどことどこで初期化され得るのか、どこを走ったときに問題を起こし得るのか、を追跡するのはもはや人力では不可能になる。
# 『名前をつける』という行為は、実体を考えなくて済むためのシンボルを与える、という行為なので
# そのシンボルが付いていないと、記憶容量が貧弱な人間の脳みそには耐えられなくなる。
fjの教祖様
ラムダ式のことですか? (スコア:1)
匿名メソッドって、ラムダ式のことですか?
JavaScriptでfunction(){なんとかかんとか}みたいなものも入るか。
いずれにしても関数オブジェクトをその場限りで生成するには便利ですよね。
クロージャとか使うなら特に。
屍体メモ [windy.cx]
Re:ラムダ式のことですか? (スコア:1)
メソッドの定義時に名前を必要としない。=>命名で悩まずに済む。
そのメソッドが使われる処理の中で定義ができる。=>処理を追いやすい。
メソッドとして定義するので、その外側にあるメソッドで、その処理のための変数を用意する必要がない。=>ローカル変数の数を減らせて、変数名も簡略化できる。処理に近い場所で宣言できる。
デメリットとしては、
名前がないので、コメントを適切につけないと、コードを読まない限り、処理が分からない。
定義される処理が長いと、その外側の処理を追いにくくなる。
メソッドの中でメソッドを定義するので、やたらと行数の多いメソッドが出来上がる恐れが大。
と言ったところでは。
Re:ラムダ式のことですか? (スコア:1)
・使い捨ての関数を、使う場所で定義できる
とかですかね>メリット。