VB.NET初学者设计问题

时间:2011-01-20 23:23:26

标签: vb.net design-patterns inheritance architecture

VB.NET,VS 2010,.NET 4

您好,

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

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

我认为我的问题是我在编写应用程序时试图绕过OOP,因此我毫不犹豫地创建了类,而没有清楚地了解它们的层次结构。在某些方面,我尝试做我认为正确的事情,比如做一个“Device”类,它继承了一个“TwinCatDevice”类和一个“Rs232Device”类。但后来我把这些类中的所有通信代码都填满了。

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

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

这似乎不是正确的方法,因为我认为擅长编程的人最终不会因为每个可能性而导致十亿个不同的类。有没有办法在运行时有选择地在类上实现接口?我认为这是一个愚蠢的问题......我仍然试图解决为什么会使用界面。我正在寻找一些关于如何解决这类设计问题的基本见解。具体来说,如果你有很多不同的“事物”,那么创建许多略有不同的类的最佳方法是什么?

提前多多感谢, 布赖恩

编辑:我只想补充一点,要清楚的是,有一些参数已知的设备数量有限,因此可以直接为我需要的所有类型编写类。我只是想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

对于任何具体答案而言,这些信息并不足够,但请允许我提出一些建议。

  

“我仍然试图解决为什么会使用界面。”

主要是因为那时你可以“编程到界面”,如果你正在使用Beckhoff或RS-232设备你就不必在意 - 你只关心你可以向它发送数据。只是为了说清楚:interfaces 包含实现。实现接口的类承诺为接口的功能提供具体的实现。

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

此外,更具体的问题将得出更具体的答案:)

相关问题