私たちの知識領域には、素足で圧力記録プレートの上を歩く人々が含まれます。センサーデータで人間の足が認識されると、「Foot」クラスのオブジェクトを生成する画像認識を行います。
足のデータに対して実行する必要がある計算がいくつかあります。
さて、どのAPIの方が良いでしょう:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
または:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
今、私が思いつくことができる多くの賛否両論がありますが、どれが最も重要かを本当に決めることはできません。これはエンドユーザーアプリケーションであり、当社が販売するソフトウェアライブラリではありません。
何かアドバイス?
最初のアプローチのプロには次のようなものがあります。
- KISS-すべてが非常に具体的です。APIですが、実装も同様です。
- 強く型付けされた戻り値。
- このクラスを継承するのは簡単です。上書きすることはできず、追加するだけです。
- APIは非常に閉じられており、何も入れられず、オーバーライドされることもありません。
いくつかの短所:
- 新しい計算がリストに追加されるたびに、ゲッターの数が増えます
- APIは変更される可能性が高く、重大な変更が導入された場合、新しいAPIバージョンであるFoot2が必要です。
- 他のプロジェクトでクラスを再利用する場合、すべての計算が必要になるとは限りません
2番目のアプローチのプロ:
- より柔軟に
- APIは変更される可能性が低くなります(抽象化が正しいと仮定すると、変更されないとしても変更にかかるコストが高くなります)
いくつかの短所:
- 緩やかに入力されます。すべての呼び出しでキャストが必要です。
- 文字列パラメータ-私はそれについて悪い感情を持っています(文字列値の分岐...)
- 追加の柔軟性を要求する現在のユースケース/要件はありませんが、将来的には存在する可能性があります。
- APIは制限を課します。すべての計算は基本クラスから派生する必要があります。計算を取得することは、この1メソッドを介して強制されます。さらに動的で、柔軟性が高く、複雑さをさらに高めるパラメーターを渡す方法を考案しない限り、追加のパラメーターを渡すことはできません。
getCalculation()
ます。
enum
その値をオンにすることができます。それでも、2番目の選択肢はKISSから逸脱しているため、悪だと思います。