一小段JavaScript代码的重构

INTRO: 组里面下任务,下发了几个老系统里面的js文件来做重构设计。抽了其中一小段出来搞了一下,感觉还是有收获的,先贴上自己重构的代码,后续还会有讨论的分享。

组里面下任务,下发了几个老系统里面的js文件来做重构设计。

抽了其中一小段出来搞了一下,感觉还是有收获的,先贴上自己重构的代码,后续还会有讨论的分享。

主要的业务逻辑是在表单提交之前做很多的逻辑验证,金额以及日期的选择,由于是后台系统,所以交互上面不是特别看重,错误提示都直接alert了。

这段代码主要问题是if..else的嵌套太多,此外感觉有一些地方原来写的不严谨。
我的第一反应是将过多的嵌套去掉,增强代码的可读性, 所以这是第一个重构迭代的主要目标;
第二轮,就会想想是不是可以把一些东西抽象一下。

优化的代码也可以直接看这里

对于if..else..语句的优化,可以参考这篇文章

下面直接看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
 * 原始代码
 */
var beforeSubmit = function(e, ajaxTip){
    var scopeDays = countDays('date1', 'date2');
    var oDate1 = D.get('date1').value;
    var oDate2 = D.get('date2').value;
    var regCal = /^\d{4}-((0[1-9]{1})|(1[0-2]{1}))-((0[1-9]{1})|([1-2]{1}[0-9]{1})|(3[0-1]{1}))$/;
 
    if (/^\s*\d+(\.\d{0,2})?\s*$|^\s*$/.test(D.get("minAmount").value)) {
        if (parseFloat(D.get("minAmount").value.trim()) == 0) {
            alert("最小金额为0.01");
            E.stopEvent(e);
            return;
        }
    } else {
        alert("金额格式错误,必须为数字,且至多2位小数。");
        E.stopEvent(e);
        return;
    }
 
    if (/^\s*\d+(\.\d{0,2})?\s*$|^\s*$/.test(D.get("maxAmount").value)) {
        if (parseFloat(D.get("maxAmount").value.trim()) == 0) {
            alert("最小金额为0.01");
            E.stopEvent(e);
            return;
        }
    } else {
        alert("金额格式错误,必须为数字,且至多2位小数。");
        E.stopEvent(e);
        return;
    }  
 
    if (oDate1 == '') {
        alert('请输入开始日期!');
        E.stopEvent(e);
    } else {
        if (oDate2 == '') {
            alert('请输入结束日期!');
            E.stopEvent(e);
        } else {
            if (regCal.test(oDate1) == false || regCal.test(oDate2) == false) {
                alert('抱歉,日期格式输入不正确,格式应为:yyyy-mm-dd(如:2010-10-08)');
                E.stopEvent(e);
            } else {
                if (oDate1 > oDate2) {
                    alert("开始日期应当在结束日期之前!");
                    E.stopEvent(e);
                } else { 
                    if (scopeDays > 186) {
                        alert("抱歉,日期查询范围不能超过6个月!");
                        E.stopEvent(e);
                    } else {
                        if (ajaxTip(scopeDays)) {
                            document.getElementsByName("pageStr")[0].value = 1;//重置查询时候页码设为第一页
                            D.get('JSFormSearch').disabled = true;
                            D.get('JSFormSearch').form.submit();
                        }
                    }        
                }
            }
       	}
    }
};

—————————————————————

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
 * 改造迭代一
 */
