2007年 12月 25日

コードのよみかた

last_char = s.charAt(s.length - 1)

何が解りにくいって、どの単語が変数でどの単語がプロパティでどの単語がメソッドで…という区別が付かない。

http://d.hatena.ne.jp/hama_shun/20071224/1198504421

区別がつかなくても読めはするはず? (むしろ、どれがプロパティで……どれがメソッドで……っていうのは定義とか考えるとめんどくさいよなぁ……)

このコードでまず重要なのは、s が何であるか、ということだけだから、そこから読めば疲れないんじゃないかなぁ。

  • last_char はこの行で代入されているので、この先を読むにあたっては、この行さえ理解できれば、この前でどんな使われかたをされていようが関係ないし、先を読むのに必要なだけなのでとりあえず無視できる。
  • charAt, length は、s のプロパティアクセスなのだから (ドット演算子があるから)、s が何かわかればそれのリファレンスを読めばなにかわかる。

このコードだけから推測すれば、charAt がある標準オブジェクトは String しかないので sString だと思われる (sString の s だとおもうし、last_char に代入してることからも、s は String だなぁというのが想像できる)


自分がこの行を読むときのプロセスは (かなり冗長にかくと)

  1. last_char に代入してるなぁ
  2. last_char って名前から右側でやってそうなことを想像
  3. → 最後の文字が代入されるはず?
  4. last_char という名前はいったん忘れる
  5. s.charAt(s.length - 1) を頭にいれる
    1. ドットでくぎる
    2. s ってなんだろ (前からさがす)
    3. (この場合は前に定義がないので) charAt をよんでるし s だから String か
    4. charAt は位置を引数にとって文字を返すメソッドか (String のリファレンスよむ)
    5. 引数が s.length - 1 か
      1. s.length は s の長さか (String のリファレンスよむ)
      2. 長さ - 1 だから最後の文字の位置か
    6. s.charAt(s.length - 1) は最後の文字を取得か
  6. last_char に代入か (もどってくる)
  7. 最後の文字を取得して last_char に代入か
  8. 「last_char は s の最後の文字」だけ覚えて次の行を読む……

脳内スタック多い人はもっと別の読みかたできそうだよあぁ……