IT戦記 このページをアンテナに追加 RSSフィード Twitter

2007-04-13

「勝手に添削 - JavaScript 入門」を勝手に添削

このエントリーは以下のエントリーへの解答です

404 Blog Not Found:javascript - 勝手に添削 - JavaScript入門

はじめに

僕はあまりブログを一生懸命書くのは嫌いです。で、いつも適当に言葉は少なめにソースだけで解説しているが。今回は、それだけでは伝わらないところまで突っ込まれてしまったので、僕が伝えたかった意図をこと細かく説明していこうと思います。

文章が苦手なので、変な言い回しで読み辛かったりすると思いますがよろしくお願いします。

一応、弾さんには断っておきますが、別に弾さんに噛みついている訳ではないです。ただ、弾さんのような有名人に突っ込まれたら、僕の講義を聞いてくれたエンジニアが嘘を教えられたと不安になってしまうのではないかと思ったのです。僕の講義を聞きにくれた人には、虚像でもいいから 100 % の自信と勇気を付けて欲しい(プログラムを書く上ではそれがとても大事だから)。

だから、あえて「反論」させていただきます。

# ブックマークのタグは「全力で反論」でお願いします。

まず

僕は、弾さんの指摘していることを完全に理解したうえで正しいとは思わない。

しかも、弾さんが指摘していることは非常に細かなことで、まさに自転車置場の議論のようなものだ。プログラミングを学習している人はその細かなことで不安を煽られて欲しくない。

Klass.prototype = {} は避けるべきではない

Object.prototype = {} は避けるべきではない*1

揚げ足を取るようで嫌なのだが、弾さんの以下の例では継承は行われない。

MyBox.prototype = Box.prototype; // ここで継承しているのに

継承を行うなら、まず、継承を行えるように Box を書き換えて

var Box = function() {
    if (arguments.length == 0); // for extends
    else {
        :
        (本来のコンストラクタの処理)
        :
    }
};

以下のようにプロトタイプを置き換えるべきだ。

MyBox.prototype = new Box;

そして、これが JavaScriptプロトタイプ継承の正しい方法である。

MyBox.prototype = new Box;
MyBox.prototype.hoge = 'hoge';
MyBox.prototype.fuga = 'fuga';

ちなみに、弾さんがやるなと言っている

Box.prototype = {
    hoge: 'hoge',
    fuga: 'fuga'
};

のような書き方は、そもそも

Box.prototype = new Object;
Box.prototype.hoge = 'hoge';
Box.prototype.fuga = 'fuga';

シンタックスシュガーに他ならない。

つまり、 Box.prototype = {...} という書き方は Object.prototype を正しく継承するための書き方に他ならないのである。

もし、そのシンタックスシュガーは癖になって継承のときにも使っちゃって継承が台無しになってしまうから使うな。という意味の指摘であれば、こう言わざるを得ない。「{} が new Object; のシンタックスシュガーだということを理解していれば、そんな間違いを犯すことはないし、間違えてもすぐ気付くはずだ」。

もちろん、弾さんの書き方がダメと言ってる訳ではない。どちらも正しいので、趣味の問題、自転車置場の議論だと言っているのです。

with はある程度避けるべき、しかし、挙動は押さえるべき

たしかに弾さんのおっしゃるとおり、 with は不思議な文法なので、あまり使うべきではないかもしれない。(ちなみに、僕は使ってもいいとは思ってる。)その件については社内勉強会でもかなり白熱した議論になった。

ただ、ここで言っておきたいのは、 with 文の挙動を知らないと読めないソースがあるということだ。人のソースが読めるレベルの JavaScripter を育てるためには with 文の挙動は絶対に必要だ。

なぜなら、 with 文は with 文でしか説明できない現象であるからだ。オブジェクトプロパティ名という名前空間を、スコープの変数名という名前空間に重ねる唯一の方法であるからだ。

そして、それを説明して with 文を把握したうえで全員が納得した。そこにこそ、あそこで with 文を紹介した意味があったのだ。

ただ、あの資料には、そのような説明書きがひとつもなかったのでこのような議論を生み出してしまったのだと思う。そこは、ひとこと(口頭ではなく)書き添えるべきだったかもしれない。

まとめ

