構造化プログラミングの世界観です。
初心者がプログラミングについて思い浮かべると、FORTRANやCOBOLのように、GOTO文を使ってジャンプをするプログラム構造を思い浮かべるかもしれません。
ですが、近代的なプログラミングでは、できるだけGOTOを使いません。
なぜなら、GOTOを使いすぎると、保守性の低い、わけのわからないプログラムが生み出されるからです。
このようなスパゲッティプログラムにならないように、最近の構造化プログラミング言語では、GOTOではなく、順次実行、選択(条件分岐)、繰り返しの3つの基本構造を用いて、プログラミングを行います。
この三種類の構造を考えた人は、ダイクストラという人です。
CやPascalは、構造化プログラミング言語として知られます。if文やfor文やwhile文を用いて、GOTOを極力使わなくてもプログラミングができます。
また、GOTO同様に嫌われるのが、グローバル変数です。グローバル変数を使わず、クラスというまとまりに関数(メソッド)をまとめ、メソッドがオブジェクトという単位で同じデータにアクセスできるようにした言語を、オブジェクト指向言語と呼びます。
オブジェクト指向言語は、SmalltalkやC++やJavaなどが例として挙げられます。
詳しくは以下の書籍が参考になります。
プログラミングを行う上で有益なのは、「構造化プログラミングの方法で考える」ということです。
構造化プログラミングとは、順次実行、選択(条件分岐)、繰り返しの3つの基本構造を用いたプログラミング方法のことです。
モダンなプログラミングスタイルでは、GOTOによるジャンプをできるだけ使いません。ほとんどの場合、GOTOを使わなくても、if文やfor文を用いた、構造化プログラミングの方法で制御フローを書けます。
必要なのは、まず、データとロジックを組み合わせるか、あるいは分離させながら(データとロジックの分離は重要)、構造化プログラミングの方法でプログラムを書くことです。
C言語やそれと同じ記法を採用する多くの言語では、if文やfor文やwhile文などで、以下のような演算子を用いて条件式を記述する。
演算子 | 意味 |
---|---|
< | より小さい |
<= | 以下(より小さいか等しい) |
> | より大きい |
>= | 以上(より大きいか等しい) |
== | 等しい |
!= | 等しくない |
&& | かつ |
|| | または |
! | 否定 |
これらの記号は、比較演算子や論理演算子と呼ばれる。
if~else文の場合、条件式が真である場合と偽である場合に別の処理を実行する。
また、while文やdo-while文、あるいは拡張for文でないC言語方式のfor文の場合、条件式が真である場合にのみ次の繰り返しを実行し、条件式が偽になった場合に繰り返しを終了する。
注意点として、代入を意味する=と等しいかどうかを比較する==は区別される。==のつもりで=と書く場合は意図通りには動かない。
Pascalのような言語では、代入には:=を使う。
C言語では、==の代わりに=を書いた場合、代入した値が条件式の評価に使われるが、これはバグの元になるため、Javaなどの言語ではif文などの条件式にはboolean型の値しか記述できない。
また、PHPやJavaScriptなどの言語では==だけではなく===が用意されていることがある。
==は型をキャストさせて値を比較するが、===は型をキャストさせず厳密に比較する。
たとえばパスワードの比較などでは、0011と11が等しいと誤解釈されないように===を使うことが推奨される。
Pythonでは、&&の代わりにand、||の代わりにor、!の代わりにnotを使う。
プログラミングにおいて、繰り返し処理は重要です。
たとえば、ファイルを読み書きする処理、ファイルに一行ごとに変形をかける処理(数値への変換、分割、正規表現によるパターンマッチングなど)、コンソール画面に表示する処理、あるいはSQLデータベースサーバーから取得したデータを繰り返し取り出してHTMLに整形して出力する処理など、プログラミングでは多くの処理を繰り返し構造で行います。
あるいは、イベントループやブラウザゲームの戦闘場面など、制御についても繰り返しが使われることが多いです。
このような繰り返し処理と組み合わせて使われるのが、配列やハッシュです。配列はテキストのような単純な連続データを一行ごとに処理するために使います。データベースレコードやゲームのキャラクターのステータスの処理のように、複数のデータ要素をキーに値が対応する形でそれぞれ処理したい場合はハッシュを使います。
このように、配列と繰り返しは、プログラミングにおいて「肝」と言ってもいいでしょう。配列と繰り返しを制するものは、プログラミングを制するのです。
プログラミングでは、ひとつの処理をすべての要素に適用することが多いです。
たとえば、複数行のテキストファイルを操作する場合、一行の文字列が処理できれば十分です。なぜなら、その一行の操作を全部の行に適用すればいいからです。
あるいは、配列の全要素に処理をかけるならば、ひとつの要素が処理できれば十分です。なぜなら、そのひとつの要素の処理を全要素にかければいいからです。
これは、何も配列や繰り返しには限りません。プログラミングでは、基本的なロジックを作った上で、そのロジックをさまざまな場合に適用させることが多いのです。
たとえば、3DCGの表示処理を作ったとして、たとえば遠近法を使って遠くのものを小さく、近くのものを大きく表示するような処理があったとしたら、この基本ロジックを一度だけ作ってしまえば、どのような場合であっても、たとえば頂点とテクスチャが何十や何百とあるような複雑な処理であっても、ロジックを正しく記述したひとつの処理で対応できます。
そもそも、プログラミングを行うというのは、すべてそのような発想です。なので、FORTRANを使って画像解析を行う場合であっても、基本の解析処理を作ることができたら、どんなに複雑で高度になったとしても、その基本の解析ロジックを適用することができるのです。
実際には、このような処理には関数やクラスを使いますが、ロジックをすべての場合に適用する部分は配列や繰り返しを使い、その中でそれぞれの要素ごとに関数にかけるようなプログラムになるでしょう。
プログラミングを行う上で、コードを書く基本は、記憶と構造化プログラミングです。
変数への値の記憶、代入、参照、比較を行いながら、構造化プログラミングの手法である、順次実行、条件分岐、繰り返しを行うことで、どのようなアルゴリズムでも記述されます。
また、重要なのはOSやプラットフォームや言語に用意されている関数やクラスなどのAPIです。
記憶や構造化プログラミングの考え方と一緒に、OSやプラットフォームや言語に用意されている関数やAPI、特にprintf()のような入出力関数などを組み合わせることで、どのようなプログラムであっても開発できるのです。
プログラムを記述する上で必要なのは、「入力に対して必要な処理を行って出力を返す」ということであり、その中で特定の情報処理を行うために、構造化プログラミングの手法が使われるのです。
2023.05.12