スコープを示すために空白と{}を使用する言語の長所と短所は何ですか?[閉まっている]


16

空白を使用する方が良いのか、スコープを示すために括弧のようなトークンを使用する方が良いのかについて、矛盾があるようです。一貫性のないインデント問題に対する多くのpythonのソリューションを称賛しましたが、多くの意見が異なります:

トークンとして空白を含む言語は死ぬ必要があります。

同じ答えに後で投稿:

私は実際に試してみるまで、トークンとしての空白のようなものでした。おそらく、私の個人的な空白スペースのレイアウトが、python-landの誰もが使用しているものとほとんど一致するのを助けたでしょう。おそらく私は少しミニマリストなのかもしれませんが、とにかくインデントするつもりなら、なぜ{}に悩まされるのですか?

私はそれぞれの側にいくつかの明確な議論を見ることができます:

空白を使用:

  • コードの一貫性のないインデントを減らすのに役立ちます
  • 同じ目的を果たすために、目に見えるトークンを空白で置き換えることにより、画面をクリアします

トークンを使用:

  • コードをさまざまなレベルにカットアンドペーストするのがはるかに簡単です(インデントを修正する必要はありません)
  • より一貫性のある。一部のテキストエディタでは、空白が異なって表示されます。
  • 現在より人気があります。

見逃した点はありますか?どっちがいい?どちらかと長い間働いた後の知恵の言葉はありますか?


PS。言語が各制御構造に同じトークンを使用しない場合、それは嫌いです。VBは、そのと本当に迷惑ですEnd Ifし、End While他のほとんどの言語は、単にすべてのために{}のを使用し、ステートメント。しかし、それは別の質問のトピックかもしれません...


2
「カットアンドペーストがはるかに簡単」だとは言いません。少しだけ簡単です。
クーゲル

1
コードのブロックを小さく整理しておく限り、トークンは本当に重要ではありません...ちなみに、「聖戦」タグが大好きです、笑
Scott

「一部のテキストエディタでは、空白が異なって表示されます。」:?? 「現在、より人気があります。」:人気は多くの場合、アイデアの質とは関係ありません。
ジョルジオ

私は空白の構文が大好きで、CoffeeScriptとHaskellでのコーディングが大好きでした(確かに難しいことを知っています)。JavaScriptとCでコードをコーディングしましたが、}に戻ることはできません。しかし、Lispのs-expressionsがbox
divに

回答:


15

多くのプログラマー(私自身も含む)は、すべての決定を「論理化」する傾向があると思います。それは問題ありませんが、すべての質問に論理的な答えがあるわけではありません。たとえば、シェフがchefoverflow(そのようなものが存在する場合)に質問を投稿して、アップルパイとチェリーパイの長所と短所を尋ねることを疑います。それはあなたがよりよく好きな質問です。

それを念頭に置いて、最も簡単な答えは、「ブレースが好きな人、空白が好きな人」と言って、そのままにしておくことだと思います。



また、一部の人にとって長所である何かは、他の人にとっては短所になる可能性があります。
ラリーコールマン

素晴らしい点。個人的に私は彼らが一緒に働くと思います、そして、おかしなところが明確である限り、私は文句を言いません(多く)。
マイケルK

7
あなたのアナロジーに同意しません。空白に依存する構文がプログラマの生産性を妨げると信じるには、客観的な理由があります。それは、人々がシアン化物の味が嫌いだと言うのに少し似ています-それが有毒であると言うとき、誰もが単に「論理化」しています。いいえ、どれだけ愛しているかは関係ありません。
ティムウィ

4
PSあなたが実際に探している言葉は合理化です。また、プログラマーだけでなく、誰もが合理化する傾向があります。
ティムウィ

10

