日本語でプログラミング!「なでしこ」♯5

お正月休みに実家に帰ってまいりました。
帰省したら毎回思うこと→ "実家帰ったらやることがない"

こんにちは。久しぶりのなでしこ回です。
今回はなでしこよりも、「プログラミングの書き方に正解はないよ」ということをご紹介します。

プログラムのいろんな書き方

早速ですが、次の 3 つのコードをご覧ください。
やっているのは、1 から 10 までの整数の和を計算して表示することです。

ソースコード1

自然数和に0を代入。
カウンタに0を代入。

▲足し算
カウンタはカウンタ+1。
自然数和は自然数和+カウンタ。

もしカウンタ<10ならば
 「足し算」へ飛ぶ

「1から10までの合計は{自然数和}です。」を表示。

ソースコード2

#定義
■階乗計算機とは
 ・自然数
 ・階乗表示する~
   自然数和に0を代入。
   カウンタで1から自然数まで繰り返す。
    自然数和にカウンタを足して自然数和に代入。
   「1から{自然数}までの合計は{自然数和}です。」を表示。

#利用
計算機とは階乗計算機
計算機の自然数は10
計算機が階乗表示する。

ソースコード3

#定義
●階乗(自然数の)
 自然数で条件分岐
  0ならば1で戻る
  1ならば1で戻る
  違えば自然数+((自然数-1)の階乗)で戻る

#利用
「1から10までの合計は{10の階乗}です。」を表示。

という訳でここで知っていただきたかったことは、答え (ソースコードの書き方) は 1 つではないということです。

で、どれが良いの?

3 通り (ちなみに他の書き方もできる) の書き方ができて、それぞれ同じ結果を得られることは先ほど紹介しました。

皆さんが気になるのは、どの書き方がベストなの?ってことだと思います。

ずばり、適材適所な書き方がある というのが結論です。

詳しい解説は後ほど行いますが、それぞれの書き方には "読みやすさ", "コードの文字数の少なさ", "流用のしやすさ", "バグの生み出しにくさ" などいろんな点でメリット・デメリットがあるので、自分が今作ろうとしているプログラムに合わせて、ベストだと思うものを選択できます。

例えばレストランを予約するとき、「電話予約」「ネット予約」があるとします。
確実にすぐに予約するなら「電話予約」を選ぶかもしれませんし、お店の営業時間外に予約したかったり後から予約内容を確認したいなら「ネット予約」を選ぶかもしれません。

このようにどの書き方で進めるかを自分で選ぶことができるのも、プログラミングをするときの楽しさの 1 つですね (^^)

代表的なプログラミングの書き方

さてここからは、プログラミング初学者の方向けに少し用語のご紹介です。

ここで紹介した 3 つのソースコードは、それぞれ別のプログラミングパラダイムに則って書いてあります。

プログラミングパラダイムとは言葉の通り、プログラムを設計したりコードを書いたりするときのパラダイムで、先ほど紹介した 3 つのソースコードのパラダイムは次の通りです。

非構造化プログラミング

ソースコード1は、非構造化プログラミングの書き方で書いています。

特徴は、「飛ぶ」(英語だと "GOTO") によって、ソースコードのいろんな場所に飛ぶことができることで、これによって自由度が高く、高速で動作するプログラムを書くことができます。

ただしソースコード全体を読まなければ理解が難しく、改造もしにくいというデメリットもあります。

オブジェクト指向プログラミング

ソースコード2はオブジェクト指向プログラミングです。

ミニチュアやジオラマを作るがごとく、現実世界をソースコードで表現しています。
特徴としては、これまでは自由に見たり触ったりできたパラメーターを隠ぺいして不用意に触れないようにしたり、具体的なものごとを抽象化して再利用できることなどがあります。

これによって読みやすく、再利用しやすいプログラムを書くことができます。

例えばソースコード1で、1 から 50 までの整数の合計を表示したければ

自然数和に0を代入。
カウンタに0を代入。

▲足し算
カウンタはカウンタ+1。
自然数和は自然数和+カウンタ。

もしカウンタ<50ならば
 「足し算」へ飛ぶ

「1から50までの合計は{自然数和}です。」を表示。

のようにほぼ同じコードを複数書く必要がありますが、オブジェクト指向であれば「#定義」の部分は 1 度書いてあれば使いまわせるので 2 回目使うときからは次の 2 行だけ書けば済みます。

計算機の自然数は50
計算機が階乗表示する。

関数型プログラミング

ソースコード3は関数型プログラミングです。

こちらは数学の関数のように、特定の入力を与えると特定の値を返す "関数" を組み合わせることでプログラミングするやり方です。

特徴として同じ関数であれば、何度同じ入力をしても必ず同じ出力が得られ、思わぬバグを生みにくく動作確認もしやすいというメリットがあります。

例えばオブジェクト指向プログラミングの「計算機」は、使うごとに自然数をセットしています。
サンプルのプログラムは行数が少ないのですぐに把握できますが、プログラムが大きくなると今の「計算機」の自然数がいくつなのかを常に意識する必要があり、間違うと思わぬ結果が返ってきます。

例えば次のソースコードでは、同じ「計算機が階乗表示する。」を実行しても 1 回目は 55 が表示され、 2 回目は 1275 が表示されます。

計算機の自然数は10
計算機が階乗表示する。

計算機の自然数は50
計算機が階乗表示する。

関数型プログラミングでは関数を呼び出すときに値を渡して、すぐに結果の合計値が返ってくるので今の状態を意識する必要がありません。例えば 50 までの合計を関数型で表示させると

「1から50までの合計は{50の階乗}です。」を表示。

となり、オブジェクト指向で考慮していた「計算機」の自然数を考慮しなくてもよくなりました。

最後に

IT 業界の常識はめまぐるしくどんどんと変わっていっていますが、これは言い換えるとどんどんと楽なやり方や便利なものが生まれてきているとも言えると思います。

新しい便利なものが大好きな方、ぜひ IT 業界で一緒に活躍してみませんか?