锁定老帖子 主题:代码结构及逻辑的一些思考
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-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){ ... } 这种写法,看起来是把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"; ... } 这种写法逻辑不混乱了,但是,部分代码里有重复的部分存在.如果对于同一个类型的args做相同的修改,那么每次修改都要到各个相应的函数中去修改,如果忘修改一处,就会留下一个隐患. 但是,如果需要做的修改是,当args=='1',取的args值变为var abc = args+"789"; 那么在做代码跟踪及修改的时候,就只需要关注doB就可以了,不需要再看a函数的处理.在这一点上,这种方式又是比较好的. 怎么做,才能保证代码的逻辑清楚,又能保证代码的修改时尽量少的更改代码?在两者存在矛盾的时候,取优先考虑哪一种呢? 个人倾向于第二种方式,但是还没有找到相应的理论依据,所以先在此记录下来,如有高手路过,也希望能有所指点 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-12
本身通过if分发就不是好主意...
|
|
返回顶楼 | |
发表时间:2011-08-12
gtssgtss 写道 本身通过if分发就不是好主意... 那么使用什么方式比较合适呢 |
|
返回顶楼 | |
发表时间:2011-08-16
最后修改:2011-08-22
LZ觉得下面的方法可行不?
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-08-17
最后修改:2011-08-17
第一段代码先统一处理,后分别调用各个函数,不是很好吗,怎么有"看起来是把args统一处理了,但是在各个分处理的函数(如doB,doC等)中,还会有对于传入参数的处理"。你说的"还会有对于传入参数的处理"这一说是什么个情况?第二段代码实在没看懂,doB(abc,args); 中的abc是什么?怎么定义的函数doB只有一个参数,调用的时候却是两个?另外这么多的if,为什么不用switch呢?
|
|
返回顶楼 | |
发表时间:2011-08-17
最后修改:2011-08-17
如果是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-08-17
最后修改:2011-08-17
如果入参类型很多的话,我觉得应该配置一个路由(遵循约定), 再通过分发器做转发。 类似struts1那种。这样会比较清晰, 不然一堆case/if else。
|
|
返回顶楼 | |
发表时间:2011-08-18
axiheyhey 写道 LZ觉得下面的方法可行不?
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-08-18
很乱。构造参数的语句,直接写成一个函数不就可以了?
|
|
返回顶楼 | |
发表时间:2011-08-22
axiheyhey 写道 LZ觉得下面的方法可行不?
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'; } 谢谢,这个方式 不错,我得好好琢磨一下 |
|
返回顶楼 | |