我在设计我的程序的一部分时遇到了问题(不是一次编写它!).如果不写小说,这很难解释,所以我会尽量简短.
基本上,我有一个程序可以从一个硬件读取/写入参数.目前,它通过Serial实现了这一目标,但最终,我希望通过USB使用.NET包装器来实现FTDI芯片http://www.ftdichip.com/Projects/CodeExamples/CSharp.htm
我想我的问题是,我知道我想要几层抽象,但我似乎无法知道在哪里绘制线条.首先,我不希望我的ReadParam(),WriteParam()和SendCommand()函数坐在我的主窗体类中.这似乎只是拼凑而成.显然他们应该在其他类中,我将实例化.我们暂时称之为Comm.
第一个选择是,我可以创建一个接口,让我们说IComm,让我的串口和USB口味都能实现.这样做的问题是,大部分代码都会在两种风格中重复,因为我有特殊ReadReplyData()功能和其他功能,它们在将串行数据返回到GUI之前对其进行预处理.
所以下一个选择是Comm是一个中间类,它定义了一个接口ICommDriver. Comm将实现私人ReadReplyData()格式化功能,以及公众ReadParam(),WriteParam()和SendCommand()功能,同时ICommDriver将指定唯一的简单Read和Write功能.
除了两个曲折之外,这一切似乎微不足道.一,我希望这显然是多头的,所以GUI不会挂起.所以我认为这Comm将使用a BackgroundWorker来完成所有的读/写操作.此外,需要告诉Serial flavor要打开哪个COM端口(从GUI下拉列表),而USB风味则不然.那么我是否要创建界面的那一部分?
感谢大家的帮助,我几天来一直在编写/删除代码,试图找出正确的方法来做到这一点!
乔纳森
我知道我想要几层抽象,但我似乎无法知道在哪里绘制线条
这就是你的问题所在.这是一个根本上有缺陷的发展方法,正是导致这种瘫痪的原因.首先开发几种口味的具体实现.使用kludgy if type1 else type2逻辑让他们在您的应用程序中工作.然后回去重构他们所有人,分享一个共同的合同,共同基础,你有什么.这将是再明显有什么需要去的地方.
在评论中有更多细节:
如果您在实现之间共享代码,则应使用抽象类.根据我的经验,最佳做法是保持公共方法最终并从公共方法中调用受保护的抽象方法,如下所示:
public interface IComm
{
void WriteParam(...);
}
public abstract class CommStandardBase : IComm
{
public void WriteParam(...)
{
DoWriteParam(...);
}
private void DoWriteParam(...)
{
CommonWrite1(...);
HandleWriteParam(...);
CommonWrite2(...);
}
protected abstract void HandleWriteParam(...);
private void CommonWrite1(...)
{
...
}
private void CommonWrite2(...)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
让每个班级都自成一体.它应该是单实例,单线程,可以在工人和记者之间传递.