LoginSignup
2
4

More than 5 years have passed since last update.

プロトタイピングをして追加実装を楽にする。

Last updated at Posted at 2015-08-13

メンテナンスしているC++のソースに新しい機能を追加することになった。

仕様の確認

実装を求められている仕様を確認することから始まる。
データの入力と出力と、何を実現したいのかという漠然とした期待から始まる。(それを内部でどのように実装すべきかは、開発者にゆだねられている。)そこで、それが実際にうまくいったときには、どのような結果になるのか、その結果をグラフで確認しやすい枠組みを使おう。

プロトタイプしやすいライブラリと言語

次に、本番の実装と共通するライブラリ(あるいは、同等の機能を持つライブラリ)を、もっとプロトタイピングやテストのしやすい言語を使って、アルゴリズムの検討を行う。

従来MATLABで実現していた機能の多くは、Python統合環境Spyderなど(python + numpy + matplotlib)で容易に利用できます。PythonやC♯などは、C++よりはコーディングが楽な言語です。関数で実装すべきか、クラスで実装すべきかにおいても、事前に試してみることができます。その結果、使い勝手を確かめた設計を、C++で実装することになります。

以下は、spyder統合環境がMATLABに類似した操作性を実現していることを示す例です。

simpleExample.py
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言語由来の弱点が少ないので記述が簡潔でした。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4