昨年末のある会合で、企業内システムの消費増税対応の話題になりました。聞けば、C言語で作成してあるそのプログラムは、消費税率を1.05とハードコーディングしてあるため、たとえば消費税率が8%になればそこを1.08にして再コンパイル、10%になれば1.10にして再コンパイル、ということになるそうです。
私としては怪談を聞いているような気持ちになり、一緒に笑っていられませんでしたが…。
ところで実用的な話として、消費税率がどのようになっても再コンパイルの必要がなく動くプログラムとはどのようなものでしょうか?
その前に、冒頭で書いたプログラムは、1.05を1.08に書き替えるだけでも大変です。1箇所ではなく数10箇所あるということでしたから、もれなく書き替えないと誤動作の原因になります。まずは書き替えなければならない箇所を1箇所にする工夫をしましょう。
経験豊かなプログラマの方なら、定数(マクロ)を使えばよいと看破するでしょう。C言語では、こんな感じで書けます。
#define TAX_RATIO 1.05
………
double sum = unit*price*TAX_RATIO;
計算誤差とか変数の型とかそういうことは気にしないで下さい。計算式上は、こんな感じで税込み価格を求められます。このように書いておけば、#defineの箇所を書き替えて再コンパイルすれば終わりです。
しかしこれですと税率が変わったら再コンパイルが必要で、プログラムがたくさんあったら大変です。そこで、消費税率を外部から与える方式を使います。コマンドラインオプションや初期設定ファイルと呼ばれるものです。
コマンドラインオプションで、こんな感じで消費税率を与えられるようにしておけば、プログラム起動時のオプションを変更するだけで消費増税に対応できます。
calc –tax_ratio=1.08
もちろん、プログラムの側ではこのオプションを解釈するようになっていなければなりません。この手間を惜しまなければ、長く使えるプログラムの誕生です。
初期設定ファイル、俗にiniファイルとか呼ばれますが、ここにこんなふうに書けるようにしておけば、iniファイルを書き替えてプログラムを再起動するだけで消費増税に対応できます。
TAX_RATIO=1.05
この場合も、iniファイルを読み込み、このような内容を解釈するようになっていなければなりません。この手間は面倒ですが、さらに長く使えるプログラムの誕生です。
現実的には、この両者を組み合わせているプログラムが普通になっていますね。
プログラムのデフォルト(1.05)
↓
設定ファイルでオーバーライド(1.08)
↓
オプションでオーバーライド(1.10)
さらにさらに!現在は消費税率は一律ですが、品目で変わるとなったらどうでしょうか?たとえば食料品は1.03、家電は1.05、宝飾品などは1.20なんてこともあり得ます。
そういった事態を考慮すれば、たとえば商品マスターを作るといった際に、品目ごとに税率のフィールドを作成しておくという手法が使えます。税率が変更になれば、マスターを書き替えればよいのでプログラム自体には手を入れないで済むわけです。
10年経っても動くプログラムというのは、実はいかに汎用性を高めておくか、ということになるのではないでしょうか?汎用性を高めるのは非常に面倒なのですが。あらゆる事態に対応できる法律の策定には時間がかかるのですが、いったん制定されれば長きにわたって運用できるようなイメージですね。
こういったことは技術だけでは解決できません。やはり、世の中に対する興味とか、コスト感覚とか、サービス精神、そういったものが必要だと思います。優秀なプログラマというのは、実はさほどコーディングスキルが高いわけでもなかったりします。
なんてことを、1.05が何10箇所もあるよ〜なんてことを聞きながら考えていたのでした。