メンテナンスしているC++のソースに新しい機能を追加することになった。
####仕様の確認
実装を求められている仕様を確認することから始まる。
データの入力と出力と、何を実現したいのかという漠然とした期待から始まる。(それを内部でどのように実装すべきかは、開発者にゆだねられている。)そこで、それが実際にうまくいったときには、どのような結果になるのか、その結果をグラフで確認しやすい枠組みを使おう。
####プロトタイプしやすいライブラリと言語
次に、本番の実装と共通するライブラリ(あるいは、同等の機能を持つライブラリ)を、もっとプロトタイピングやテストのしやすい言語を使って、アルゴリズムの検討を行う。
従来MATLABで実現していた機能の多くは、Python統合環境Spyderなど(python + numpy + matplotlib)で容易に利用できます。PythonやC♯などは、C++よりはコーディングが楽な言語です。関数で実装すべきか、クラスで実装すべきかにおいても、事前に試してみることができます。その結果、使い勝手を確かめた設計を、C++で実装することになります。
以下は、spyder統合環境がMATLABに類似した操作性を実現していることを示す例です。
from pylab import *
x=linspace(0, 10, 500);
y=sin(x)
plot(x, y, '-')
####ターゲット言語での実装
そして、追加実装する機能だけをC++で実装します。まだ、統合先のソースとは別にしておきます。そしてC++で実装したものが、他の言語で実装したものと同様な結果が得られれば、追加実装する機能のコードは単体テストをしたような状況になります。(本当はきちんとテストを自動化しなくてはなりませんが)
####プロジェクトへの追加
最後は、追加実装した機能を、統合先のプロジェクトに追加する。
追加実装した機能を使う、使わないを簡便に切り替えられるようにしておく。
追記:
プロトタイピング時のコーディング指針
プロトタイピングを書くときは、記述の簡潔さを優先して書く。(実行速度やメモリの消費量については優先順位を減らす。)
for文よりは、リストの内包表記の方が記述が簡潔になる。
不要な変数をなくす。
一時的な変数を使わなくて済むようならば、一時的な変数を使わない。
意図している内容がわかる変数名にする。
新規のコンソールでプロトタイプの動作を確認する。
(コンソールでの再実行では、前回の変数が残っていて、それでエラーにならずに動作してしまうことがある。)
暗黙のglobal変数の使用をなくす。
思い込みというバグを埋め込まないように、プロトタイプを簡潔にわかりやすくする。
付記:
プロトタイピングに用いる言語の例としては、Pythonを用いましたが、人によってはC♯もありだと思っています。C♯で書かれたOpenCVを利用したプログラムをpythonで書き換えるのはとても容易でした。C♯では、C++言語にあるC言語由来の弱点が少ないので記述が簡潔でした。