设计对象之间的耦合

时间:2013-02-10 20:34:30

标签: c# design-patterns

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

enter image description here

我的系统有几个HW(硬件),包含许多要使用的进程数据。 HW反过来有几个Channel也有很多数据。

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

我的问题是如何将HWPlantHWChannelPlantChannel绑定在一起(方向无关紧要)?我希望它松散耦合,性能良好,易于理解。

我也不确定是否最好迭代所有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
}

1 个答案:

答案 0 :(得分:0)

对于你的问题,我们无法得到非常明确的想法,但根据我的理解,你需要分别拥有与硬件和渠道相关的工厂和工厂渠道。在我看来,你应该有一个工厂接口,你的硬件类应该通过接口注入植物实例。这使您可以灵活地在运行时更改任何实现。同样适用于Channel类。