一种高度优化的更新值互斥的多个变量的方法
程序员文章站
2022-06-01 16:32:05
...
问题背景
假如有一组状态变量sta_1, sta_2, sta_3, ..., sta_m,分别表示一个系统的所有状态值sta_const_1, sta_const_2, sta_const_3,...,sta_const_m。
约束:
- 其中任一时刻系统只能原子的处于其中的任一个状态常量值,不会发生两个状态同时并存的情况。
- 每个周期更新一次状态变量。
传统方法
包装到switch...case语句中或者是if-elseif-else中,这样下来,真个程序看上去既冗长也比较碍眼。 如果碰上完美型人格的人,这段代码能一直困扰着他/她。
void set_sta(const sys_state& cur_state)
{
switch (cur_state)
{
case sta_const_0:
sta_1 = false;
sta_2 = false;
sta_3 = false;
...
sta_m = false;
break;
case sta_const_1:
sta_1 = true; // this state is active, rest state are inactive
sta_2 = false;
sta_3 = false;
...
sta_m = false;
break;
case sta_const_2:
sta_1 = false;
sta_2 = true; // this state is active, rest state are inactive
sta_3 = false;
...
sta_m = false;
break;
case sta_const_3:
sta_1 = false;
sta_2 = false;
sta_3 = true; // this state is active, rest state are inactive
...
sta_m = false;
break;
case sta_const_m:
sta_1 = false;
sta_2 = false;
sta_3 = false;
...
sta_m = true; // this state is active, rest state are inactive
break;
default: /// this is a case easily ignored
// error logic
break;
}
}
优化方法
通过观察状态变量值的变化与系统状态之间的逻辑关系,可以发现只有和系统状态一致的那个状态变量是true,其他的都为false。 换种说法是,一个状态变量的值只取决于该系统的状态是否等于该状态变量所指示的状态。所以,可以把这个发现转换成状态变量的逻辑运算结果,从而使代码的逻辑得到极大简化,不仅少敲很多代码,而且也不容易出错,更重要的是后期的维护和扩展也更方便。请看如下代码:
void set_sta(const sys_state& cur_state)
{
sta_1 = (sta_const_1 == cur_state);
sta_2 = (sta_const_2 == cur_state);
sta_3 = (sta_const_3 == cur_state);
...
sta_m = (sta_const_m == cur_state);
}
其它应用
在多页面的应用中,有时会根据某个状态值,来切换页面的显示,来决定隐藏哪些页或显示哪一页。对于这个场景,该优化的方法也是非常适用的。该方法能将页面的切换逻辑变得格外简单,赏心悦目。
原创文章,乐于分享。欢迎转载,注明出处!
--------------------------------------------------------------------------------
Love your code, then love your life.