职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 486|回复: 9

代码结构及逻辑的一些思考

[复制链接]
broken 发表于 2011-8-31 10:12 | 显示全部楼层 |阅读模式
问题:

a函数是根据传入参数的不同类型,选择不同的函数去执行操作.但是在执行不同的函数之前,需要做一些数据上的处理,那么这部分处理是放在各个被调用的函数中还是放在a函数中统一处理好呢?
  
function a (args){   
   var abc   
   if (args =='1' || args =='2' || args =='5') {   
        var abc = args+"123";   
   }   
   if (args =='3' || args =='4') {   
         var abc = args+"456";   
   }   
   if (args =='1') doB(abc);   
   if (args =='2') doC(abc);   
   if (args =='3') doD(abc);   
   if (args =='4') doE(abc);   
   if (args =='5') doF(abc);   
}   
function doB(abc){   
    ...   
}   
function doC(abc){   
    ...   
}   
function doD(abc){   
    ...   
}   
function doE(abc){   
    ...   
}   
function doF(abc){   
    ...   
}  

function a (args){
   var abc
   if (args =='1' || args =='2' || args =='5') {
        var abc = args+"123";
   }
   if (args =='3' || args =='4') {
         var abc = args+"456";
   }
   if (args =='1') doB(abc);
   if (args =='2') doC(abc);
   if (args =='3') doD(abc);
   if (args =='4') doE(abc);
   if (args =='5') doF(abc);
}
function doB(abc){
    ...
}
function doC(abc){
    ...
}
function doD(abc){
    ...
}
function doE(abc){
    ...
}
function doF(abc){
    ...
}

这种写法,看起来是把args统一处理了,但是在各个分处理的函数(如doB,doC等)中,还会有对于传入参数的处理,似乎就会存在逻辑混乱的问题,当做代码修改和维护的时候,如果是对于doB这个函数的处理,就必须得看两个部分的代码.先要从a开始跟踪,然后再是doB部分的代码处理.

还是写成
  
function a (args){      
   if (args =='1' || args =='2' || args =='5') {         
    doB(abc,args);   
   }   
   if (args =='3' || args =='4') {   
         doC(abc,args);   
   }   
   if (args =='1') doB(abc);   
   if (args =='2') doC(abc);   
   if (args =='3') doD(abc);   
   if (args =='4') doE(abc);   
   if (args =='5') doF(abc);   
  
}   
function doB(abc){   
    var abc = args+"123";   
  
    ...   
}   
function doC(abc){   
   var abc = args+"123";   
    ...   
}   
function doD(abc){   
   var abc = args+"456";   
  
    ...   
}   
function doE(abc){   
   var abc = args+"456";   
  
    ...   
}   
function doF(abc){   
   var abc = args+"123";   
    ...   
}  

function a (args){   
   if (args =='1' || args =='2' || args =='5') {      
        doB(abc,args);
   }
   if (args =='3' || args =='4') {
         doC(abc,args);
   }
   if (args =='1') doB(abc);
   if (args =='2') doC(abc);
   if (args =='3') doD(abc);
   if (args =='4') doE(abc);
   if (args =='5') doF(abc);

}
function doB(abc){
    var abc = args+"123";

    ...
}
function doC(abc){
   var abc = args+"123";
    ...
}
function doD(abc){
   var abc = args+"456";

    ...
}
function doE(abc){
   var abc = args+"456";

    ...
}
function doF(abc){
   var abc = args+"123";
    ...
}
这种写法逻辑不混乱了,但是,部分代码里有重复的部分存在.如果对于同一个类型的args做相同的修改,那么每次修改都要到各个相应的函数中去修改,如果忘修改一处,就会留下一个隐患.
但是,如果需要做的修改是,当args=='1',取的args值变为var abc = args+"789";
那么在做代码跟踪及修改的时候,就只需要关注doB就可以了,不需要再看a函数的处理.在这一点上,这种方式又是比较好的.

怎么做,才能保证代码的逻辑清楚,又能保证代码的修改时尽量少的更改代码?在两者存在矛盾的时候,取优先考虑哪一种呢?

个人倾向于第二种方式,但是还没有找到相应的理论依据,所以先在此记录下来,如有高手路过,也希望能有所指点

江南枫 发表于 2011-8-31 10:13 | 显示全部楼层
本身通过if分发就不是好主意...

曾经的小孩 发表于 2011-8-31 10:13 | 显示全部楼层
gtssgtss 写道
本身通过if分发就不是好主意...

那么使用什么方式比较合适呢

钰云 发表于 2011-8-31 10:13 | 显示全部楼层
LZ觉得下面的方法可行不?
Js代码  
function a (args){   
    var obj = {   
        '1': doB,   
        '2': doC,   
        '3': doD,   
        '4': doE,   
        '5': doF   
    };   
    var func = obj[args];   
    if(func){   
        func(args);   
    }else{   
        alert("There are not method for " + args);   
    }   
}     
function doB(args){     
    var abc = dataHandleA(args);     
    //do something...   
}     
function doC(args){     
    var abc = dataHandleA(args);     
    //do something...   
}     
function doD(args){     
    var abc = dataHandleB(args);     
    //do something...   
}     
function doE(args){     
    var abc = dataHandleB(args);     
    //do something...   
}     
function doF(args){     
    var abc = dataHandleA(args);     
    //do something...   
}   
function dataHandleA(data){   
    return data + '123';   
}   
function dataHandleB(data){   
    return data + '456';   
}  