完全なファンボーイのように聞こえるリスクがあるため、ホワイトスペースは「コード内の一貫性のないインデントを減らすのに役立つ」と主張する人は誰もVisual Studioを使用したことがないと思います。単一のコマンド(デフォルトのショートカットはCtrl + K、Dだと思います)で、すべてのインデントが瞬時に一貫します¹。さらに、コードを貼り付けると、インデントは何もすることなく瞬時に修正されます。また、新しいコードを書くとき、ifまたは何か他のブロックに何かをラップするときも同じことが当てはまります(}入力中に再フォーマットが行われます)。さらに、完了したステートメントの後にEnterキーを押すと、カーソルが次のステートメントの正しいインデントレベルに常に置かれます。ifまたは同様のことで、ステートメントがまだifそうでない場合に誤って考えることを非常に困難にします。

私がやろうとしているの、Visual Studioが素晴らしいということではありません私がしようとしている点は、プログラムの意味がそのフォーマットに依存しない場合にのみ、IDEがインデント修正(およびその他のフォーマットの問題)を自動化できることです。これにより、プログラマは実際のプログラミングタスクに集中することができます。Pythonのような構文は逆効果です。インデント自体がセマンティクスの一部を指定するため、Pythonコードのインデントを「修正」できるIDEを作成することはできません。


¹ (VSが再フォーマットすることを拒否する特殊なケース、つまり複数行にわたる配列リテラルがあることは知っていますが、それは重要なことです。)


8
Pythonのインデントは(誰かに気付かれずに)壊れないため、修正する必要はありません。Purify(メモリリークの検出に役立つプログラム)をC#向けに記述することも不可能ですが、C ++メモリ管理が優れていることを意味するものではありません。
dbkk

2
@Dean:なぜそんなに多くの人が、すべてにResharperが必要だと思うのですか?あなたが説明するものは、ResharperなしのVisual Studioに既にあります。
ティムウィ

2
@dbkk:if行を追加するとすぐにインデントが壊れます。次に、インデントを手動で修正する必要があります。
ティムウィ

2
おそらく、インデントが怠zyで一貫性のないチームで働いたことはないでしょう。コードの差分が不可能になるため、それを修正することはお勧めできません。
ケビン

2
@ケビン:正しい、私はしていません、率直に言って、私はしたくないでしょう。私は一度にすべてを修正することを主張します。これは、意味のない空白にのみ影響を与え、将来のすべての差分を修正する読み取り不能な差分を1つだけ引き起こします。それ以外のものは、逆効果でプロジェクトに有害です。
ティムウィ

2

個人的には、コードが別のスコープ内にあることを気付かせるために、独自の行にトークンを持つことによって導入された空白行が必要であることがわかりました。

Pythonで人々が行くとき、私はそれを嫌います:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

トークンランドでは、人々がコピーアンドペーストしてインデントをクリーンアップしないと嫌いです

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

または、トークンに別の行を使用しないでください

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

私は3つすべてを読むことができますが、私は期待して、私はそれらを解析するために努力を費やす必要はありやとそうではありませんジョエルは言うあなたはそれはあなたがイライラになり期待のようなものが作業をしないでくださいとき。


2

プロ:私の知る限り、Pythonの世界にはインデント/中括弧配置の聖戦はありません。開発者に代わってこの決定を行うことにより、おそらく多少の苦痛が軽減されます。

欠点:匿名関数は1行に制限されています。サウンド[OK]を、私は頻繁に自分自身がマルチラインアップ書き込みを見つけるlambda(主に飼料にするスキームで秒mapapply、それは別に宣言する意味がありませんので、正確に一つの場所で)。


読む価値がある:誰もがすべての言語で
常に

Pythonでは複数行の式がサポートされています。行の最後に\を置くだけです。
dbkk

7
公平を期すため、複数行のラムダの欠如はPythonの制限であり、一般的な空白の制限ではありません。私の空白で区切られた言語では、ラムダを導入し、インデントされたブロックが続く場合、そのブロックはラムダ本体として使用されます。
自己への注意-

