正确的程序结构
本文关键字:结构 程序 | 更新日期: 2023-09-27 18:31:19
我的应用程序用于与电子设备通信。它从传感器读取一些标识数据(如设备固件版本)、一些配置数据和定期数据。程序分为三层:
-
数据层 - 描述数据如何存储在设备内存中的简单结构。
-
业务层 - 用于与设备通信的类。它们包含来自数据层的结构,并在读取和写入设备时使用它们来存储数据。
-
表示层 - 用户界面(WinForms);使用业务层类。
假设:
数据结构如下所示:
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; }
}
}
转换也发生了变化:
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# 中执行此操作的正确方法是什么?
我在考虑工厂模式,但是配置中的新选项或新数据实体呢?
如果您需要为不同版本的外部组件(在您的情况下为设备)维护相同的架构,基于插件的架构可以为您提供帮助。
例如,您可以:
每个BusinessLayer
类都应该实现IPluginInterface
(比如说),因为这是应该与设备进行精算通信的层。
应该有一些Communicator
类,他们读取设备版本信息并从可用BusinessLayers
集合中进行选择,该类能够管理所需的版本。
只是为了给你一个想法。