web-dev-qa-db-ja.com

システムの物理的なアクセサリをソフトウェアのクラスとして表す必要がありますか?

データ収集ユニットと多くの異なるセンサー(電圧センサー、角度センサー、圧力センサーなど)で構成されるシステムを再設計しています。

ソフトウェアドメインモデルには、基本Sensorクラスがあり、そこからすべての具体的なセンサーが派生します。

public abstract class Sensor
{
    public virtual String Name { get; }
    public virtual UnitOfMeasurement Unit { get; }
    public virtual int SamplingRate { get; }
    public virtual CalibrationModel Calibration { get; }
}

これらのサブクラスはすべて、当社が販売する物理センサーを表しており、各プロパティに「ハ​​ードコードされた」値があります。たとえば、VoltageSensorの名前は「Voltage」、単位は「UnitOfMeasurement.Volt」、SamplingRateは「1000」などです。

私が解決しようとしている現在の問題はこれです:

新しい実際のセンサーハードウェアが開発され、ポートフォリオに追加されるたびに、次の「ショットガン手術」を行う必要があります。

  1. 新しいSensorサブクラスを作成します。
  2. システムの残りの部分に散在する小さな変更を実行します(依存関係などのため)。
  3. クライアントベースのアップデートをリリースします。

私が理解しているように、各物理センサー(ハードウェア)は概念的なユニットであり、再コンパイルおよび再デプロイする必要がないように、実行中のシステムに「プラグイン」できる必要があります。これは起こっていることではないので、どうすればこの「プラグ可能性」を達成し、これまでうまく機能していた多態的な動作を維持できるのだろうか(ポートフォリオを変更する必要があるたびを除く)。

私が取ることができるいくつかの「ポリモーフィズム上の構成」の代替設計はありますか?

2
heltonbiker

動作(メソッドの実装)がまったく異なり、値のみが異なるクラスのサブクラスが多数ある場合は、それらすべてを1つのクラスで表し、以前に読んだ方がよい場合がよくあります。構成ファイル、データベーステーブル、またはその他のデータソースからのハードコードされた値。

新しいセンサータイプを追加するには、構成に行を追加するだけです。再コンパイルは不要になり、構成が人間が読める形式の場合、プログラミングの知識がなくても誰かが再コンパイルを行うことができます。

スマートに実行すると、プログラムの実行中に構成を再読み取りできるようにすることもできるため、更新ではプログラムを再起動する必要もありません。

10
Philipp