2012-04-17 2 views
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 изменилась:

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 (при смене OPTION3 или ОПЦИЯ4 от конфигурации или когда Мне нужно использовать новые данные или использовать их при показе давления на пользователя).

Мой вопрос: как я могу это сделать с помощью ООП? Каков правильный способ сделать это на C#?

Я думал о фабричном шаблоне, но что с новыми параметрами в конфигурации или с новыми объектами данных?

ответ

1

Если вам требуется поддерживать ту же архитектуру для разных версий внешнего компонента (устройство в вашем случае), то может помочь ваша архитектура с подключаемым модулем.

Например, вы можете:

Каждый BusinessLayer класс должен реализовать IPluginInterface (скажем), так как это слой, где actuall связи с устройством должно произойти.

Класс должен быть Communicator, который считывает информацию о версии устройства и выбирает из коллекции доступных BusinessLayers, которые могут управлять требуемой версией.

Просто, чтобы дать вам представление.

+0

Я не знаю, правильно ли я это понимаю, но ваше решение решает часть моей проблемы (разные версии структур данных). Но что с новыми классами бизнес-класса, использующими структуры из новой версии? И как поддерживать новые функции в классах старого бизнес-уровня – adams

+0

В моем решении у вас есть коллекция BusinessLayers и Communicator, которая сначала считывает информацию о версии с устройства и после выбора из коллекции BusinessLayers, соответствующей – Tigran

+0

. Вы имеете в виду, что я должен реализовать две версии каждой Класс BusinessLayer (по одному для каждой версии устройства)? – adams

Смежные вопросы