記述的な命名と80文字の行[クローズ]


17

私はこれらの2つの価値あるプログラミング慣行を頻繁に耳にします。(1)コードの行は80文字以下である必要があり、(2)変数、メソッド、クラスなどにわかりやすい名前を使用します。 、彼らはしばしばお互いのトレードオフのようです。コードを80文字/行未満に保つと、よりわかりにくい名前を使用することになります(特に各インデントが4文字としてカウントされるPythonでは)が、より説明的な名前を使用すると、80文字を超える行になります。

だから、私の質問は、これらの2つのアドバイスのうち、どちらを選択する必要があるかを守ることがより重要ですか?私はこれを独立した(趣味の)プログラマーだと思っていますが、もっと重要なのは、大企業で働くソフトウェアエンジニアの観点からです。


4
大画面で@BillyONeal、120 :)
BЈовић

4
私は少なくとも130
9ダン

8
ノートブックで2つのファイルを簡単に並べて開くことができるため、80が好きです。
ホンザブラベック

5
80文字を超える行は読みにくくなる傾向があります。したがって、80が適切な制限です。記述は冗長である必要はありません。そして、それはスコープに依存します:小さなスコープの短い変数名、大きなスコープの長い名前。そして、必ずスコープの広い変数を避けてください。インデントが深すぎる場合、関数型言語を使用し、コードを小さな関数に分割する場合->非常に小さなスコープ== short varnames。関数名は似ていますが、スコープが大きいため通常は少し長くなります。
ピアストリッツィンガー

4
@ ott--:C ++構文に従って実際に長い行を分割し、最初よりも1レベル多くインデントされた継続を表示できるエディターを見ましたか?そうでなければ、そのような提案は無意味です。
Hudec

回答:


34

インデントを少なくし、名前をわかりやすくし、改行を恐れないでください。

インデントを少なくしてください。

多くの場合、インデントと記述的な命名法との間の闘争に身を置くと、一歩下がってインデントレベルを確認します。3レベルまたは4レベルよりもインデントしている場合(多くの場合、2レベルは自動で避けられません。読み取り:クラスメソッド定義)、コードを再構築し、機能をメソッドまたはメソッドに抽象化します。

わかりやすい名前

名前は常にわかりやすいものにしてください。わかりやすい名前は、自己文書化コードを作成します。場合によっては名前を短くすることもできますが、読みやすさが最初になります。

行を壊すことを恐れないでください

たわごとが起こる。80文字を超えていて、とにかく行のスペースを取り戻すことができない場合は、改行してください。ほとんどの言語は改行を気にしないので、行を複数に分割します。ランダムな場所を選ぶだけではありません。物事を論理的にグループ化し、行を分割するときに別のレベルをインデントします。


3
わかりやすい名前は長い名前と同じではないことに注意してください。コンテキストから簡単に見られるものの繰り返しを避け、いくつかの慎重に選択された略語(非常に一般的な概念のみ)は、短い説明的な名前に大いに役立ちます。
-Jan Hudec

18

なぜ両方ではない?

まず、「記述的」と「詳細」は同じではありません。たとえば、かなりローカルなループを記述している場合はi、ループ変数の非常に適切な変数名です。current_iteration_index、おそらくより記述的で間違いなく冗長iですが、ループ変数としての使用はほとんど普遍的に受け入れられており、それ以外の意味はないので、はるかに悪く、まったく情報を追加しませんi

適切な変数名は、言語のイディオムとコードベースの規則に精通しているプログラマーがその役割を簡単に推測できるという点で記述的ですが、物事をコンパクトに保つ​​のに十分簡潔です。

80文字の制限は、もともと1970年代のテキスト端末の技術的な制限の結果でしたが、今日でも多くの人に評価されています。技術的な理由(一部のネットワークプロトコル、特に電子メール関連の最大行長)より説得力のある理由は、心理的および社会的なものです。66文字のマークの周りの行の長さは、自然言語の散文で最も快適な読書体験を実現します(興味深いことに、フォントサイズは大きな違いを生まないため、画面サイズも用紙サイズも変わりません)。80文字の行制限はそれにほぼ近いですが、通常のコードの大部分は通常少なくとも1つまたは2つのレベルでインデントされます(つまり、インデント設定に応じて4〜16文字)。

80文字の行に固執するもう1つの効果は、状況が複雑すぎる場合の非常に良い指標であるということです。長い行は通常、次のいずれかが原因です。

  • 引数の長いリストを持つ関数。読みやすさを妨げ、微妙なバグを簡単に引き起こす可能性があるため、これは良いことではありません。たとえば、コンパイラーがキャッチしない方法で引数の順序を入れ替える場合です。
  • 条件式(例if ((user.isLoggedIn && user.hasPermission(page.getRequiredPermission()) && !user.isBanned) || page.getRequiredPermission() == null))によく見られる複雑な式。これも通常、解読がかなり難しく、コードをより構造化されたものに書き換える必要があります。最も可能性が高いのは、式が多すぎるため、メソッドまたは関数にファクタリングする必要があることです。
  • 関数呼び出しまたは式で使用される長いリテラルprint(translate(LANG_EN, LANG_ES, "This is the home page. Feel welcome to click around and see what we have."));。リテラルを変数または定数に移動します。それでも行の長さを超える可能性がありますが、一貫して行えば、読者はリテラルの残りだけが続くと仮定して、少なくとも安全に行の不可視部分を無視できます。または、さらに良いことに、リテラルをコードから外部データストア(ファイル、データベースなど)に移動します。
  • 深くネストされたステートメント。たとえばif、クラスメソッドの6レベルのステートメント(通常の設定では32列のインデント)。繰り返しますが、深いネストは複雑で読みにくいコードになります。ペストのように避けるべきです-簡単に言えば、深いネストは読み取り中に人間の脳のスタックをオーバーフローさせます。

