【问题标题】:OOP design pattern for program refactoring用于程序重构的 OOP 设计模式
【发布时间】:2021-01-25 13:16:10
【问题描述】:

我的问题是根据面向对象的编程原则重构程序。程序无休止地在一个while循环中运行,所有操作都在这个主while循环中。这个主循环有一个 switch-case 语句。 它有 11 个案例,所有案例都是代表语句,如 unplanned_stopplanned_stopread_data_from_xread_data_from_y... 此外,这些状态中有 if-else 子句来调用不同的函数。每个状态都根据 if-else 决策指向另一个状态以进行下一步。

我已经搜索过,状态设计模式似乎适合这个解决方案,但我不确定。 主循环是这样的:

while(programIsRunnning)
{
   switch(programState)
   {
      case state.StartOfLoop:
          if(..) doSomething();
          else doAnotherThing();
          programState = state.PlannedStop;
          break;
      case state.PlannedStop:
          if(..) programState = state.ReadDataFromX;
          else programState = state.ReadDataFromY;
      case state.ReadDataFromX:
          if(..) programState = state.UnplannedStop;
          else programState = state.StartOfLoop;
      .
      .
      .
  

我希望我能解释清楚。这种设计令人讨厌,很难理解在哪里实施新规范。对于程序的每个新请求,我都必须编辑其他状态和 if-else 子句。我是一名大三学生,我所能想到的就是用 OOP 设计模式对其进行重新编码。欢迎提出任何建议。

【问题讨论】:

  • 嗨,将其重构为 OOP 听起来正是您应该做的 :)。继续前进! Stackoverflow 最适用于特定问题,对于给出可重现代码的特定问题。当你有其中一个时,回来发一个新帖子:)
  • 嗯,你这里的一个状态机。如果您想要(或需要)重构它,您首先需要了解为什么它被设计为状态机。是否涉及一些硬件? - 或者你只是想要“一个 OOP 风格的状态机”?
  • 另外:你对代码有足够的控制权来进行这样的“大修”吗?你需要时间,可能需要很多时间,而且你需要证明你没有破坏任何东西。
  • 您可以查看stateless 以获得一些启发。
  • 是的,它从树莓派获取数据

标签: c# oop design-patterns refactoring


【解决方案1】:

您的任务非常适合使用State pattern,下面我提供了一个示例代码,说明类依赖项的外观。我们将大开关拆分成几个类,每个类负责处理一个状态,并可以将程序转移到其他状态。

例如,我使用了 Python 语言,因为它非常直观,并且勾勒出了几个类似于我曾经解决的问题的类,我还显式添加了在切换和离开时调用状态的方法,有时这很有用。


class StateInterface:
    def on_enter(self):
        ...

    def work(self):
        ...

    def on_leave(self):
        ...


class StateOne(StateInterface):
    def __init__(self, main_program):
        self.main_program = main_program

    def on_enter(self):
        # do some init
        ...

    def work(self):
        # do some work
        new_state = StateTwo(self.main_program)
        self.main_program.change_state(new_state)

    def on_leave(self):
        # do some clear
        ...


class StateTwo(StateInterface):
    ...


class MainProgram:
    def __init__(self, initial_state: StateInterface):
        self.current_state = initial_state

    def infinite_loop(self):
        while not self.stopped:
            self.current_state.work()

    def change_state(self, new_state: StateInterface):
        self.current_state.on_leave()
        self.current_state = new_state
        self.current_state.on_enter()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多