B級科学者もどきの憂鬱

とある理系になりきれない奴のつれづれなる活動記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

手間を省くライブラリとは?

今回は、プログラムのライブラリの設計について考えます。
ちなみに私は、ソフトウェア工学の専門家じゃないので、
プログラミング素人の戯言ってことで勘弁してください。
そんなわけで、カテゴリも考察じゃなくてプログラミングです。

プログラマの手間を省くためのライブラリというのは、
汎用的で、常に安全に使え、動作は十分に速く、
知識が付けば付くほどより効率的に組める、
そうあるべきものだと私は思っています。

この最後の項目については賛否あると思いますが、
今回はそれについて考えてみます。

私が作っているものの中から具体例を出してみます。
説明用なので、ごく一部のメソッドのみ書きます。
まだ自分の理想には遠いので、実装そのものは今は出しません。
いずれ出す時はあるかもしれませんが。

自作の高速フーリエ変換(FFT)クラスでは、
次のようなメソッドが用意されています。
なお、DataTypeというのは、このクラスの
テンプレート引数で指定される型名です。

bool Prepare(unsigned int length)
変換に際して用いられるテーブルを計算します。
テーブル作成に失敗したらtrueが返ります。

bool Transform(DataType data[], unsigned int length, bool isInverse=false)
変換処理を行う関数です。
順変換を行う場合は、isInverseにfalseを、
逆変換を行う場合は、isInverseにtrueを指定します。
変換に失敗したらtrueが返ります。

上の二つを使っていれば、とりあえず変換処理は組めます。
ただ、Prepareの呼び出しは必須ではありません。
Prepareを呼ばなかった場合、Transformでは、
計算テーブルを使わない、少し効率の悪いルーチンが使われます。

Prepareで指定したlengthとTransformで指定したlengthが
異なる場合も同じです。自動的にPrepareが呼ばれたりはしません。

lengthの値に応じて、Transformは、
FFTを処理するルーチンを自動的に選択します。
例えば、2の累乗値であれば、基数2のFFTが呼ばれます。

publicなメソッドは他にもあります。

void FFFT2Bmain(DataType data[], unsigned int length)
基数2のFFT順変換のメインルーチンです。

void IFFT2Bmain(DataType data[], unsigned int length)
基数2のFFT逆変換のメインルーチンです。

本来、FFTではビット反転という処理が必須なのですが、
この二つのメソッドは、内部でこの処理を行いません。
ある特別な条件下では、ビット反転が不要になる場合があるので、
わざわざpublicに用意してあります。

Transformでは、ビット反転処理とこのメインルーチンを呼び出しています。
しかし、特別な条件下、具体的には畳み込み演算などでは、
このメインルーチンのみで計算することが出来るので、
Transformを使うのに比べて、処理の無駄が省けます。

専門的な知識が付くと、より効率的なプログラムが組め、
知識が無くてもそれなりに高速なコードにはなる、
というのは分かって頂けるでしょうか。

私は、ライブラリというのは本来、
このようにして組むべきものだと思うのです。

専門的な知識が無いと使えない、さっきの例で言う、
FFTメインルーチンとビット反転メソッドだけのものでは、
そのライブラリを使おうとする際、予備知識が必要になります。
それでは、プログラマの手間があまり低減出来ていないと思うのです。

もちろん、より効率を上げようと思うのなら、
当然ながらプログラマ自身も勉強しないといけませんが、
効率はそれなりでいいから組めさえすればいいという人には、
出来る限り簡単な方法を提供すべきだと思います。

さて最後に、何でこんな記事を書いたのかというと、
DirectXのヘルプが分かりにくい上に専門用語だらけだからです。
専門用語を使うなとは言わないから、せめてその解説が欲しい……。
スポンサーサイト

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。