【发布时间】:2011-01-20 23:23:26
【问题描述】:
VB.NET,VS 2010,.NET 4
你好,
我写了一个应用程序。我发现它充满了循环引用。我想重写部分代码以改进其设计。我已阅读有关分层编程的内容,并希望为我的应用程序实现类似的东西。
背景:我的应用程序是一个工业机器的控制程序。它解析一个配方(来自一个 Excel 文件),其中包含各种连接设备的时间信息和设定点。设备主要分为三种类型:大多数通过 Beckhoff 终端连接并通过 TwinCAT(Beckhoff 的伪 PLC 软件)进行通信,另外两种是 RS-232 设备,每种都具有不同的通信协议。我可以通过 Beckhoff 提供的 .NET API 与 Beckhoff 设备进行通信。我已经为两个 RS-232 设备编写了解析器类。 Beckhoff 设备有些是输入,有些是输出;有些是数字的,有些是(伪)模拟的。
我认为我的问题是我在编写应用程序时试图将我的头脑围绕在 OOP 上,所以我在没有清楚地了解它们的层次结构的情况下随意创建了类。在某些时候,我试图做我认为正确的事情,比如制作一个“设备”类,该类被“TwinCatDevice”类和“Rs232Device”类继承。但后来我只是把所有的通信代码都塞进了那些类中。
我现在正在尝试创建一些通信模块(例如,UtilTwinCat、UtilRs232),其中包含“连接”、“断开连接”、“读取”、“写入”等抽象方法。然后我正在尝试重写我的“设备”类和子类以使用这些模块,这样它们就不必包含任何(有时是冗余的)通信代码。
这是我的问题:为每种类型的通信类型创建单独的类是否是好的设计?即,我应该说“TwinCatReadOnlyDigital”、“TwinCatReadOnlyAnalog”、“TwinCatWriteOnlyDigital”、“TwinCatWriteOnlyAnalog”、“TwinCatReadWriteDigital”、“TwinCatReadWriteAnalog”、“Rs232ReadOnlyDigital”等?或者像 IReadOnly、IWriteOnly、IDuplex 这样的接口?
这似乎不是正确的方法,因为我认为擅长编程的人不会最终为每种可能性提供十亿个不同的类。有什么方法可以在运行时选择性地在类上实现接口?我认为这是一个愚蠢的问题......我仍在努力思考为什么人们会使用界面。我正在寻找有关如何解决此类设计问题的一些基本见解。具体来说,如果您有很多“事物”略有不同,那么创建大量略有不同的类的最佳方法是什么?
提前非常感谢, 布赖恩
编辑:我只是想补充一点,明确地说,参数已知的设备数量有限,因此为我需要的所有类型编写类会很简单。我只是想知道是否有更好的方法。
【问题讨论】:
标签: vb.net design-patterns inheritance architecture