Top Of Page レイアウトの目的 Pure-Block Begin-End 1行のレイアウト 制御構造 Bottom

ソースコード レイアウト

プログラミング スタイル。これはレイアウトよりもうすこし広い感じがします。
ソースコードのレイアウトに対して、名前付けや、ルーチンの分割のこだわりとか、そういったものまで含めて「プログラミングスタイル」と呼ぶにふさわしいものではないでしょうか。
いうまでもなく、この全編では「よいプログラミングスタイル」を目指している訳ですが、その中で今まで触れなかったこと、つまり視覚的なレイアウトについて、ここで分析してみます。

美しく整理され並べられたプログラムのソースコードを視覚的に楽しむというのは、プログラマにしかできない喜びです。
仕事に対して誇りを持っているプログラマの多くは、自分のソースコードの視覚的な構造をも洗練させます。
なんて綺麗なコードなんだ!
なんて読みやすいコードなんだ!
そんなふうに感動してもらえるような、芸術的なソースコードを書きたいものです。

なぜレイアウトにこだわるのか

いうまでもないことですが、念のため。
レイアウトに気を使う理由は、もちろんカッコイイからとか、あるいは単に芸術的だからというわけではありません。
プログラマは芸術家ではなく、現実的な実務家です。
それでもわざわざレイアウトに気を使うのは、 という目的があるからです。

ですから、視覚的なレイアウトは、プログラムの論理構造を体現していなければなりません。

Pure-Blockレイアウト