@注意-はい、はい、公平です。Pythonは、私が経験したことがある唯一の空白で区切られた言語です。@dbkkだから、構文エラーを返さlambda n: a = n \\na.sort() \\na[0:3] ないと言ってますか?`\`トリックを使用すると、単一行のラムダを複数の行に広げることができますが、実際には複数の行を取得することはできません。
イナイマティ

Haskell、CoffeeScriptは空白を使用しますが、単一行のラムダ制限はありません。
aoeu256

2

ホワイトスペース言語で見つかった問題は、複数ページの条件式にありました。ページ2の真ん中に行を追加し、すべての混乱の真ん中で1つのスペースで降りると、コードのロジックが大幅に変更される可能性があります。そして、たとえ誰かのコードが「正しい」としても、それを読み取ろうとすると、ひどい推測ゲームになります。この「else」はどの「if」ですか?見えない空白文字を数えるよりもはるかに簡単に中括弧を数えることができます。そして、このサイトの投稿機構は、それらを単一のスペースに破壊し続けます。

IMHO "{{{{{" is more reliable than "     ".

9
複数ページの条件式を使用すると、他の問題が発生します。しないでください。実際、中かっこがあっても、コードは読みにくくなります。これは、実際には空白インデントのもう1つの利点です。このような恐ろしいコードを書くことを防ぎます。
コンラッドルドルフ

1
真剣に、条件付きの複数ページの長さ?
ウィンストンイーバート

2

{}は冗長性を追加します。冗長性が多すぎると、少なすぎます。そして、手動で入力するのは悪いです、特に。使いにくい場合。

そのため、IDEが悪い/ない場合は、空白スタイルがわずかに改善される可能性があります。しかし、強力なIDEでは、ブレースが優れています。


1
あなたは冗長性について良い点を指摘しています。私はしばらくの間、コンパイラのパーサー回復について熟考してきました(コードのFix-Itsを発行するというClangの非常に興味深い試みに続きます)。ここで本当に役立つのは、冗長性があることです。したがって、完全な世界では素晴らしい冗長性はありませんが、実際のプログラミングでは実際に有害な冗長性はないと思います。通常、情報の冗長なソースが一致しない場合、タイプミス/ミスが行われた可能性があります。冗長性がないと、この潜在的なエラーは検出されません。そうは言っても、ブレースは好みません;)
Matthieu M.

「ノイズ」は、彼のHaskellのビデオで使用されている単語Erik Meijerでした。
user16764

ブロックを削除し、逆の操作を行ったときに}を削除したり、誤って{を削除したりした場合はどうなりますか?冗長性はDRY IMOに反します。
aoeu256

2

私はそれが本当に対であるとは思わない。
Pythoneersは、まるでインデントに容易に違反するかのように、ブレースプログラマを批判します。
実際、Pythonとそのインデントスコープについて知る前であっても、常に100%一貫したインデントを使用していました。

事実は、ブレース言語はコンパイラに正しいインデントを課すことができ、両方の長所を持っているということです。見る?無すべてで。

Pythoneersは、インデントが構文の一部である場合、ブレースは役に立たないと主張しますが、そうではありませんが、ブレースは読みやすさを向上させます。Pythonをプログラミングしてみましたが、私にとって非常に興味深い言語ですが、if-elif2つまたは3つ以上のインデントレベルのチェーンを試しましたか?彼らはもはやそれほどきれいに見えません。

PS:中括弧を書きましたが、より一般的な方法で、区切りトークンを意味します。開き括弧は冗長と見なすことができますが、言語は次のようになります(実際、このような言語は確かにありますが、私はそれらをよく知りません)。

if condition:
    statement
    other_statement()
end

PS2:2019、この回答の4年後。私はPythonを学び、セマンティックインデントに完全に慣れましたが、読むのは難しくありません。特に、インデントブロックの識別に役立つ垂直バーを描画する最新のIDEを使用します。


私はその構文が好きです。なぜならそれは良い妥協であり、中括弧を避けるからです。しかし、1行のステートメントではコストがかかります。たとえば、Cでは中かっこを完全に残すことができます。(
Jo So

入れ子になったif ... elの代わりに、辞書の使用を試みたり、入れ子になった関数を続けたり、戻したりできます...
aoeu256

@ aoeu256は完全に質問と私の答えのポイントではありません。
ペトルザ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.