これらはすべて、最終的には長期的にはコードベースにはないものの症状であり、80文字の制限を適用することは、複雑さを抑え、読みやすさを保つのに役立つ素晴らしく簡単な方法です。(それは、80カラムで完全に読めないコードを書くことができないと言うことではありません:さまざまな難読化されたコードコンテストは、明確な反例です)。


1
+1:リテラルをコードから移動することに同意しないことを除いて、すばらしい答えです。探しているリテラルがわかっている場合、リソースまたはコードで同じようにgrepを実行できますが、コードを操作しており、リテラルを変更する必要がある場合、別のファイルでそれを探し回るのはかなり気が散ります。また、すべての言語にはリテラルを複数の行に分割する何らかの方法があることに注意してください。これはそのような場合に行うことです。
-Jan Hudec

もちろん、長いリテラルの例として使用されている文には、ソースコードに住む場所がありません。このようなことはページテンプレートに行きます。しかし、エラーメッセージのようなものについては、それらを出力するコードで保持することを好みます。
-Jan Hudec

@JanHudec:確かに、リテラルをデータファイルに移動することは必ずしも意味がありません。私は非常に長いリテラルについて話していますが、それらについては、他の場所で定義するとコードが悪化することはめったにありません:テキストの長さは読むのを妨げるものですが、定数または変数名に凝縮し、それを別の場所で定義します。エラーメッセージは判断を促すものです。
tdammers

16

記述的な命名は、FARにより重要です。ほとんどのインターフェイスでは、スクロールして長い行を表示できます。どのような場合でも、システムは名前の不適切な変数と関数の翻訳を支援できません。


2
この。X文字の改行をやめ、IDEに処理させます。それ以外の場合、画面/ IDEが2 * X文字を1ページに収まらないコードで処理できる他のすべてのユーザー(将来のユーザーを含む)を煩わせます。
コネラック

4
質問は暗黙のうちに長い名前についてでした。そして、私は名前が長くなければならないことに同意しません–ほとんどの場合、彼らは短くあるべきです。記述的で長い名前は、記述的ではないが短い名前よりもコードを読みにくくする可能性があります!(通常、長すぎる行は読みにくい。)
コンラッドルドルフ

4
同意しません。コードが一度に表示されない場合、名前がどれほどわかりやすくても読みにくいです。
-Jan Hudec

4

長いコードの1行を複数の短いコードに分割する方法は多数あるため、名前が長くても、1行あたり80文字を満たすことは難しくありません。たとえば、Cの条件ステートメントを40行未満に収まるように複数行に分割できます。キャラクター、

if ( a == b || c == d  || d == e
    || c == e || c == a || c == k
    || c == l)

関数呼び出しの行を複数の行に分割することもできます。

したがって、記述的な命名規則と80文字の行の両方に矛盾はなく、読みやすさを向上させるために共存できます。


2
80文字は本当に読みやすさを改善しますか?最近120の画面で簡単にできないのはどの画面ですか?
ビリーONeal

7
@BillyONeal 120幅以上よりも80幅以上をスキャンする方が簡単
ラチェットフリーク

2
列に新聞ブレークは、あなたがUXからより多くの情報を持つことができますux.stackexchange.com/questions/3618/...
NEO

1
論理条件を分割すると、改行が条件の構造に対応する場合は読みやすくなりますが、それらが何らかの任意の制限にのみ対応する場合は必ずしもそうではありません。
ミコワク

1
@BillyONeal:ほとんどの画面で120を実行できますが、240を実行できる画面はほとんどありません。または、差分を比較することはありませんか?
ヒューバートカリオ

0

80制限は、ずっと前に引き上げられていたはずの値です。すべての識別子の長さがスクリーン/プリンターで8文字と1フォントのみに制限されていた時代から、この制限が使用されることに注意してください。フォントサイズを変更する可能性はありません。

神、私たちは今、異なるスクリーンと印刷技術を持っています。非常に異なるプログラミング言語があります。もう80文字を使用する理由はありません。少なくとも120文字に増やします。

それでも、それは厳しい制限ではありません。行を1文字越えますか?まあ、何も起こりません!

編集:

80文字の制限の履歴に関する詳細な回答

ウィキペディアの行ごとの文字

ウィチタ州立大学の研究では、CPLが速さと理解の要因を含め、読みやすさにわずかな影響しか及ぼさないことがわかりました。ただし、選好を求められた場合、回答者の60%が、研究で使用された最短(35 CPL)または最長(95 CPL)のいずれかの選好を示しました。同時に、回答者の100%が、これらの量のいずれかを最も望ましくないものとして選択しました。


4
いいえ、制限を絶対に増やすべきではありません。画面と印刷技術とはまったく関係がないため、1行あたり80文字が人間の目で快適にスキャンできるという事実だけがあります(66文字は最適な行幅と見なされ、複数列の印刷では少なくなります)。ちなみに、ほとんどの本はコードサンプル用に80列よりもかなり少ないことを意味します。
Hudec

3
@JanHudecそれは、スクリーン/印刷技術に関するすべてを備えています。Programmers.stackexchange.com/questions/148677/…を参照してください。80文字を使用するという決定は、研究に基づくものではなく、純粋に歴史的なものです。あなたの意見を確認するための研究へのリンクを追加してください。
スルタン

別の質問では、すでにこのUXリンクがコメントに含まれています。そこのさらなる参照。数字80自体は歴史的な偶然ですが、タイプライターでの1行あたりのストライクの数から大まかに導き出されました。
-Jan Hudec
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.