
もちろん、各プログラマーにはフォーマットに関する独自の好みがありますが、プログラムを読み、理解し、保守しやすくするための一般的な原則がいくつかあります。
主なトリックは、プログラムを常に
-w
フラグを指定して実行することです。 必要に応じて、
no warnings
または
$^W
変数を使用して、コードの特定のセクションに対してこのアクションを意図的に無効にすることができます。 また、
use strict
を
use strict
常にプログラムを実行するか、これを行わない理由を明確に理解する必要があります。
use sigtrap
および
use diagnostics
use sigtrap
も役立ちます。
コード設計の美学に関しては、Larryが真剣に関心を持っているのは、複数行ブロックの閉じブレースを、構築全体を開始するキーワードと垂直に揃える必要があるということだけです。 さらに、彼はそれほど深刻ではない他の好みを持っています:
- 4列でインデントします。
- 可能であれば、キーワードと同じ行にある開き中括弧。
- 複数行ブロック内の開き括弧の前のスペース。
- ブレースを含む単一行ブロックを1行に配置できます。
- セミコロンの前にスペースはありません。
- セミコロンは、「短い」単一行ブロックでは省略されます。
- ほとんどのオペレーターの周りのスペース。
- 「複雑な」構造の周囲のスペース(ブレース内)。
- 異なるタスクを実行するコードの間にある空の行。
- 非粘着性の
else
。
- 関数の名前と開き括弧の間にスペースはありません。
- 各コンマの後にスペース。
- ステートメントの後に長い行が改行されます(
and
およびor
を除く)。
- 最後の閉じ括弧の後、行にはスペースが含まれている必要があります。
- 同様の要素を垂直に揃えます。
- 明瞭さが損なわれない場合は、過度の句読点を省略します。
ラリーにはこれらすべての理由がありますが、誰もが同じように推論しているとは主張していません。
考慮すべきその他の、より重要な設計上の問題をいくつか次に示します。
- 特定の方法で何かを行うことができる場合、それを行う必要があるという意味ではありません。 Pearlは、同じことを行うためのいくつかの方法を提供するように設計されており、これらの方法からより視覚的に選択しようとします。 たとえば、これ:
open(FOO,$foo) || die "Can't open $foo: $!";
これよりも良い:
die "Can't open $foo: $!" unless open(FOO,$foo);
2番目のオプションは、条件でこの式の主な意味を隠すためです。 一方、
print "Starting analysis\n" if $verbose;
より良い
$verbose && print "Starting analysis\n";
ここでのポイントは、ユーザーが-v
入力したかどうかではないからです。
同様に、演算子にデフォルト値の引数がある場合、これを使用する必要があるという意味ではありません。 デフォルト値は、ワンタイムプログラムを記述するレイジーシステムプログラマ向けです。 プログラムを読みやすくしたい場合は、引数の使用を検討してください。
繰り返しますが、多くの場所で括弧を省略できるという事実は、これを行う必要があるという意味ではありません。 比較する:
return print reverse sort num values %array; return print(reverse(sort num (values(%array))));
疑わしい場合は、括弧を付けてください。 少なくともこれにより、一部の貧しい人がvi
%
キーを突くことができます。
疑いがないとしても、あなたの後にコードを維持し、ブラケットを間違った場所に置く人の精神的なバランスを考えてください。
- Pearlは、途中で終了できる
last
ステートメントを提供しているため、サイクルを上から下へ無意味なサイクルにしないでください。 これをより明確に示すために、少し「インデント」するだけです。
LINE: for (;;) { statements; last LINE if $foo; next LINE if /^#/; statements; }
- ループラベルを使用することを恐れないでください-それらは、マルチレベルループを中断するためだけでなく、利便性のためにあります。 前の例を参照してください。
- 空のコンテキストで
grep()
、map()
または `backticks 'を使用することは、それらが返す値を単に捨てる場合には使用しないでください。 これらの関数はすべて値を返すため、使用します。foreach()
またはsystem()
関数を使用してください。
- 移植性のために、一部のマシンに実装されていない可能性のある機能を使用する場合は、evalでこれらの構造をテストして、発生するエラーを確認してください。 必要な機能が実装されているバージョンまたはパッチがわかっている場合は、
$]
(English
モジュールの$PERL_VERSION
)が存在するかどうかを確認してください。Config
モジュールでは、Pearlのインストール時にConfigure
によって決定された値を見つけることもできます。
- キャッチーな識別子を選択してください。 リマインダーの意味を思い出せない場合は、問題があります。
-
$gotit
ような短い識別子が$gotit
受け入れられる場合、長い識別子はアンダースコアを使用して単語を分離する必要があります。 通常、$VarNamesLikeThis
よりも$var_names_like_this
を読む方がはるかに簡単$VarNamesLikeThis
(特に英語が母国語ではない人にとって)。
パッケージ名には、この規則に対するいくつかの例外があります。 Pearlは、integer
やstrict
などのプラグマの小文字でモジュール名を非公式に予約しています。 他のモジュールは大文字で始まり、可能であればアンダースコアなしで大文字と小文字を混ぜて使用する必要があります。これは、モジュールを表すファイルの名前が数バイトに収まらないプリミティブファイルシステムの制限によるものです。
- レジスタを使用してスコープを示したり、変数を割り当てると便利な場合があります。 例:
$ALL_CAPS_HERE ( ) $Some_Caps_Here $no_caps_here ,
関数名とメソッド名は、小文字で最適に機能するようです。 たとえば、$obj->as_string()
。
先頭のアンダースコアを使用して、この変数または関数が宣言されているパッケージの外部で使用されるべきではないことを示すことができます。
- 本当に派手な正規表現がある場合は、
/x
修飾子を使用し、スペースを追加して、表現がそれほど怖くないようにします。 正規表現自体にスラッシュまたはバックスラッシュが含まれる場合、区切り文字としてスラッシュを使用しないでください。
- 新しい
and
およびor
演算子を使用して、リスト演算子の角括弧を&&
、&&
や||
などの句読点演算子を使用して読み取りを複雑にしないようにします。 。 ルーチンを関数またはリスト演算子のように呼び出して、余分な角かっこやアンパサンドを取り除きます。
- もう一度
print()
を書く代わりに、こちらのドキュメントを使用してください。
- 特に1行に収まらないほど長すぎるデザインでは、同様の要素を垂直方向に揃えます。
$IDX = $ST_MTIME; $IDX = $ST_ATIME if $opt_u; $IDX = $ST_CTIME if $opt_c; $IDX = $ST_SIZE if $opt_s; mkdir $tmpdir, 0700 or die "can't mkdir $tmpdir: $!"; chdir($tmpdir) or die "can't chdir $tmpdir: $!"; mkdir 'tmp', 0777 or die "can't mkdir $tmpdir/tmp: $!";
- システムコールのリターンコードを常に確認してください。 適切なエラーメッセージを
STDERR
に送信し、どのプログラムが問題を引き起こしたか、どのシステムコール、どの引数をエラーで実行したかの指示を含める必要があります。また、(非常に重要)何が間違っているかについての標準システムメッセージを含める必要がありますそうではありません。 以下は、シンプルだが包括的な例です。
opendir(D, $dir) or die "can't opendir $dir: $!";
- 意味がある場合は、ブロードキャスト文字を垂直に揃えます。
tr [abc] [xyz];
- 再利用について考えてください。 あなたが何度も何度も動作する何かをすることができるなら、なぜ一度の排気であなたの心の力を浪費しますか? コードを要約してみてください。 モジュールまたはクラスを記述してみてください。
use strict
とuse warnings
(または-w
)をuse strict
して、スクリプトをよりきれいに動作させてください。 コードを共有してみてください。 世界観を変えてみてください。 試してください...まあ、大丈夫。
- コードを文書化し、Pod形式を継続的に使用してみてください。 一般的な規則がいくつかあります。
-
C<>
を使用して、関数、変数、およびモジュール(および一般に、ファイル記述子や特別な値など、コードの一部と見なすことができるすべてのもの)に名前を付けます。 関数の名前は、function()
ように、名前の後に角かっこがあると読みやすくなることに注意してください。
-
cat
やgrep
などのコマンド名にはB<>
を使用します。
- ファイル名には
F<>
またはC<>
を使用します。F<>
はファイル名の唯一のPodコードである必要がありますが、ほとんどのPodコンバーターは斜体で表示します。そのため、スラッシュを含むUnixおよびWindowsのパスは読みにくい場合があり、C<>
使用が望ましいようです。
-
- 一貫してください。
- かっこいい。