なぜ両方ではない?
まず、「記述的」と「詳細」は同じではありません。たとえば、かなりローカルなループを記述している場合は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カラムで完全に読めないコードを書くことができないと言うことではありません:さまざまな難読化されたコードコンテストは、明確な反例です)。