3

私のアプリケーションは、電子機器との通信に使用されます。いくつかの識別データ(デバイスファームウェアバージョンなど)、いくつかの構成データ、およびセンサーからの定期的なデータを読み取ります。プログラムは3つの層に分かれています。

  1. データレイヤー-データがデバイスメモリにどのように保存されるかを説明する単純な構造。

  2. ビジネスレイヤー-デバイスとの通信に使用されるクラス。これらにはデータ層の構造が含まれており、デバイスからの読み取りおよびデバイスへの書き込み時にデータを格納するためにそれらを使用します。

  3. プレゼンテーション層-ユーザーインターフェイス(WinForms); businnesレイヤークラスを使用します。

と仮定する:

データ構造は次のようになります。

public struct Configuration
{
 public int Option1;
 public int Option2;
}

public struct Visualization
{
 public int Temperature;
 public int Pressure;
}

ビジネスレイヤークラスはこれらの構造をラップし、通信用のロジックを含みます。

public abstract class BaseEntity<DataStructureType>
{
 protected DataStructureType dataStructure;
 public BaseEntity()
 {
  this.dataStructure = new DataStructureType();
 }
 /*
  device communication logic
 */
 public abstract bool GetAllData();
}

public class ConfigurationEntity : BaseEntity<Configuration>
{
 public override bool GetAllData()
 {
  //getting configuration data from device
 }
 public int Option1
 {
  get { return this.dataStructure.Option1; }
  set { this.dataStructure.Option1 = value; }
 }
 public int Option2;
 {
  get { return this.dataStructure.Option2 * 100; }
  set { this.dataStructure.Option1 = value / 100; }
 }
}

public class VisualizationEntity : BaseEntity<Visualization>
{
 public override bool GetAllData()
 {
  //getting visualization data from device
 }
 public int Temperature
 {
  get { return this.dataStructure.temperature; }
 }
 public float Pressure;
 {
  get { return Conversions.IntToPressure(this.dataStructure.pressure); }
 }
}

バイナリデータの変換に使用されるConversionsクラス:

public static class Conversions
{
 public static float IntToPressure(int parameter)
 {
  return PressureAlgorithmA(parameter);
 }
 private static float PressureAlgorithmA(int parameter)
 {
  //some algorithm (called A) to convert binary pressure to pressure in bars
 }
}

問題は新しいファームウェアバージョンです。アプリケーションは両方のデバイスバージョン(古いバージョンと新しいバージョン)を処理する必要があるためです。新しいバージョンは、読み取るためのいくつかの新しい構造、新しい変換アルゴリズム、新しい構成オプションで更新されました。次のようになります。

public struct Configuration
{
 /*
  old options are here
 */
 //and updated goes here:
 public int Option3;
 public int Option4;
}

public class ConfigurationEntity : BaseEntity<Configuration>
{
 /*
  old code is here
 */
 //and updated goes here
 public int Option3
 {
  get { return this.dataStructure.Option3; }
  set { this.dataStructure.Option3 = value; }
 }
 public int Option4;
 {
  get { return this.dataStructure.Option4 * 20; }
  set { this.dataStructure.Option4 = value / 20; }
 }
}

また、コンバージョンは変更されました。

public static class Conversions
{
 public static float IntToPressure(int parameter)
 {
  return PressureAlgorithmB(parameter);
 }
 private static float PressureAlgorithmB(int parameter)
 {
  //some algorithm (called B) to convert binary pressure to pressure in bars
 }
}

これで、新しい機能を使用する必要があるたびにデバイスのバージョンを確認する必要があります(オプション3またはオプション4を構成から変更する場合、新しいデータエティティを使用する必要がある場合、またはユーザーに圧力を表示するときに使用するアルゴリズム)。

私の質問は、OOPの実践でそれをどのように行うことができるかということです。C#でこれを行う正しい方法は何ですか?

ファクトリパターンについて考えていましたが、構成の新しいオプションや新しいデータエンティティではどうでしょうか。

4

1 に答える 1

1

異なるバージョンの外部コンポーネント(この場合はデバイス)に対して同じアーキテクチャを維持する必要がある場合は、プラグインベースのアーキテクチャが役立ちます。

たとえば、次のことができます。

これはデバイスとの実際の通信が行われるべきレイヤーであるため、すべてBusinessLayerのクラスは(たとえば)実装する必要があります。IPluginInterface

Communicatorデバイスのバージョン情報を読み取り、利用可能なコレクションから選択するクラスが必要です。このクラスは、BusinessLayers必要なバージョンを管理できます。

あなたにアイデアを与えるためだけに。

于 2012-04-17T12:11:09.447 に答える