function a (args){
    var obj = {
             '1': doB,
             '2': doC,
             '3': doD,
             '4': doE,
             '5': doF
    };
    var func = obj[args];
    if(func){
        func(args);
    }else{
        alert("There are not method for " + args);
    }
}  
function doB(args){  
    var abc = dataHandleA(args);  
    //do something...
}  
function doC(args){  
    var abc = dataHandleA(args);  
    //do something...
}  
function doD(args){  
    var abc = dataHandleB(args);  
    //do something...
}  
function doE(args){  
    var abc = dataHandleB(args);  
    //do something...
}  
function doF(args){  
    var abc = dataHandleA(args);  
    //do something...
}
function dataHandleA(data){
    return data + '123';
}
function dataHandleB(data){
    return data + '456';
}


紫衿 发表于 2011-8-31 10:13 | 显示全部楼层
第一段代码先统一处理,后分别调用各个函数,不是很好吗,怎么有"看起来是把args统一处理了,但是在各个分处理的函数(如doB,doC等)中,还会有对于传入参数的处理"。你说的"还会有对于传入参数的处理"这一说是什么个情况?第二段代码实在没看懂,doB(abc,args); 中的abc是什么?怎么定义的函数doB只有一个参数,调用的时候却是两个?另外这么多的if,为什么不用switch呢?

走失的猫咪 发表于 2011-8-31 10:13 | 显示全部楼层
如果是java, 似乎要建一下接口,public interface IF1{
                                                                void  doSth(arg)
                                                          }
class B implements IF1(){
   doSth(arg){

   }
}

class C implements IF1(){
   doSth(arg){

   }
}
...

这样做就封装和隐藏了具体的处理,便于拓展和应对变化。

在调用的地方可以统一 IF1 if1= ; //这里是依赖注入,你的代码从ifelse逻辑判断变成了应该在这里注入什么,抽象的层次变了。
                                         if1.doSth();



过程式switch:
switch():
    case 1:
    case 2:
    case 5: dosth; break;
    case 3:
    case 4: dosth;

秋秋 发表于 2011-8-31 10:13 | 显示全部楼层
如果入参类型很多的话,我觉得应该配置一个路由(遵循约定), 再通过分发器做转发。 类似struts1那种。这样会比较清晰, 不然一堆case/if else。

北大青鸟 发表于 2011-8-31 10:14 | 显示全部楼层
axiheyhey 写道
LZ觉得下面的方法可行不?
Js代码  
function a (args){   
    var obj = {   
        1: doB,   
        2: doC,   
        3: doD,   
        4: doE,   
        5: doF   
    };   
    var func = obj[args];   
    if(func){   
        func(args);   
    }else{   
        alert("There are not method for " + args);   
    }   
}     
function doB(args){     
    var abc = dataHandleA(args);     
    //do something...   
}     
function doC(args){     
    var abc = dataHandleA(args);     
    //do something...   
}     
function doD(args){     
    var abc = dataHandleB(args);     
    //do something...   
}     
function doE(args){     
    var abc = dataHandleB(args);     
    //do something...   
}     
function doF(args){     
    var abc = dataHandleA(args);     
    //do something...   
}   
function dataHandleA(data){   
    return data + '123';   
}   
function dataHandleB(data){   
    return data + '456';   
}  

function a (args){
    var obj = {
             1: doB,
             2: doC,
             3: doD,
             4: doE,
             5: doF
    };
    var func = obj[args];
    if(func){
        func(args);
    }else{
        alert("There are not method for " + args);
    }
}  
function doB(args){  
    var abc = dataHandleA(args);  
    //do something...
}  
function doC(args){  
    var abc = dataHandleA(args);  
    //do something...
}  
function doD(args){  
    var abc = dataHandleB(args);  
    //do something...
}  
function doE(args){  
    var abc = dataHandleB(args);  
    //do something...
}  
function doF(args){  
    var abc = dataHandleA(args);  
    //do something...
}
function dataHandleA(data){
    return data + '123';
}
function dataHandleB(data){
    return data + '456';
}

看着确实不错 代码正解 可读性高



醉倚西风 发表于 2011-8-31 10:14 | 显示全部楼层
很乱。构造参数的语句,直接写成一个函数不就可以了?

走失的猫咪 发表于 2011-8-31 10:14 | 显示全部楼层
axiheyhey 写道
LZ觉得下面的方法可行不?
Js代码  
function a (args){   
    var obj = {   
        1: doB,   
        2: doC,   
        3: doD,   
        4: doE,   
        5: doF   
    };   
    var func = obj[args];   
    if(func){   
        func(args);   
    }else{   
        alert("There are not method for " + args);   
    }   
}     
function doB(args){     
    var abc = dataHandleA(args);     
    //do something...   
}     
function doC(args){     
    var abc = dataHandleA(args);     
    //do something...   
}     
function doD(args){     
    var abc = dataHandleB(args);     
    //do something...   
}     
function doE(args){     
    var abc = dataHandleB(args);     
    //do something...   
}     
function doF(args){     
    var abc = dataHandleA(args);     
    //do something...   
}   
function dataHandleA(data){   
    return data + '123';   
}   
function dataHandleB(data){   
    return data + '456';   
}  

function a (args){
    var obj = {
             1: doB,
             2: doC,
             3: doD,
             4: doE,
             5: doF
    };
    var func = obj[args];
    if(func){
        func(args);
    }else{
        alert("There are not method for " + args);
    }
}  
function doB(args){  
    var abc = dataHandleA(args);  
    //do something...
}  
function doC(args){  
    var abc = dataHandleA(args);  
    //do something...
}  
function doD(args){  
    var abc = dataHandleB(args);  
    //do something...
}  
function doE(args){  
    var abc = dataHandleB(args);  
    //do something...
}  
function doF(args){  
    var abc = dataHandleA(args);  
    //do something...
}
function dataHandleA(data){
    return data + '123';
}
function dataHandleB(data){
    return data + '456';
}


谢谢,这个方式 不错,我得好好琢磨一下

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-16 16:06 , Processed in 0.144974 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表