どう訳そうか非常に悩んだ挙げ句、訳さないことにしました(^^;
この Pure-Blockレイアウト というのは、Adaという言語のレイアウト様式です。(うまい対訳は見つかりませんでした。純粋ブロック、でもなにがなんだかわかりませんし…)
Ada自身が非常に注意深く設計された言語であることも手伝って、この Pure-Blockレイアウト は非常に隙が無く、直感的に判りやすいレイアウトといえます。
Visual Basicもこの様式ですね。
大まかにいうと、↓こんな感じです。
■■■■■■■■■■■■■■
	■■■■
	■■■■■■■■
■■■■■
実際にAdaのコードでは:
if PixelColor = RedColor then
	........
	......
	.......
end if;
こんな感じです。Cでこれを表現すると、
if (PixelColor == RedColor) {
	........
	......
	.......
}
こんな風になります。( { の位置に注目してください)

このレイアウトは見かけもいいし、一貫して適用できます。
変更もしやすいし、コードの構造を読みとる助けにもなります。
私は、第三者から指定を受けない限り、このレイアウトを適用してコードを書いています。

Begin-Endレイアウト

これも訳さないほうがいいですね(^^;
これはPascalに準じたレイアウトです。
■■■■■■■■■■■■■■■■■
	begin
	■■■■
	■■■■■■■■
	end
実際にPascalのコードでは:
if PixelColor = RedColor then
	begin;
	........
	......
	.......
	end;
こんな感じです。Cでこれを表現すると、
if (PixelColor == RedColor)
	{
	........
	......
	.......
	}
こんな風になります。( { と } の位置に注目してください)

このレイアウトも見かけがいいし、一貫して適用できます。
変更もしやすいし、コードの構造を読みとる助けにもなります。

ではどちらがいいのか

どちらがいいレイアウトスタイルか?
実は一大議論を巻き起こしたこともあるそうですが、これについては甲乙付けがたいようです。Hansen氏とYim氏という人が1987年に行った調査によれば、プログラムの理解度という点では大きな違いはないそうです。
好みに応じて、あるいはプロジェクトや社内の原則に応じて使うのがいいでしょう。
どちらがいいか、ではなくて、どちらかを一貫して使うことが重要です。あちこちレイアウトを混ぜると、コードは読みにくくなります。

1行のレイアウト

おおまかなレイアウト様式は Pure-Block や Begin-End を採用するとしまして、それぞれの行についてのレイアウトとしての留意点を分析します。
一行が80文字以内というのは、過去においては強制力がとても大きい制限でした。
しかし現在では、より大きな画面と、小さいフォント、レーザープリンタの用紙縦横切替モードなどのおかげで、80文字制限は以前ほどの強制力は無くなってきています。
80文字で2行に分割されているより、一行に90文字が収まっている方が、一般に読みやすいでしょうから、たまに80文字を越えてもいいのではないでしょうか。
いかに読みやすいか、ということを考えた長さであれば、現在では80文字制限はある程度無視してかまわないと思います。
ただ、やはり横にスクロールしないと見えないというのは読み難いですから、ほどほどの長さにしたほうがいいでしょう。

代入文をそろえるのは、よく行われるレイアウトです。
たとえば、

EmpName = InputName;
EmpSalary = InputSalary;
EmpBirthday = InpuBirthday;
BossTitle = Title;
BossDept = Department;
これを、
EmpName     = InputName;
EmpSalary   = InputSalary;
EmpBirthday = InpuBirthday;
BossTitle   = Title;
BossDept    = Department
こうしたり。でも、じつはこれでは片手落ちなんです。揃えるのは「関連する」もののみのほうが、よりすっきりします。
EmpName     = InputName;
EmpSalary   = InputSalary;
EmpBirthday = InpuBirthday;

BossTitle = Title;
BossDept  = Department
こうしたほうが、より関連が明確になると思うのですが、いかがでしょうか。

また、コンパイラの進歩により、言語によってはマルチステートメント、つまり一行に複数の文を置くことができるようになっています。
FortranやCOBOLの制限を考えると、ずいぶん進歩したものですね。
しかし、これは利用しない方がいい機能です。
マルチステートメントは「複雑さ」を曖昧にし、また上から下へコードを読むことを妨げます。
なるべくマルチステートメントは使用しないようにしましょう。

制御構造とレイアウト

Pure-Block や Begin-End 以外のレイアウトも沢山あります。もちろんそれらのレイアウトを理論的に選択し、そのレイアウトを一貫して適用しているプログラマもいます。それはそれで一理あると思いますので、ここから記述するのは、特に、私の考えであることをお断りしておきます。
で、論ずる前に、例を4つほど。

例1 - Pure-Block

while (PixelColor == RedColor) {
	........
	......
	.......
}

例2 - Begin-End

while (PixelColor == RedColor)
	{
	........
	......
	.......
	}

例3

while (PixelColor == RedColor)
   {
        ........
        ......
        .......
   }

例4

while (PixelColor == RedColor)
{
	........
	......
	.......
}

例1はPure-Block、例2はBegin-Endです。これらはいずれも優れたレイアウト様式だと思います。

では例3はどうでしょうか。非常に丁寧です。しかしこのレイアウトで3レベルほどネストすると、煩雑で、却って見にくくなってしまうことがあります。また入力も手間ですので、私はこのレイアウトをオススメしません。

例4はどうでしょうか。このレイアウトは、Microsoftのサンプルコードなどを見ても多く見かけます。しかしこのレイアウトでは、下のブロックが、whileの支配下にあるという表現が、十分ではありません。
たとえば

while (PixelColor == RedColor) PixelColor++; /* このwhileは1行だけ! */
{
	........
	......
	.......
}
この場合、whileと{ }ブロックは同レベルのものとなりますが、{ } のレベルは同じですよね。
そういうことから、このレイアウトもオススメしません。

このレイアウトに関する議論は、個人の好みや主張などがいろいろあり、なかなか「これが最高だ」ということにはなりません。レイアウトに関する考察の一つとして、考えにいれておいていただければ幸いです。


はじめに ルーチン モジュール 変数名の力 変数使用法 制御構造 レイアウト コメント テスト デバッグ 謝辞 Top of Site

Copyright (c) 2000 Takao Tamura