app-c.odp

1,627 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,627
On SlideShare
0
From Embeds
0
Number of Embeds
188
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

app-c.odp

  1. 1. Javascript: The Good Parts 付録 C JSLint 岸本 誠 2011 年 9 月 17 日 静岡 Developer's 勉強会
  2. 2. Lint とは <ul><li>この場合、包帯用の布のこと
  3. 3. 昔の C コンパイラは、続行不能なエラーか、正しい入力に対し正しい出力をする、ということしかしなかった </li><ul><li>C言語には「未規定」や「未定義」がたくさんある(※時代) </li></ul><li>Another HTML-lint など </li><ul><li>http://openlab.ring.gr.jp/k16/htmllint/ </li></ul></ul>
  4. 4. それってコンパイラに付いてたほうが? <ul><li>実際そうです(パーサが重複して無駄、意味情報が使える)
  5. 5. GCC なら -Wall -Wextra とか付ける
  6. 6. -pedantic とか -Werror も付けるともっとエクストリーム </li></ul>
  7. 7. 以下の概要 <ul><li>JSLint の使い方
  8. 8. JSLint がチェックすること </li><ul><li>書籍紹介分
  9. 9. 書籍に紹介がないもの </li></ul><li>この読書会のまとめという感じで </li></ul>
  10. 10. JSLint の使い方 <ul><li>サイトに行って使う </li><ul><li>http://www.jslint.com/
  11. 11. テキストボックスに JS ソースをペーストして
  12. 12. ボタンを叩く
  13. 13. JavaScript アプリ </li></ul></ul>
  14. 14. JSLint の使い方 <ul><li>ローカルで使う </li><ul><li>https://github.com/douglascrockford/JSLint
  15. 15. 他にも JavaScript ソースを取ってこないと動かない </li><ul><li>json2.js, adsafe.js, intercept.js </li></ul><li>CGI ではないので httpd は必要ない
  16. 16. jslint.vim とかあるらしい(詳しく調べてない) </li></ul></ul>
  17. 17. JSLint の使い方 <ul><li>HTML ごとチェックする機能もある </li><ul><li>“ <!--” を認識しなかったり </li></ul><li>オプションの設定 </li><ul><li>デフォルト(グレー)、悪いものを不許可(白)、悪いものを許可(黒) </li></ul><li>構文木出力機能がある </li></ul>
  18. 18. C.1 グローバル <ul><li>定義されてない名前はチェックされる
  19. 19. よく使われるグローバルな名前( document )のセットを定義済みとみなすオプションがある
  20. 20. 左の列の Assume なんとか
  21. 21. 定義前に使われているものもチェックされる。「 Tolerate misordered definitions 」オプション </li></ul>
  22. 22. C.2 メンバ名 <ul><li>メンバ名の使用をカウントしてくれる
  23. 23. /*members で始まるコメントがあると、そこに出てこないメンバ名をチェックしてくれる </li></ul>
  24. 24. C.3 オプション <ul><li>本に解説のないオプションがたくさんある
  25. 25. 主に、チェックをいろいろオフにできる </li><ul><li>Safe Subset は逆? </li></ul><li>インデント幅、行を長すぎるとする長さ、
  26. 26. エラーを報告する個数を指定できる </li></ul>
  27. 27. C.4 セミコロン <ul><li>セミコロンの省略は禁止 </li></ul>
  28. 28. C.5 改行 <ul><li>セミコロンが補完される改行、が禁止
  29. 29. オフにするオプションがあると書かれているが、ない?
  30. 30. “ tilde” は誤植か? (初版)
  31. 31. 「末端子」( closer ) '}' 以外の閉じカッコのこと (?) </li></ul>
  32. 32. C.6 コンマ <ul><li>コンマ演算子が禁止( for 文以外)
  33. 33. 配列リテラルでの要素の省略や最後の余計なコンマの禁止 </li></ul>
  34. 34. C.7 if などでブロックの強制 <ul><li>If 文などでブロックを強制
  35. 35. (確かそういう言語があった気がする)
  36. 36. C.8 の最後の一文「ただし else 文~」はこっちの説明か? </li><ul><li>If (cond) {} else { if (cond) {} } のように else if パターンでブロックを強制すると過剰なネストになる
  37. 37. Dangling else 問題とか、 elsif キーワードとか </li></ul></ul>
  38. 38. C.8 単独のブロックの禁止 <ul><li>C 言語などで、変数のスコープを制限するブロックを作ることがある
  39. 39. JavaScript ではスコープは制限されないので </li></ul>
  40. 40. C.9 必要のない式文の禁止 <ul><li>たとえば「 1 + 2; 」という文(式にセミコロンを付けた、式文という文)は、計算するがその結果を捨てる、というだけで全く意味がない
  41. 41. たいていはバグ
  42. 42. 代入とかも式なので、式文自体は必要なもの
  43. 43. (代入文とか、必要なぶんだけ全部文を用意して式文をやめた言語もある?) </li></ul>
  44. 44. C.10 フィルタのない for in の禁止 <ul><li>オプション「 Tolerate unfiltered for in 」で制御可能 </li></ul>
  45. 45. C.11 fall through の禁止 <ul><li>switch 文の fall through はたいていがバグ
  46. 46. fall through が必要なパターンは、複数の case で同じ処理をする場合がほとんど
  47. 47. (付録 C での説明にはないが)複数の case を羅列する場合だけ許可(図 2-15 )
  48. 48. ( C# では言語仕様)
  49. 49. /* FALLTHRU */ があれば許してほしい、かも? </li></ul>
  50. 50. C.12 var の制限 <ul><li>関数中の var は先頭にひとつのみ </li><ul><li>オプション「 Tolerate many var statements per function 」で緩和 </li></ul><li>禁止されている “ var arguments;” は
  51. 51. JS のコーナーケース。
  52. 52. “ arguments” は予約語みたいなものと考えるべき
  53. 53. 「 Tolerate misordered definitions 」オプション </li></ul>
  54. 54. C.13 with の禁止 <ul><li>with は一見便利だが混乱をもたらす
  55. 55. 長い . 長い . 長い参照 .a = …
  56. 56. 長い . 長い . 長い参照 .b = …
  57. 57. みたいなコードは、
  58. 58. var obj = 長い . 長い . 長い参照
  59. 59. obj.a = … のようにするのが良いイディオム </li></ul>
  60. 60. C.14 条件の文脈で、'=' の禁止 <ul><li>比較のつもりの If (a = b) というバグを発見できる
  61. 61. 片方が定数などならそれを左に置く慣習にすれば if (1 = a) になるのでエラーになる、というイディオムもあるが、不自然だし変数には使えない
  62. 62. しかし while (c = gets()) みたいなイディオムもあるので、カッコで囲めば許可 while ((c = gets())) という JSLint の仕様はうまいと思う
  63. 63. (確か似たようなカッコの使いかたは他にもある) </li></ul>
  64. 64. C.15 == と != の禁止 <ul><li>デフォルトで禁止になっている。許可するには「 Tolerate == and != 」オプション
  65. 65. 常に Strict Equals Operator の === か !==
  66. 66. 「 < 条件 > == TRUE 」などと書かず単に「 < 条件 > 」と書け、という話は C 言語 FAQ にもある
  67. 67. http://c-faq.com/bool/bool2.html
  68. 68. ( C.14 の例外の場合は明示したほうがいい?)
  69. 69. (言語によって違う「真 or 偽であるもの」) </li></ul>
  70. 70. C.16 ラベルの制限 <ul><li>switch や while や do や for にしか付けられない
  71. 71. 最近はセキュリティな人の徳丸さんが blog に書いていた
  72. 72. http://www.tokumaru.org/d/20070915.html
  73. 73. 実際、 JSLint で禁止されているようなラベルの使い方は、スマートではないようである </li></ul>
  74. 74. C.17 実行されないコード <ul><li>うっかり存在してたら 100% バグでしょう(ほんとに?) </li></ul>
  75. 75. C.18 連続した単項の '+' か '-' <ul><li>空白のありなしで意味が変わる(インクリメント演算子)など確かにややこしい。カッコを付ける。(そもそもカッコなしで使う?)
  76. 76. よくある処理系の実装では、レキシカルアナライザは構文を見ずにトークンとして最長のものを切り出すので、空白のない '++' は問答無用にインクリメント演算子になる </li></ul>
  77. 77. C.19 ++ と -- <ul><li>デフォルトで禁止されている。許可するには「 Tolerate ++ and -- 」オプション
  78. 78. しかしそんなに悪いものか?
  79. 79. 後置の時の、変化前の値が式の値になる、という仕様を使って、簡潔にコードを書けることがある(これは i += 1 ではダメ)
  80. 80. 配列の全てに対して、というようなイディオムとかで使うと思うんだけど </li></ul>
  81. 81. C.20 ビット演算子 <ul><li>デフォルトで禁止されている。許可するには「 Tolerate bitwise operators 」オプション
  82. 82. 必要な時には必要なものなので、その時はオプションを設定しましょう、ということでしょう </li></ul>
  83. 83. C.21 eval is evil <ul><li>デフォルトで禁止されている。許可するには「 Tolerate eval 」オプション
  84. 84. 本書中のサンプルコードで多用されている document.write も eval 扱い
  85. 85. http://www.jameswiseman.com/blog/2011/03/31/jslint-messages-document-write-can-be-a-form-of-eval/ </li></ul>
  86. 86. C.22 void の禁止 <ul><li>常に undefined を返す前置演算子
  87. 87. 何らかの値を返す式を評価させたいが、その値を受け取りたくない時
  88. 88. <a href=&quot;javascript:void(document.bgColor='lightgreen')&quot;>green</a>
  89. 89. ヘ _ ヘ
  90. 90. ミ・・ ミ </li></ul>
  91. 91. C.23 正規表現 <ul><li>リテラルの / は結構ややこしい( vim の Ruby ソースシンタックスハイライトがたまに失敗する)
  92. 92. オプションの「 Tolerate . and [^...] in /RegExp/ 」をセットしないと . や [^...] も禁止される(プログラマの想定外の文字列にマッチすることがあるから、という理由) </li></ul>
  93. 93. C.24 コンストラクタと new <ul><li>普通じゃないものは全部禁止
  94. 94. 「 Tolerate uncapitalized constructors 」で小文字のコンストラクタは許可される </li></ul>
  95. 95. C.25~28 <ul><li>その他の JSLint の機能 </li><ul><li>略 </li></ul></ul>
  96. 96. 付録 C に書いてないチェック項目 (1/2) <ul><li>Type confusion
  97. 97. continue
  98. 98. debugger statements
  99. 99. ES5 syntax
  100. 100. Dangling _ in identifiers </li></ul>
  101. 101. 付録 C に書いてないチェック項目 (2/2) <ul><li>Unused parameters
  102. 102. Missing 'use strict'
  103. 103. Inefficient subscripting
  104. 104. Messy white space
  105. 105. 以上全て「 Torerate ~」オプションあり </li></ul>
  106. 106. <ul>Type confusion </ul><ul><li>型に混乱があるとチェックされる?
  107. 107. 試してみたがエラーを発生させる例がわからなかった </li></ul>
  108. 108. continue <ul><li>これは使うと思う
  109. 109. while ((line = gets())) {
  110. 110. if (line の内容が処理対象ではない ) {
  111. 111. continue;
  112. 112. }
  113. 113. ...
  114. 114. } </li></ul>
  115. 115. debugger statements <ul><li>オプションにより debugger 文を許可できる
  116. 116. いわゆるブレークポイント </li></ul>
  117. 117. ES5 syntax <ul><li>スクリプトで ECMAScript 5 の新機能を使っていて、過去の JS ではエラーになるものがある場合、許可にするオプション </li></ul>
  118. 118. <ul>Dangling _ in identifiers </ul><ul><li>識別子の先頭または末尾の _ を許可
  119. 119. (ECMA-262 5th ed. では特に予約とか言ってはいない、ようだ ) </li></ul>
  120. 120. Unused parameters <ul><li>未使用の仮引数はチェックされる </li></ul>
  121. 121. <ul>Missing 'use strict' </ul><ul><li>トップレベルにある関数の先頭には 'use strict'; という文が必要 </li></ul>
  122. 122. <ul>Inefficient subscripting </ul><ul><li>obj.??? ではなく obj[???] をチェックする?
  123. 123. (エラーにする例がわからなかった)
  124. 124. stackoverflow に質問があった
  125. 125. http://stackoverflow.com/questions/2448367/jslint-tolerate-inefficient-subscripting </li></ul>
  126. 126. <ul>Messy white space </ul><ul><li>普通じゃない空白のチェック
  127. 127. < トークン > の出現するカラムがおかしい、みたいなエラーがたくさん出たら、インデント数の設定をチェックすること </li></ul>
  128. 128. <ul>以上 </ul><ul>お疲れ様でした </ul>

×