【问题标题】:VB.NET Beginner design questionVB.NET 初学者设计题
【发布时间】: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


    【解决方案1】:

    对于任何具体答案来说,这些信息还不够,但让我提出一些建议。

    “我仍在努力思考为什么要使用接口。”

    主要是因为您可以“编程到接口”,也就是说,您不必关心您使用的是 Beckhoff 还是 RS-232 设备 - 您只关心您可以向它发送数据。只是为了说清楚:接口包含实现。实现接口的类承诺为接口的功能提供具体的实现。

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

    此外,更具体的问题将导致更具体的答案:)

    【讨论】:

    • 感谢您的观点。我觉得我快要掌握整个界面的想法了。我有希望;三个月前,我同样对课程的整个想法感到困惑:x。我知道这个问题很模糊,但我向你保证,这是我绝望无知的准确反映。我会去的!
    • 不要放弃,它真的没有看起来那么糟糕 :) 上网看看,有很多资料可以学习。也有不少关于 OOP 的书籍——无论如何,这都不是一件小事。继续努力:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2020-11-23
    相关资源
    最近更新 更多