構造化プログラミングとは、「渡世の仁義はちゃんと守ろう」というプログラミングスタイルのことである。
簡単な概要
ひとつの呼び出しの中にだらだらと長く書かないで、適切な繰り返し処理、関数/メソッド/サブルーチン定義・呼び出し……など、しっかり構造・ルールを作って書きましょうと言うことである。
概要
男たちが真に男であった頃
少し昔々の話になるが、なにせJavaどころかC言語すら影も形もない時代のことなのでちょっと我慢して聞いて欲しい。
プログラムというものがCPUの上で動いていることはみなさんご存知だと思うが、その世界の命令分岐はいわゆる高級言語のそれとは様相が異なっている。分岐は基本的に曲がるか曲がらないかのどちらかであり、また行った後に返ってくるという考え方がない。サブルーチンが呼び出した後にちゃんと戻ってくるのは、ジャンプ先に対して「終わったらここへ行け(戻れ)」という行き先をあらかじめ渡し、またジャンプ先には渡された行き先へのジャンプを仕込んでおくことでそれっぽく動かしているに過ぎないのである。for?while?なにそれおいしいの?
また変数のスコープという考え方もない。メモリ空間のどこに何の情報を記憶するかは、プログラマが事前に約束事として決めなければならず、どの処理がどこに何を格納しようとプログラムとしては自由だ。古き良きベーシッカーであれば、一度ぐらい変数表を書いたことがあるだろう。
このような野放図な世界観であるから、CPU上のニーモニックやその世界が透けて見える言語ではいかようにでも変態的なコーディングができる。サブルーチンの途中にいきなりエントリーしたり脱出したり、データ領域を自由に書き換えたり、カオスプログラム書き放題の修羅の国である。
・・・いやいや、そんなことをやったらバグだらけだろ。もうちょっと人の心を持ったプログラムを書こうよ!というわけで、誰もがついていける、読める、正気のルールを定めようとしたのが構造化プログラミングと呼ばれるものの正体なのである。
では、具体的にどのようなことが議論されたのか
まず基本となるのは分岐の体系化だ。普通の分岐構造(if)が必要なのはいうまでもないが、それだけではバックができないので後ろ向きジャンプを持ったループ構造(whileおよびforなどの変種)もいる。そして、横入りをされると迷惑だから、これ以外は順番にワンステップずつプログラムを実行するものとする(シーケンス)。これらがプログラムを構成する三つの基本構造である。
また行って返ってくる構造としてサブルーチン(関数、メソッド)も必要だろう。プログラムとは一つの巨大なルーチンであり、ルーチンはより細分化したサブルーチンを基本構造で組み立てることによって作られる。
変数にも制約は必要だ。それぞれのサブルーチンがその内部で使用する変数によって干渉し合ってはたまらないので、それぞれのサブルーチンは独立で動くようにしておきたい。いわゆるローカル変数の考え方である。
そしてどこにでも飛べるgoto文は基本的に排除される。ここら辺は論者によって色々なのだが、「使う必要のない箇所で使わない」と言う点ではどの陣営も見解が一致するところである。
こうした考えを徹底すれば、プログラムはより堅固で安定した構造物として構築可能となるであろう・・・。
で、実際のところどうなの?
結論から言えば、構造化プログラミングは成功半分、失敗半分というところであろうか。構造化プログラミングのコンセプトは基本的に正しく、現代プログラミング言語でその影響下にないものは皆無である。ただ、純粋に構造化だけを使えば物事が解決したかというとそうでもなかった。
例えば現実世界におけるデータの複雑さである。構造化プログラミングではプログラムフローは構造化できたが、データ間の関係については構造化されていないため、こちらは相変わらず野放図な世界が残ったままだったのである。
また構造化プログラミングの基本構造(分岐、ループ、シーケンス)を使えば、確かに大抵のプログラムを見通しよく記述できるが、場合によってもう少し制約を緩めた方がよい場合がある。よく議論のネタとなるのはループ中の途中脱出(break)や、例外による大域ジャンプぐらいはあった方がいいのではないか?というもの。さすがに途中へのエントリーがいわれることはあまりないが、それでもコルーチンを使った中途再開などはここぞという時に便利である。
このように、構造化プログラミングの考え方は大体において正しいのであるが、絶対のカノンとして受け入れるには少々粗のある体系というのが世間的な受け止め方である。とはいえ、現代においてもちゃんとしたプログラムを書く上で構造化プログラミングの考え方は侮れないものがある。特に「サブルーチンをきれいに割っていく」という考え方が息をするようにできるかどうかは、プログラミング初級者と中級者を分ける境界線といってよく、その目の付け所の正しさが現れていると言っていいだろう。
構造化は死んだ過去のコンセプトではない。今や当たり前になりすぎて誰も存在を意識しないだけなのである。
関連項目
- 2
- 0pt