var beforeSubmit = function(e, ajaxTip){
    var scopeDays = countDays('date1', 'date2'),
	oDate1 = D.get('date1').value,
	oDate2 = D.get('date2').value,
	regCal = /^\d{4}-((0[1-9]{1})|(1[0-2]{1}))-((0[1-9]{1})|([1-2]{1}[0-9]{1})|(3[0-1]{1}))$/,
	regAmount = /^\s*\d+(\.\d{0,2})?\s*$|^\s*$/,
	minAmount = D.get("minAmount").value,
	maxAmount = D.get("maxAmount").value;    
 
    E.stopEvent(e);
 
    if (!regAmount.test(minAmount) || !regAmount.test(maxAmount)) {
	alert("金额格式错误,必须为数字,且至多2位小数。");
        return;
    }
    if (parseFloat(minAmount.trim()) == 0 || parseFloat(maxAmount.trim()) == 0) {
        alert("最小金额为0.01");
        return;
    } 
    if (oDate1 == '') {
        alert('请输入开始日期!');   
	return;
    } 
    if (oDate2 == '') {
        alert('请输入结束日期!');  
	return;
    }
    if (regCal.test(oDate1) == false || regCal.test(oDate2) == false) {
     	alert('抱歉,日期格式输入不正确,格式应为:yyyy-mm-dd(如:2010-10-08)');    
	return;
    }
    if (oDate1 > oDate2) {
       	alert("开始日期应当在结束日期之前!");    
	return;
    }
    if (scopeDays > 186) {
       	alert("抱歉,日期查询范围不能超过6个月!"); 
	return;
    }                 
    if (ajaxTip(scopeDays)) {
      	document.getElementsByName("pageStr")[0].value = 1;//重置查询时候页码设为第一页
       	D.get('JSFormSearch').disabled = true;
      	D.get('JSFormSearch').form.submit();
    }
};

—————————————————————

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 * 改造迭代二
 */
var beforeSubmit = function(e, ajaxTip){
    var scopeDays = countDays('date1', 'date2'),
	oDate1 = D.get('date1').value,
	oDate2 = D.get('date2').value,
	regCal = /^\d{4}-((0[1-9]{1})|(1[0-2]{1}))-((0[1-9]{1})|([1-2]{1}[0-9]{1})|(3[0-1]{1}))$/,
	regAmount = /^\s*\d+(\.\d{0,2})?\s*$|^\s*$/,
	minAmount = D.get("minAmount").value,
	maxAmount = D.get("maxAmount").value,
	stat = '';  
 
    var errorObj = {
	'errAmountFormat' : "金额格式错误,必须为数字,且至多2位小数。",
	'errMinAmount' : "最小金额为0.01",
	'errNullStartDate' : '请输入开始日期!',
	'errNullEndDate' : '请输入结束日期!',
	'errDateFormat' : '抱歉,日期格式输入不正确,格式应为:yyyy-mm-dd(如:2010-10-08)',
	'errDateOrder' : "开始日期应当在结束日期之前!",
	'errDateMaxScope' : "抱歉,日期查询范围不能超过6个月!",
	'errUnexpected' : "未知错误"
    };  
 
    E.stopEvent(e);  
 
    stat = (function(){
	if (!regAmount.test(minAmount) || !regAmount.test(maxAmount)) { return 'errAmountFormat'; }
	if (parseFloat(minAmount.trim()) == 0 || parseFloat(maxAmount.trim()) == 0) { return 'errMinAmount'; }
	if (oDate1 == '') { return 'errNullStartDate'; } 
	if (oDate2 == '') { return 'errNullEndDate'; }
	if (regCal.test(oDate1) == false || regCal.test(oDate2) == false) { return 'errDateFormat'; }
	if (oDate1 > oDate2) { return 'errDateOrder'; }
	if (scopeDays > 186) { return 'errDateMaxScope'; } 
	if (!ajaxTip(scopeDays)) { return 'errUnexpected'; }
	return 'ok';
    })();
 
    if (stat !== 'ok') {
	alert(errorObj[stat]);
    } else {
	document.getElementsByName("pageStr")[0].value = 1;//重置查询时候页码设为第一页
   	D.get('JSFormSearch').disabled = true;
	D.get('JSFormSearch').form.submit();
    }        
    return;
};

或许您对这些文章也感兴趣:

希望得到您的评论

(匿名是不被允许的)
(不会被公开)

DecImage.com 印象十二月 遥记那一季西部行

你不能逃避你的弱点,要不就奋起反击,要不就坐以待毙。如果真的是这样,为什么不从此时就开始呢?——Robert Louis Stevenson
感谢阅读我的文章,如果您需要订阅:RSS Feed | Comments RSS Feed

> 推荐两本看过的书

  • 艽野尘梦艽野尘梦全书5万多字,文言文书写,纸薄情长。读完全书,你必从此不会忘记一个叫西原的女子。
  • 幸福的建筑幸福的建筑阿兰·德波顿说他对任何的装饰都深恶痛绝,故我觉得他会和我一样喜欢北欧极简主义。
  • >友情链接

  • 零九的十二月 我在西部游走 像一个孩子一样