C# 带有大箱陈述的条形码扫描仪应用程序的设计模式建议
我正在寻找一些关于一个好的设计模式/模型的输入,用于重构制造厂中使用的windows CE条形码扫描应用程序。试着让它更面向对象,少一点程序化 目前,应用程序的大部分功能基本上由一个主要方法中的大型case语句控制,私有整数的值决定了通过case的路径 由于许多扫描是按顺序执行的,因此每次条形码扫描后,代码基本上都会循环通过此主方法,直到用户退出菜单并选择不同的扫描功能 对于许多事务类型,代码需要依次通过主case语句采用多条路径。例如,“打包”事务要求用户首先扫描其id徽章,然后扫描目标容器,然后扫描要打包到目标容器中的项目,所有这些在主方法中都是单独的案例 在这种情况下,一个非常简化的示例:C# 带有大箱陈述的条形码扫描仪应用程序的设计模式建议,c#,design-patterns,architecture,barcode-scanner,C#,Design Patterns,Architecture,Barcode Scanner,我正在寻找一些关于一个好的设计模式/模型的输入,用于重构制造厂中使用的windows CE条形码扫描应用程序。试着让它更面向对象,少一点程序化 目前,应用程序的大部分功能基本上由一个主要方法中的大型case语句控制,私有整数的值决定了通过case的路径 由于许多扫描是按顺序执行的,因此每次条形码扫描后,代码基本上都会循环通过此主方法,直到用户退出菜单并选择不同的扫描功能 对于许多事务类型,代码需要依次通过主case语句采用多条路径。例如,“打包”事务要求用户首先扫描其id徽章,然后扫描目标容器,
private int activeTrans;
private int baseTrans;
private int nextTrans;
btnPack_Click()
{
nextTransaction = 2
StartTransaction(1, 1)
}
StartTransaction(int transId, int transMode)
{
//determines the initial path(s) to take
switch (transMode)
{
case 1: //scan parent
activeTrans = 4;
baseTrans = transId;
break;
//a handful of other case statements representing the major types of transactions
...
}
StartBarcodeRead() //the scanner prepared to scan, once the user scans a barcode,
//the HandleData method is called
}
HandleData()
{
switch (activeTrans)
{
case 1: //select target container
DoSomeMethodForTheTargetContainer();
activeTrans = baseTrans;
case 2: //pack in container
DoThePackingMethod();
case 3: //scan id badge
ValidateIdBadgeScan();
activeTrans = baseTrans;
baseTrans = nextTrans;
... //about 20 more cases for all the different transactions
}
这似乎是使用命令模式的一个可能的候选者,因为每个扫描函数都有可能是一个“堆栈”或按顺序运行的事务,但我不确定。代码一直运行良好-我只想尝试重构一点,因为我可以预见随着需求的变化或添加,代码会变得越来越复杂 这是一个非O-O问题,所以寻找O-O设计模式是不合适的(至少在重构的这个阶段)。你需要一个有限状态机,所以设计一个有限状态机。如果您的FSM的特定部分看起来仍然太麻烦或复杂,请为其寻找合适的O-O设计模式。这是一个非O-O问题,所以寻找O-O设计模式是不合适的(至少在重构的这个阶段)。你需要一个有限状态机,所以设计一个有限状态机。如果您的FSM的特定部分看起来仍然太麻烦或复杂,请为其寻找合适的O-O设计模式。可能是策略模式:在我回答之前,当您说顺序时,您的意思是仅保证向前,还是它们分支甚至返回?顺序基于实际工作的完成方式-例如,扫描父容器X操作发生在“装入容器”X操作之前。在某些情况下,可能需要将一个事务放在另一个事务之前-例如,我们希望在扫描父容器X操作之前进行员工id徽章扫描,因此我们调整了整数变量的设置顺序,以便可以根据策略模式调整序列:在我回答之前,当你说sequence时,你的意思是保证只向前,还是它们分支甚至返回?序列是基于实际工作的完成方式-例如,扫描父容器X动作发生在pack-in-container X动作之前。在某些情况下,可能需要将一个事务放在另一个事务之前-例如,我们希望在扫描父容器X操作之前进行员工id徽章扫描,因此我们调整了整数变量的设置顺序,以便可以根据需要调整序列。我同意FSM部分,但我不确定现在考虑最终解决方案应该是什么样子还为时过早。@Conrad:对于有几位FSM支持的人,我同意。对于第一次或第二次使用FSM的人来说,现在还为时过早,因为他们不知道FSM是什么样子。我不知道为什么这个答案被接受。对不起。在没有任何像样的反馈、解释、文章链接的情况下到处乱扔的流行语……很有趣。我同意FSM部分,但我不确定现在考虑最终解决方案应该是什么样子还为时过早。@Conrad:对于有几位FSM支持的人,我同意。对于第一次或第二次使用FSM的人来说,现在还为时过早,因为他们不知道FSM是什么样子。我不知道为什么这个答案被接受。对不起。没有任何像样的反馈、解释、文章链接的流行语到处乱扔。。。。