セミコロンに関するJSリーダーへの公開書簡

昨夜ショーン・シルバからこの手紙を受け取りました:
npm.jsプロジェクト(特に、このファイル: https : //github.com/isaacs/npm/blob/master/lib/npm.js )のコードを調べて、コンマを 'rに揃えていることに気付きました'var式、および[and {in array / object literals。 私はこのフォーマット方法が本当に好きですが、jsについてのほとんどのリソースは、あなたが示唆する何かで行を終了しない場合、自動セミコロンのためにコードに支配する混乱の恐怖を植え付けるので、私はそれを使用することをheします継続。
このように「ブラウザ」コードにカンマを配置するのは安全ですか、それともノードでのみ可能ですか?

私はいくつかの段落を書き、次の答えに短縮することにしました:
はい、それは完全に安全であり、すべてのブラウザで理解される完全に有効なJSです。 クロージャーコンパイラ、yuicompressor、packer、jsmin-すべてが適切に縮小できます。 パフォーマンスはどこにも行きません。
あなたを教える代わりに、この言語のコミュニティリーダーがあなたに嘘と恐怖を植え付けてくれて申し訳ありません。 これは残念です。 JSの命令が実際にどのように終了するか(そしてその場合は終了しない)を勉強することをお勧めします-そして、あなたは美しいと思うコードを書くことができます。


イニミノは非常に明確な説明を投稿した。 彼のスタイル-明確で、簡潔で、権威があり、良い研究で-そして、彼はいつものように、彼自身の意見を残しました。
私はもう少し偏見があります。

ルール

一般に、次の場合を除いて、 \n常に式を終了します。

最初のルールはかなり明白です。 JSLintでさえ、JSON、括弧構造、および複数の行で終わるvar式の\n文字を気にしません。
2番目は非常に奇妙です。 私は誰かがi\n++\njを書くためにそのようなことを(これらの種類の会話を除いて)一度も会ったことがありませんが、実際には、 i; ++jように解析しi; ++j i; ++ji++; j i++; j
3番目はよく理解されていますが、通常は無視されます: if (x)\ny() if (x) { y() } if (x)\ny()同等です。 この構造は、ブロックまたは式が検出されるまで終了しません。 ; 有効なJavaScript式であるためif(x); if(x){}または「if x、do nothing」に相当します。これは通常、チェックがカウンターの更新でもあるループに適用されます。 異常ですが、見つかりました。
4番目の、通常FUDに触発された「ああ、いや、セミコロンが必要です!」がそうです。 しかし、前の行を拡張したくない場合は、そのような行の前にセミコロンを付けるのは非常に簡単です。
たとえば、次の代わりに:
 foo(); [1,2,3].forEach(bar); 
書くことができます:
 foo() ;[1,2,3].forEach(bar) 

利点は、セミコロンなしで(または[行を開始しないことを決定するため、プレフィックスがわかりやすいことです。

制限ルール

セミコロンのもう1つの標準的な引数は、AISと制限されたルールに関するものです。 たとえば、トークンreturnthrowbreakcontinue 、または++または--直後に後置形式のx++\n場合(たとえば、 x++\nまたはy--\n )、これにより式は例外なく終了します。
 // return 7 //,  return 7 
繰り返しますが、これにもかかわらず、セミコロンで各式を完了するのを忘れるとすぐに、そのようなこと気付き、防ぐことが簡単になります。 2番目のルールを満たすと、私の脳は直感的に\n cを関連付けます。
最も重要なトークンを画面の左側に配置すると、人々がすばやく分析しやすくなります。 クイックリーディングの研究と眼球運動の山は、右側のトークンの欠落は左側のトークンの欠落よりも見落とされる可能性が高いと主張しています。 だから-私は繰り返します-あまり重要でないものを右に移動し、より重要なものを左側に置きます。

それで、どのスタイルが良いですか?

「最良のスタイル」が客観的に存在する限り、「セミコロン/コンマの最小値」スタイルがわずかに優れているように思えます。 2つの理由:このスタイルは読みやすく、開発者が使用する言語をよりよく理解できるようにするためです。
あなたがどれほどあなたを心配していても、あなたのJSコードはあなたが私を気にするよりも私をそれほど心配しないことを保証できます。 これは、私のスタイルでコードを書くように説得しようとする記事ではありません。 誰でも彼の家でズボンを着る方針を決めなければなりません
のれんの現れとして...

セミコロンを配置する正当な理由

セミコロンを使いすぎる理由は、美学と政治です。
「それ以外の場合は有効なC / C ++ / Java /その他のものではないため、JSにセミコロンを入れました。」 プロジェクトで多くのJavaまたはCコードを書くことを余儀なくされ、JSを目立たせたくない場合、これは価値のある議論です。 ( カシスプロジェクトはこの議論を不合理な結論に導きます。)
「リンターを使用し、リンターがそれを注文するため、これを行います。」 一貫性は重要であり、リンターはグループのコードの一貫性を実現する1つの方法です。 npm互換のリンターを作成するタスクは私のtodoリストにありますが、それほど高くありません。

セミコロンで行うべき最悪のこと

「ASIの信頼性が低いため、これらが必要です。」
これらのルールは、90年代後半のJSのd明期に遡ります。 それらは新しいものではありません。私の意見では、JSの専門家と呼ばれ、表現を終了するルールを理解していない人には許しはありません。 JSコミュニティのリーダーが理解ではなく、あいまいさを広め続けることは率直に無責任です。
さらに、AISがひそかに攻撃する典型的な場所は限られたルールです。 各行にセミコロンを追加しても、 return\nfooundefined以外をreturn\nfoo返すことはありundefined 問題は、 ラインフィード使用していることであり、セミコロンを挿入しいないことではありません
制限されたルールでエラーを永久に防ぐ唯一の方法は、常にセミコロンを使用し、改行を入れないことです。 誰もこれを提供しません。 したがって、それが重要であるかのように話すのをやめるか、ASIを理解する代わりに冗長なセミコロンを提案してください。 有能なJSプログラマーになるには、ASIを理解する必要があります。
そして、それは私たちにつながる...

私はすべて偏見を抱き、あなたを怒らせます(反対のことをしようとする高貴な試みにもかかわらず)

JSで式が終了する方法がわからない場合は、単にJSを正しく知らないので、監督なしでJSで専門的に書くべきではなく、 間違いなくそれを書く方法についてアドバイスすべきではありません。
私はあなたをin辱したと思います。 残念だ。 DOM、CSS、MSIEバグ、jQueryなど、JS について多くのことを知っていることを知っています。 おそらくクロージャー、プロトタイプ、スコープ、アクティベーションオブジェクトの研究に時間を費やし、V8またはSpiderMonkeyの拡張機能を作成したこともあるでしょう。 あなたは愚かではない、私は確信しています。 実際、あなたはおそらく私よりも賢く、おそらくあなたはより素晴らしく、見栄えが良いでしょう。 私たちには多くの共通点があり、友人になることができると確信しています。
しかし、JSでの表現が何であるかを理解しいない場合、おそらく言語の最も基本的な側面であるものを理解する上で、大きな穴があります。
これは正常です。 私はスペイン語をあまり上手に話せず、私のCは一般的に初心者レベルです。 そして、私はこれらのことの専門家とは呼んでいませんが、ほとんどの状況で抜け出すのに十分なことを知っています。 仕事に行く場合、スペイン語やC言語での会話が多いことを意味するので、深刻な間違いを避けるために誰かに気を配ってもらいたいです。
JSのほとんどのものと同様に、式の終了規則は適切に設計されていませんが 、理解して使用することはそれほど難しくありません 。 この理解には、少し時間と労力がかかります。
土曜日の夜には、ホットチョコレートとECMAScript仕様をお楽しみください。 練習してください。 テストプログラムで遊んでください。 これは良い娯楽です。
したくない場合は、これをしないでください。 これがあなたの人生です。 きっとあなたはより良いクラスを持っています。
「安全のためにすべての行をセミコロンで終了する」などの信頼できるステートメントの作成をやめるだけです。 これは安全でも安全でもありません。

補足1:リーダー

それでは、ミスター・アイアン・オン・アゲインスト・ウール、あなたが話しているこれらの「リーダー」は誰ですか? どうして名前をつけないの?

それらは非常に多くあり、私はそれらのすべてを知らないからです。
しばらくの間JSについて書いて、アドバイスをしたり、経験の少ない人をリードしたりする場合は、ご連絡します。 リーダーになることは責任です。 これを真剣に受け止めてください。 うそを広げないでください。 専門家になるか、そうでないことを認めてください。 しかし、免許証なしでこの車を運転しないでください。

補遺2:リテラシープログラミングの遵守

(翻訳者のメモ:文学的プログラミングが意図されています)
しかし、英語では句読点を最初ではなく最後に付けます。

JavaScriptは英語ではありません。 また、英語では、所持(またはオブジェクトと動詞の関係)をドットで示していません。 英語にはオブジェクトリテラルはありません。すべての文ではなく、段落の最初の行のみをインデントします。
これは馬鹿げた議論なので、彼に恋をするしかありません。
私はあなたをin辱し始めましたが、あなたは私の心、文学プログラミングの達人を獲得しました。 これからは、ラインフィードを関数の最後にのみ配置し、中央には配置せず、各関数の最初の行にインデントします。

補足3:ペダントリー

あなたは私のコードに何を入れますか? 画廊はちょうだい?

必要に応じてコードを記述します。 私には何の関係もありません。
人に嘘をつかないでください。 それが私が尋ねるすべてです。 これはほんの少しの礼儀です。 難しくありません。 嘘をつくのではなく真実を伝えてください-それが私が話していることです。

(翻訳者から:翻訳者として、翻訳と校正を手伝ってくれた愛する女性-哲学者に感謝します)

Source: https://habr.com/ru/post/J136860/


All Articles