UML软件工程组织

 

 

用状态机模式消除复杂的 if else 逻辑
 
作者:木野狐 来源:cnblogs
 
前一阵开发的一个 web 界面上有很多诸如“按钮隐藏显示”,“边框隐藏显示”,“伸缩” 等效果的切换,在展示不同内容的时候,这些配套的显示控件需要跟着切换不同的状态。迫于进度,使用的是 if..else, 或者 switch..case 的繁杂的 js 代码来实现这些状态的判断和转换。js 代码很快到了 400~500行,变得很难理解。并且我要加入新的状态切换的时候感觉比较困难。今天决心重构,于是忽然联想起状态机 (State Machine) 模式,不正好在这里能用上吗?而 js 中的对象表示语法正好非常方便构造“状态表”和“状态轮换表”,花了1个多小时,完成了这个工作。重构后代码的逻辑可谓豁然开朗,带来的仅仅是配置上的稍许冗余,但是这个完全可以接受的。

大致的伪代码:

 
// 状态表定义
var statusTable = {
    '状态1': {
        sizeCode: 1,
        headerUrl: '/test1/test2',
        bodyUrl: 'about:blank',
        showTitle: 
true,
        showBorder: 
true,
        showMin: 
true,
        showMax: 
false,
        showClose: 
true
    },
    '状态3': {
        sizeCode: 2,
        headerUrl: '/test1/test2',
        bodyUrl: '/test1/test2',
        showTitle: 
true,
        showBorder: 
true,
        showMin: 
true,
        showMax: 
true,
        showClose: 
true
    },
    '状态4': {
        sizeCode: 3,
        headerUrl: '/test1/test2',
        bodyUrl: '/test1/test2',
        showTitle: 
true,
        showBorder: 
true,
        showMin: 
true,
        showMax: 
false,
        showClose: 
true
    },
    '状态2': {
        sizeCode: 2,
        headerUrl: '/test1/test2',
        bodyUrl: '/test1/test2',
        showTitle: 
true,
        showBorder: 
true,
        showMin: 
true,
        showMax: 
false,
        showClose: 
true
    }
};
// 当前状态码
var currentStatusCode = '';

// 切换到状态机某个状态   
function loadStatus(code){
    
var status = statusTable[code] || null;
    
if(!status) return;
    
    
// update other status
    // 利用 status 做一系列设置。。如显示隐藏按钮等
    // 
    
    currentStatusCode = code;
}

// 示例函数 foo 和 bar.
// 一个函数是一套自定义的逻辑,定义一个状态轮换表即可实现。
function foo(){
    
var jumpTable = {
        '状态1': '',
        '状态2': '状态1',
        '状态3': '状态4',
        '状态4': ''
    };
    loadStatus(jumpTable[currentStatusCode] || '');
}

function bar(){
    
var jumpTable = {
        '状态1': '状态2',
        '状态2': '',
        '状态3': '状态1',
        '状态4': '状态3'
    };
    loadStatus(jumpTable[currentStatusCode] || '');
}
 

 

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号