web-dev-qa-db-ja.com

空白の末尾が重要なのはなぜですか?

末尾の空白はプログラマにとって十分な問題であり、Emacsなどのエディタにはそれを強調表示したり自動的に削除したりする特別な機能があり、多くのコーディング標準ではすべてのインスタンスを削除する必要があります。理由はよくわかりませんが。不要な空白を回避する1つの実用的な理由を考えることができます。それは、人々がそれを回避することに注意を払わないと、コミットの間に変更される可能性があり、誰かが削除またはスペースを追加しました。

これは既に回避するのに十分な理由のように思えますが、それ以上のものがあるかどうかを確認したいと思います。では、なぜ空白の末尾がそれほど重要なのでしょうか。

120
EpsilonVector

私にとって重要である理由:

  • 「End」キーを押すと、カーソルが行の終わりに移動することを期待し(使用しているエディターとその構成方法によって異なります)、すぐに入力を開始できると期待しています。カーソルがそこに到達し、3文字または4文字を削除する必要がある場合、それは厄介です。特に、ファイル全体で一貫性がない場合。

  • 複数行にまたがる文字列リテラルがある場合、末尾の空白を使用すると、出力文字列を使用すると正しく表示されないことがあります。

厳密にプログラミングしているわけではありませんが、解析されて別の入力として使用されるファイルの末尾または先頭に空白があると、空白がデータエントリを著しく混乱させる可能性があります。これは、生成されたクリーンな入力ファイルが誰かがExcelなどで編集することによって汚され、その後に続く空白(およびその他のフォーマットの問題)が侵入する可能性がある場合に最も発生します。

末尾の空白は本当に嫌いですが、正確な理由は少しあいまいです。

その気持ちの起源はプログラミングではなく、デスクトップパブリッシングの分野にあると思います。出版物にタイプセットする必要がある他の人が入力したドキュメントを受け取ったことがありますか?最近のすべての出版物では、特に列を使用する場合、各文の改行を開始するのではなく、1つの段落内で文が順番に続くようにするのが習慣です。まあ、後続の空白がある場合、それを正しくするために多くの労力が必要です(多くの検索および置換アクションで二重スペースを削除するなど...)。

他の理由(プログラミング上)、正当な理由ではないことは知っていますが、彼らは私の潜在意識の精神を非常に悪化させ、それを排除するように強要します:

  • 必要以上の保管スペースが必要
  • パーサーは、コンパイル時に正当な理由なく余分な文字をスキップする必要があります
  • 一部のエディターは、WordWrapがオンで、末尾のスペースが合わない場合、余分な空白行を追加する場合があります。

はい、そうです!私は知っています、これらはジャンクの理由です。私は完璧主義者ではありませんが...たぶん私はそうですか?

私が考えることができる最後の理由は、一貫性のないカーソルの動きです。カーソルが線の終わりの薄い空気にぶら下がっているように感じます、右へのすべてのステップがドロップするか、未知の範囲でさらにホバリングする可能性があります。マリオはジャンプするのが常でした)。

おそらく私は、トレイルスペース恐怖症と診断できますか?

29
Louis Somers

これらの答えの多くほぼそれが私にとって悪い理由に触れますが、基本的に:テキストエディタを「壊す」。私の経験はvimです。

Vimは、一般的なアクションが文字に明確にマッピングされるように設計されているため、どの文字やキーの組み合わせを押すかについて考える必要さえありません。さまざまなホットキーを使用すると、カーソルがテキスト内をすばやく移動できるため、キーを数回押すだけでテキストを目的の場所に移動できます。コードのブロックの折りたたみのようなものでも高速です。ENDまたは$を押して、カーソルが{または}または(または)または何かと重なる行の終わりにジャンプできるため、思考の流れを壊す必要はありません。画面にアイデアを表示します。

しかし、その後にいくつかの空白が続き、カーソルの動きは予測できなくなります。目に見えないものがカーソルの移動先に影響を与えているため、タイピングプロセスが中断されているため、カーソルを本来あるべき場所に送信するには、一連の考えを壊す必要があります。

彼らが本当に仕事に集中していて、誰かが彼らを邪魔しているとき、いらいらさせる人々がどのように得るかに気づいたことがありますか?ええ、それが最も期待されていないときに末尾の空白を見つけることは正確にのようです。

補足として、末尾の空白を気にしない人は、ナビゲーションにマウスを使用する人であり、そのためにタイピストが遅くなる傾向があることにも気づきました...

22
Izkata

驚くべきことに、最も明白な答えはありません。末尾の空白は、バグを見つけるのが難しい場合があり、またそうなるでしょう。

最も明白な状況は、複数行の文字列です。 Python、JavaScript、およびBashは、これによって影響を受ける可能性がある言語のいくつかの例です。

print("Hello\·
····World")

生成する:

  File "demo.py", line 1
    print("Hello\
                 ^
SyntaxError: EOL while scanning string literal

エディタが空白文字を表示するように構成されていない場合、これはどういうわけか不可解で解決が困難です。

構文の強調表示が役立ちます このような場合を回避しますが、行末に空白を入れないようにすることで、最初から問題が発生しないようにするのがさらに簡単です。これが、一部のスタイルチェッカーが末尾の空白に遭遇したときに警告を発し、一部のエディターがそれらを自動的にトリミングする理由です。

enter image description here

イラスト:構文の強調表示は、バグにつながる可能性がある状況で末尾の空白を回避するのに役立ちますが、それだけに依存しないでください。

前の回答 で簡単に述べた別のコンテキストは、ファイルに保存されたデータです。

たとえば、末尾の空白を含むCSVファイルは、データの不整合を引き起こす可能性があり、これも検出が非常に困難です。標準に準拠したパーサーは空白をトリミングします(標準は、二重引用符で区切られていない限り、先頭または末尾の空白は無関係であることを示しています)。一部のパーサーは、正しく動作せず、空白を値の一部として保持する場合があります。

他のカスタム形式では、空白が値の一部であると明確に考慮される場合があり、一貫性はありますが、状況のデバッグは依然として困難です。

17

最近、1日を費やして、データの予期しない末尾の空白であることが判明したバグを探しました。

14
ddyer

プログラムのソースコードを選択してコピーして貼り付ける(または削除する)と、行の終わりに不規則な余分な空白がすべて表示されるのが少し面倒です。選択しているときにコードを読み取る必要があるためです。 、末尾の空白は不要なノイズです。例(ドットは空白を表します):

if (fp)........
{....
    fclose(fp);.
}
else
{.....
    prinft("File is NULL\n");
}..

この例は人工的なものですが、このようなコードをたくさん見ました。

8
Giorgio

特定の場合に解析が失敗するという明らかな問題に加えて?別の投稿者が指摘しているように、エラーを追跡するのは微妙で困難な場合があります。空白は必ずしも重要ではありません。場合によっては、末尾の空白によってコード行またはデータの意味が大幅に変わることがあります。

ほとんどの場合、空白は人間の読者のためにコードをフォーマットするためにあります。末尾の空白は、次のようないくつかのことを示します。

  • 不完全なステートメント。
  • コメントがありません。
  • 誤った編集;または
  • ずさんな編集。

これらのうちの2つは誤った機能をもたらす可能性があり、もう1つはコードを理解することをより困難にする可能性があります。

7
BillThor

最終行の空白に敏感なプログラミング言語があります。たとえば、行の終わりに空白があると、TCLスクリプトはエラーになります。

4
user81965