プログラミングの学び方(3) – 処理フローの組み立て方
前々回、前回と、プログラムの概要についてお伝えしているわけだが、プログラミングの学習に当たって、経験上個人的に一番重要だと思う点をお伝えしたい。
プログラミングを学ぶ前に、まず処理フローを知るべし
どういうことか?というと、プログラミングの基本中の基本は、アルゴリズム。もっとざっくばらんに言えば、処理フローである。
当然のことながら、プログラムを書く以上、実行してほしい処理が存在する。具体的に言えば、
- もしAが0なら、Bを実行してほしい
- Cを3回繰り返したら、データベースにDを保存してほしい
- 軽減税率計算をしてほしい(特定の品目だけ、違う消費税を適用してほしい)
といった、さまざまなケースが存在する。一見プログラムを書くという作業は、非常に高度な知的作業が必要だと思いがちだが、実際はその逆であるということを説明していきたい。
処理を究極まで単純化する
実際にプログラムを書いてみると、極論、処理フローの種類は2種類しかない。
それは、
- 繰り返し(for …, while, do – loop)
- 条件分岐(if, switch)
である。これらの処理をプログラミングの専門用語では制御構文と呼ぶ。
それ以外にも例外(Exception)という概念があるが、ここでは割愛する。
一見複雑な業務フローでも、分解していくと最終的に行き着くのは、
- どのようなときにこの処理を行うか?
- その処理は繰り返されるのか?
という2点である。
たいていの言語も、原則この2つの処理フローをベースに処理を組み立てていく。
- Pythonの場合:http://www.tohoho-web.com/python/control.html
- Rubyの場合:https://www.javadrive.jp/ruby/
- C#の場合:http://libro.tuyano.com/index3?id=1230003
- PHPの場合:http://www.tohoho-web.com/php/control.html
- Javascriptの場合:http://alphasis.info/javascript/control-structures/
例えば、以下の処理をJavascriptで書いてみよう。
①いくつかの商品を購入した際のその注文合計金額を計算したい。
②商品には消費税が発生するが、商品の品目が食料品だけは8%、それ以外は10%で課税されるように計算してほしい。
③消費税は切り捨てで計算すること。
④商品をいくつ購入しても、必ず計算ができるようにしてほしい。
このような要求があった場合、プログラムを書くと以下のようになる。
function calcTax(item) { var total = 0; for(var i in item) { var itemPriceWithTax; if (item.taxType == 'food') { itemPriceWithTax = Math.floor(item.price * 1.08); }else{ itemPriceWithTax = Math.floor(item.price * 1.10); } total = total + itemPriceWithTax; } return total; }
今回は単純なフローであるが、かなり複雑な処理フローも、1つ1つ分解していけば、
最終的には繰り返しと条件分岐によって成り立つ処理に分解することができる。
まずは、処理を分解することから始める
処理を分解・整理せずにソースコードを書き始めてしまうと、結果として生み出されたソースコードもまた、分解・処理ができていないきわめて煩雑なソースコードになってしまう。そのようなソースコードは当然保守性は低下するし、拡張した場合に様々な弊害を生み出してしまう。
個人的な反省から、これからプログラムを書く人には同じ轍を踏んでほしくないと思い、この記事を書いた。
これからプログラムを書く人は、自分が実現したい処理が何なのか?をまず分解し、1つ1つソースコードを組み立てていくと、自分にとっても第三者にとっても分かりやすいソースコードになると思う。