用状态机来实现复杂操作

Context

这次新产品的蓝牙绑定过程有点儿复杂

与炫轮作比较

炫轮只有一个characteristic,不同的操作之间没有顺序关系,都是并列的

新产品有多个characteristic,每个characteristic有不同的意义和不同的指令,每个操作都有先后顺序

Solution

突然想起来,本科的微处理器,还是数字电路课,讲过状态机这个玩意儿.我觉得,可以拿来搞一搞.这样清晰明了,可以省去很多中间变量.

比如

BOOL isConnecting;
BOOL isDiscovering;
BOOL didWriteXXX;
BOOL didReadXXX;
.....

使用了状态机,并且规定好了状态转移的条件,那么,整个系统就一定在这个状态列表中滚.不会出现位置状态,导致程序跑飞.

因为从状态A–>状态B,只有当前条件是xxxx的时候才会实现.这时候不用再去管其他的变量,其他的事件.

使用了状态机,可以轻松地对已有逻辑进行扩充,因为只要拿出,状态转移图来.找到需要添加的地方,就能确定在代码中,有多少地方需要修改,如此一来,就不用在需要该需求的时候,重新阅读已有代码了!

使用了状态机,一般只需要一个记录状态的变量就够了,而且重写这个变量的Setter方法,还可以方便做一些其他的事情:

-(void)setStage:(VKLocatorPairState)stage{
    NSLog(@"pairing status %@",[PublicHelper localizedStringForPairStatus:stage]);
    //发送通知
    //如果是终止状态,发送完通知后,回到原始状态
    [[NSNotificationCenter defaultCenter]postNotificationName:kPairLocatorStatusUpdated object:@(stage)];
    if (stage==1) {  //透露太多了,要被周老板干掉的
        //透露太多了,要被周老板干掉的
    }
    if (stage==1) {  //透露太多了,要被周老板干掉的
        //透露太多了,要被周老板干掉的
    }
    if (stage==1) {  //透露太多了,要被周老板干掉的
        //透露太多了,要被周老板干掉的
    }
}

对,转移状态,和UI可以分开处理,免得以后要界面逻辑,还要去状态转移中找代码.

变量和类名都起得很不要脸啊,小伙子

总之

这一篇,看起来像硬广啊.

再总之

Android端也可以很轻松的做移植.

所以做Android的这个操作,差不多就是在做翻译工作,把Objective-C 翻译为 Java就好了.