2012-04-17 3 views
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); } 
} 
} 

と変換クラスバイナリデータの変換に使用されます:

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; } 
} 
} 

また変換はBEEMは変更されています:コンフィギュレーションまたはときからオプション3またはオプション4を変更するとき

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 
} 
} 

は、今私は(デバイスのバージョンのために、私は新しいfuncionalityを使用する必要があるたびにチェックする必要が私は新しいデータを使用する必要がありますか、ユーザーにプレッシャーをかけるときにどのアルゴリズムを使用するか)。

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

私は工場のパターンを考えていましたが、Configurationの新しいオプションや新しいデータエンティティはどうですか?

答えて

1

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

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

すべてBusinessLayerクラスは、このように、(例えば)デバイスとのactuall通信が起こるはず層をIPluginInterfaceを実装する必要があります。

デバイスのバージョン情報を読み込み、利用可能なBusinessLayersのコレクションから、必要なバージョンを管理することが可能なものがあるCommunicatorクラスが存在するはずです。

アイデアを伝えるだけです。

+0

私はそれを正しく理解しているかどうかわかりませんが、あなたのソリューションは私の問題(異なるデータ構造のバージョン)の一部を解決します。しかし、新しいバージョンの構造を使用して新しいbusiinessレイヤークラスを使用するとどうなりますか?そして、古いビジネスレイヤクラスの新しい機能を維持する方法 – adams

+0

私のソリューションでは、BusinessLayersのコレクションがあり、Communicatorはまずデバイスからバージョン情報を読み込み、BusinessLayersのコレクションから適切なものを選択した後 – Tigran

+0

それぞれ2つのバージョンBusinessLayerクラス(デバイスバージョンごとに1つ)? – adams

関連する問題