c# - 正确的程序结构

标签 c# oop

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

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

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

  3. 表示层 - 用户界面 (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); }
 }
}

以及用于转换二进制数据的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# 中执行此操作的正确方法是什么?

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

最佳答案

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

例如,您可以:

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

应该有一些 Communicator 类,它读取设备版本信息并从可用的 BusinessLayers 集合中选择一个能够管理所需版本的类。

只是给你一个想法。

关于c# - 正确的程序结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10190781/

相关文章:

c# - 如何在 EF 5 中导入具有标量返回值的函数

PHP - 常量的用途?

c# - 为层次结构中的实体获取父级

c# - 如何一次只foreach集合中的某一行?

c# - 如果条件取决于另一个变量,如何在不同的条件之间进行选择

php - 对某个 PHP 类的每个实例化对象执行一个方法

c++ - 关于构造函数调用和继承顺序的一些困惑

c# - 在 C# 中加密文件的最简单方法是什么?

javascript - 管理对象实例

Java:有没有办法强制执行私有(private)方法?