我需要一些有关如何设计代码的建议。



我的系统有几个HW(硬件),由许多数据组成,供过程使用。 HW依次有几个Channel,它们也有很多数据。

此外,每个PlantPlantHWPlantChannel)都有一些唯一的数据。这些数据中没有太多数据,它们的使用频率不及HWChannel。用户在开始过程之前选择要在过程中使用的Plant,并且在运行期间不会更改。但是用户可以取消该过程,然后选择另一个Plant

我的问题是如何以一种很好的方式将HWPlantHW绑定和ChannelPlantChannel(方向无关紧要)?我希望它可以松散耦合,具有良好的性能并且易于理解。

我也不确定是否最好迭代所有HWPlantHW。两种选择的利弊:

迭代PlantHW


优点:对于特定的Plant,此过程最合逻辑
缺点:它是HW包含所有有趣的数据,感觉不断走过PlantHW似乎是绕道而行。


迭代HW


优点:HW包含所有有趣的数据
缺点:不合逻辑
缺点:进程必须知道所选的Plant才能获得相应的PlantHW / PlantChannel


我想要有关如何设计的建议。

编辑

这6个类包含过程使用的设置和过程数据。从文件中读取它们(通过二进制序列化),然后启动程序。


System-通用系统设置
Plant-该过程可以针对多个工厂运行。此类包含每个工厂唯一的数据。
HW-包含硬件设备的设置和过程数据。
PlantHW-包含特定工厂的硬件设备的设置和过程数据。
Channel-包含硬件设备中通道的设置和过程数据。
PlantChannel-包含特定工厂的硬件设备中通道的设置和过程数据。


例如,我希望能够做到这一点(如果我选择迭代HW的替代方法):

void DoOperationsOnAChannel(HW hw, Plant selectedPlant)
{
   // plantHw data is not often used
   // var plantHw = GetPlantHW(hw, selectedPlant);

   foreach(var channel in hw.Channels)
     //Do operations based on hw, plantHw and channel
}


或(如果选择了迭代PlantHW的替代方法)

void DoOperationsOnAChannel(PlantHW plantHw)
{
   var hw = GetHW(plantHw);
   foreach(var channel in plantHw.Channels)
     //Do operations based on hw, plantHw and channel
}

最佳答案

嗯,关于您的问题还没有很清楚的主意,但是根据我的理解,您需要有一个工厂和工厂通道分别与一个硬件和一个通道关联。在我看来,您应该有一个工厂接口,并且您的硬件类应该通过接口获取注入到它的工厂实例。这使您可以灵活地甚至在运行时更改任何实现。同样适用于Channel类。

关于c# - 设计对象之间的耦合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14802306/

10-09 01:10