講義を聞いてくれたかたには「あの講義は微妙だった」とは思わずに、自信を持って JavaScript を書いていって欲しいです。その過程でこの議論に自分なりの答えを見つけて欲しいです。

最後に弾さんに一言、偉そうなこと言ってごめんなさい><ごめんなさい><

*1:ma.la さんの指摘で直しました。混乱させてすみません

tktk 2007/04/13 09:53 勝手に添削なんて弾さんも失礼な方ですね。これまでのamachangの自由で魅力的な発言から比べれば、この議論はまさに自転車置場のものといってよいと思います。はっきりいってまったく面白くない。有名人であることを利用した釣りか?悪質なスパマーと思ってスルーでいいんじゃないでしょうか。他人の事ではあるものの、好きな絵画を汚い筆で汚されているような、不愉快な気分になりました。正しい、正しくないということではなく感性の問題ですね。

いやいやいやいや 2007/04/13 10:27 こういうやり取り(?)こそブログの醍醐味で、記事の価値を高めると思いますが。
自転車置場の議論だとしても、興味をもって読む人にとっては、なるほどと思わせるものですからね。

H30H30 2007/04/13 11:00 弾さんは基本的に、質より量、考慮よりスピード、を優先される方です。弾さんの反論記事の過半数は、考慮が浅かったり論点がズレていることは大半の読者は既に分かっていると思います。分かっているのですが、、ブログの水掛論がみんな好きなんですよ。人が集まります。僕も見ます。
というわけで、講義を聞いた人が不安になることはないのでamachangさんも不安にならないでください。こういうのは、スルーが基本です。
とはいえ、(水掛け論好きな読者への)読者サービスとして、これからもたまには反論記事に反論してください。

H30H30 2007/04/13 11:07 あ、誤解があるといけないので補足します。
質より量、考慮よりスピード、は、実践が難しく処理能力が高くないとできません。弾さんの影響力を考えても分かる通り、ブログの世界ではアリ、というか、なくてはならないものです。反論ナシ、更新頻度低い、なんてブログの世界はつまらないです。
以上、補足でした。

aasuaasu 2007/04/13 11:45 こういう記事は自ずと両方読んでしまいますね。合作っぽく見えて楽しいです。

くみこくみこ 2007/04/13 11:59 このやり取り、
「朝まで生テレビ!日中同時生放送」で
田原総一郎のキャラを森本敏が解説するシーンに似てる。

りょうりょう 2007/04/13 12:26 こういうやり取りはとてもいいと思う。
情報が補完されて正確になったり、色々方法があるな、と理解したり。
タイトルはただの冗句と受け取りました。

やむやむ 2007/04/13 12:26 スルーしちゃだめでしょ。全力で反論、良いと思います。
お互いが相手の考えをねじ伏せようとしているわけではないですし。

inamenaiinamenai 2007/04/13 13:20 弾さんの添削で講義にケチがついた…んじゃなくて、
添削とこの反論で補完されたことにより、
結果的にあの資料の価値はより高まったと思います。

C++C++ 2007/04/13 19:58 技術者同士で認識の齟齬があったんだけれど摺り寄せを行ってみた。
という事だろうから良いのでは。

tkurotkuro 2007/04/13 23:49 withがどうしてダメなのかな? amachang方式だって lisperには馴染深いだろうに。

mhmh 2007/04/14 01:34 だれでもコメントできるブログの性質上、
レベルの低い人につっこまれることもあるでしょう。
気にしないほうがいいですよ。
プログラム言語は手段であって、それゆえ方法、考え方はいくとおりもあるのに、勝手に添削って。。。マジダサイ

nnnn 2007/04/14 02:44 > 僕の講義を聞きにくれた人には、
> 虚像でもいいから 100 % の自信と勇気を付けて欲しい
自信っていうのは講義を受けて身に付けるものじゃないよ。
自分で試行錯誤して身に付けるものだよ。
amachang流の実装を唯一の物と盲信してもそれより上にいけないよ(既に信者多数だけど)。
初心者ならむしろ今回の添削合戦で深い知識の一片を得られて有益だったハズ。

javascripterjavascripter 2007/06/19 19:25 初心者ですが、「原文」と「添削」またこの「反論」を全部見たから、
なるほどっていいう感じをしました。

ケンカするよりは、真剣にディスカッションするの方が建設的ではないか
と思います。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。