用状态机来实现复杂操作
2016-12-21
编程
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就好了.