【问题标题】:Options for passing method names to a state change object将方法名称传递给状态更改对象的选项
【发布时间】:2012-04-24 21:43:46
【问题描述】:

我有一个状态驱动的类,它根据发生的情况改变状态。该类有一个 state 属性,该属性从许多地方被调用,这些地方以各种方法散布在整个代码中。

因此,发现状态更改逻辑是什么并不容易/显而易见,因此我正在考虑将状态更改集中在一个专用方法中,类似于以下伪代码的内容

- (void) updateState: (Param) action
{
   switch (self.currentState)
     case: EStateA: 
           if (action == connectionSuccesful)
              self.currentState = EStateB;
           else
              self.currentState = EStateC;
     break;
}


- (void) delegateCallbackConnectionSuccess
{
    [self updateState: Param];
}

所以 updateState 方法需要知道发生了什么动作才能改变状态,一个动作被封装为一个方法,因此 updateState 方法需要知道调用它的方法是什么。

所以我的问题是如何最好地实现这一点,Param 应该是什么类型? 有什么选择? SEL、@selector、NSInvocation、其他东西?

TIA

(实现一个完整的状态模式似乎有点矫枉过正,除非它在 ​​iOS 中很容易)

【问题讨论】:

    标签: ios


    【解决方案1】:

    为什么不让方法将状态传递给 updateState:?

    例如

    typedef enum {
        EStateA,
        EStateB
    } EState;
    
    - (void) updateState: (EState) newState {
        switch (self.currentState): {
            ...
        }
        self.currentState = newState;
    }
    
    - (void) delegateCallbackConnectionSuccess {
        [self updateState:EStateB];
    }
    

    【讨论】:

    • 这样每个方法都需要知道接下来是什么状态,而中心化则意味着只有状态方法本身需要知道如何进行,这就是首先中心化它的重点——解耦知识介绍如何从每个单独的方法转换为仅一种方法,使其易于阅读和维护。
    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 2019-10-27
    • 2019-10-27
    • 2021-04-28
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多