正确的程序结构

时间:2012-04-17 11:57:15

标签: c# oop

我的应用程序用于与电子设备通信。它读取一些识别数据(如设备固件版本),一些配置数据以及来自传感器的周期性数据。计划分为三层:

  1. 数据层 - 描述数据如何存储在设备存储器中的简单结构。

  2. 业务层 - 用于与设备通信的类。它们包含来自数据层的结构,并在读取和写入设备时使用它们来存储数据。

  3. 表示层 - 用户界面(WinForms);使用businnes图层类。

  4. 假设:

    数据结构如下:

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

    Conversions也改变了:

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

    现在我每次需要使用新功能时都要检查设备版本(当从Configuration更改Option3或Option4时,或者当我需要使用新数据etities或在向用户显示压力时使用哪种算法)。

    我的问题是我如何通过OOP实践来做到这一点?在C#中执行此操作的正确方法是什么?

    我在考虑工厂模式,但配置中的新选项或新数据实体是什么?

1 个答案:

答案 0 :(得分:1)

如果您需要为不同版本的外部组件(在您的情况下为设备)维护相同的架构,基于插件的架构可以为您提供帮助。

例如,你可以:

每个BusinessLayer类都应该实现IPluginInterface(比如说​​),因为这是实现与设备进行通信的层。

应该有一些Communicator类,他们从可用的BusinessLayers集合中读取设备版本信息和选择,该类可以管理所需的版本。

只是为了给你一个想法。