非常にパフォーマンスに敏感ないくつかの関数(1秒あたり数百万回と呼ばれる)を持つかなり大きなプロジェクトにソースファイルがあります。実際、以前のメンテナーは、1つの関数で条件のチェックに費やす時間を節約するために、それぞれわずかに異なる関数のコピーを12個書くことにしました。
残念ながら、これはコードが維持するPITAであることを意味します。重複するコードをすべて削除し、テンプレートを1つだけ作成したいと思います。ただし、Java言語はテンプレートをサポートしていないため、ジェネリックがこれに適しているかどうかはわかりません。
私の現在の計画は、代わりに関数の12個のコピーを生成するファイル(実際には1回限りのテンプレート拡張機能)を書くことです。もちろん、ファイルをプログラムで生成する必要がある理由については、豊富な説明を提供します。
私の懸念は、これが将来のメンテナーの混乱につながり、変更後にファイルを再生成するのを忘れると厄介なバグを引き起こす可能性があることです。残念ながら、C ++ですべてを書き直すまで、これを修正する方法はありません。
このアプローチの利点は欠点を上回っていますか?代わりに:
- パフォーマンスに打撃を与え、単一の保守可能な機能を使用します。
- 関数を12回複製する必要がある理由の説明を追加し、保守の負担を丁寧に負担します。
- ジェネリックをテンプレートとして使用することを試みます(それらはおそらくそのようには動作しません)。
- 単一の関数にコードをパフォーマンスに依存させるという古いメンテナーに大声で叫ぶ。
- パフォーマンスと保守性を維持する他の方法は?
PSプロジェクトの設計が貧弱であるため、関数のプロファイリングはかなりトリッキーです...しかし、前のメンテナーは、パフォーマンスの低下は許容できないと私に確信させました。これは彼が5%以上を意味すると思いますが、それは私の側の完全な推測です。
おそらく少し詳しく説明する必要があります。12個のコピーは非常によく似たタスクを実行しますが、わずかな違いがあります。違いは関数全体のさまざまな場所にあるため、残念ながら多くの条件文があります。事実上、6つの操作の「モード」と2つの操作の「パラダイム」があります(自分で作成した単語)。関数を使用するには、操作の「モード」と「パラダイム」を指定します。これは決して動的ではありません。コードの各部分は、厳密に1つのモードとパラダイムを使用します。12のモードパラダイムペアはすべて、アプリケーションのどこかで使用されます。これらの関数には、func1〜func12という適切な名前が付けられ、偶数が2番目のパラダイムを表し、奇数が最初のパラダイムを表します。
保守性が目標であれば、これは最悪の設計であることを認識しています。しかし、それは「十分に速い」と思われ、このコードはしばらく変更を必要としませんでした...元の関数が削除されていないことにも注意する価値があります(ただし、私が知る限り、それはデッドコードです) 、したがって、リファクタリングは簡単になります。
Makefile
(または使用するシステム)からビルドするときにのみファイルを作成し、コンパイルを終了してすぐに削除します。このようにして、彼らは間違ったソースファイルを変更する機会がありません。