C# 带有大箱陈述的条形码扫描仪应用程序的设计模式建议

C# 带有大箱陈述的条形码扫描仪应用程序的设计模式建议,c#,design-patterns,architecture,barcode-scanner,C#,Design Patterns,Architecture,Barcode Scanner,我正在寻找一些关于一个好的设计模式/模型的输入,用于重构制造厂中使用的windows CE条形码扫描应用程序。试着让它更面向对象,少一点程序化 目前,应用程序的大部分功能基本上由一个主要方法中的大型case语句控制,私有整数的值决定了通过case的路径 由于许多扫描是按顺序执行的,因此每次条形码扫描后,代码基本上都会循环通过此主方法,直到用户退出菜单并选择不同的扫描功能 对于许多事务类型,代码需要依次通过主case语句采用多条路径。例如,“打包”事务要求用户首先扫描其id徽章,然后扫描目标容器,

我正在寻找一些关于一个好的设计模式/模型的输入,用于重构制造厂中使用的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是什么样子。我不知道为什么这个答案被接受。对不起。没有任何像样的反馈、解释、文章链接的流行语到处乱扔。。。。