2011-01-20 47 views
1

VB.NET,VS 2010,.NET 4VB.NET初学者设计的问题

你好,

我写的应用程序。我发现它充满了循环引用。我想重写部分代码来改进其设计。我已阅读了分层编程,并希望为我的应用程序实现类似的内容。

背景:我的应用程序是一个工业机器的控制程序。它解析包含各种连接设备的时间信息和设定值的配方(来自Excel文件)。有三种主要类型的设备:大多数通过Beckhoff终端连接,并通过TwinCAT(Beckhoff的伪PLC软件)进行通信,另外两个是RS-232设备,每个设备都有不同的通信协议。我可以通过Beckhoff提供的.NET API与Beckhoff设备进行通信。我已经为两个RS-232设备编写了解析器类。一些Beckhoff设备是输入,一些是输出;有些是数字的,有些是(伪)模拟的。

我认为我的问题是我在编写应用程序时试图绕过OOP,所以我创建了一些无法清晰了解其层次结构的类。在某些时候,我尝试做我认为正确的事情,例如,制作一个由“TwinCatDevice”类和“Rs232Device”类继承的“Device”类。但后来我把所有的通信代码都塞进了这些类中。

我现在正在尝试创建一些通信模块(例如,UtilTwinCat,UtilRs232),其中包含诸如“连接”,“断开”,“读取”,“写入”等抽象方法。然后我试图重写我的“设备”类和子类以使用这些模块,以便它们不必包含任何(有时是冗余的)通信代码。

这是我的问题:为每种通信类型创建单独的类是否会是一个好设计?即我应该说“TwinCatReadOnlyDigital”,“TwinCatReadOnlyAnalog”,“TwinCatWriteOnlyDigital”,“TwinCatWriteOnlyAnalog”,“TwinCatReadWriteDigital”,“TwinCatReadWriteAnalog”,“Rs232ReadOnlyDigital”等?或者也许有些接口像IReadOnly,IWriteOnly,IDuplex?

这看起来似乎不可能是正确的方法,因为我认为一个善于编程的人不会因为每一个可能的事件而结束十亿个不同的类。有什么方法可以在运行时有选择地在类上实现一个接口?我认为这是一个愚蠢的问题......我仍然试图围绕为什么会使用一个接口。我正在寻找一些关于如何解决这类设计问题的基本见解。具体来说,如果你有很多不同的“事物”,是否是创建大量不同的类的最佳方法?

非常感谢提前, 布赖恩

编辑:我只是想补充一点,要明确,有设备,其参数是已知的有限数量的,所以这将是简单的写所有的班级我需要的类型。我只是想知道是否有更好的方法。

回答

1

这对于任何具体的答案来说都不够真实,但让我提出一些建议。

“我仍然试图围绕为什么会使用一个接口。

主要是因为你可以“编程到接口”,那就是你不需要关心你是否在使用Beckhoff或RS-232设备 - 你只关心你可以发送数据给它。只是要说清楚:接口不包含包含的实现。实现接口的类承诺提供接口函数的具体实现。

  • 而不是IReadOnly,IWriteOnly和IDuplex使用两个接口:IWriteable和IReadable(或任何名称有意义)。双工类将实现这两​​个接口。
  • 策略或更可能是模板方法模式可能会帮助您稍微不同的类。也许甚至是简单的子类化,但请记住,通常有一个更简单,更好的解决方案。
  • 不要重复自己(DRY):尝试为每个逻辑块找到一个且只有一个地方。
  • 几个类共享的功能应该驻留在超类或实用程序类中。

而且,更具体的问题会导致更具体的答案:)

+0

感谢您的观点。我觉得我正在接近理解整个界面的想法。我有希望;三个月前,我对类的整个想法也同样感到困惑:x。我知道这个问题含糊不清,但我向你保证,这是我绝望的无知头脑的准确反映。我会到达那里! – 2011-01-21 01:50:49