全5670文字
PR

単にプログラミング言語の文法を知っているだけでは優れたプログラムは書けない。どうすればより良いコードが書けるのかを解説する。

 良いコードがどういうものか、というのはとても難しい問題です。様々な良さの観点があり、絶対的に良いと言えるようなコードがあるわけではありません。

 しかし、良いコードには少なくとも満たしている性質がいくつか知られています。その中の1つが、責務が整理されていることです。責務は、コード上における役割のようなものです。関心事と言われたりもします。

 責務を考えるために、例えば、買い物での税込みの合計金額の算出方法を考えてみましょう。簡単にするために、食品は消費税が8%、それ以外は10%にします。また、小数点以下の計算は今回気にしないでいいことにしましょう。

 ここで「100円のアンパンを2個、200円のペンを1本買ったら、税込みの合計はいくらか」という問題を考えてみます。これを安直に実装するとこうなります。

[画像のクリックで拡大表示]

 total_price関数を定義して、このコードで「100円のアンパンを2個、200円のペンを1本」を計算し、436円という値を算出しています。ですが、これは今回限りのコードになってしまっていますね。当然ですが、別の商品を買う度にtotal_price関数に修正が入ってしまいます。

 この実装は「税込み合計を計算する」と、「アンパン2個とペン1本の場合にその計算を行う」という2つの処理を、total_price関数に押し込めていると言えます。このため、商品が変われば、total_price関数に影響が出てしまいます。あるいは、total_price関数が具体値を知りすぎている、つまり抽象化が足りないとも言えます。

 ではtotal_price関数から、具体的な値を分離しましょう。ここで使えるのが引数ですね。具体的な値を知る代わりに、仮引数を使って計算を行うことができます。愚直に書くとこのような実装になるかと思います。

[画像のクリックで拡大表示]

 total_price関数が随分と書き換わりました。仮引数としてpricesitem_kindsを受け取っています。pricesが商品の価格のリストで、item_kindsが商品種別のリストです。これで新しい商品(例えば、カレーパン)が来たとしても、変化するのは引数の中身であって、関数を修正する必要がなくなりました。

 責務の観点で言うと、total_price関数が「税込み合計を計算する」という責務により集中できるようになったと言えます。