锁定老帖子 主题:代码结构及逻辑的一些思考
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-22
ericwzc 写道
如果是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-22
vishare 写道 ericwzc 写道
如果是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; 类似的问题 public class buildhouse(){ //根据不同的参数类型 ... public gethouse(args){ switch(args.type){ case "red":new redhouse(args).getHouse(); break; case "blue":new bluehouse(args).getHouse();break; } } ... } public interface house(){ void setcolor(args); void setwin(args); void setdoor(args); String getHouse(); } public class redhouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 1; door.setColor("black"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } public class bluehouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 2; door.setColor("yellow"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } 如果需要增加新类型的房子,需要做的事情: 1,增加一个新的类 2,修buildhouse()的调用 如果buildhouse()需要增加新的方法,需要做的事情: 1,在buildhouse()中增加方法 2,修改所有的子类 问题: class redhouse与class bluehouse中的方法,setcolor,setwin内容都是一样的,这样算代码重复吗? 第二种方式 public class buildhouse(){ ... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } door.setclock(1); } ... } 如果需要增加新类型的房子,需要做的事情: 需要修改gethouse的方法gethouse 问题: 每次需要修改代码的时候,都要修改gethouse.如果某些参数类型是不同的处理,又需要重新修改buildhouse. 如: public class buildhouse(){ ... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } if(args.type=="green"){ //新增加的类型的处理与原来的不同 door.setclock(3); }else{ door.setclock(1); } } ... } 两种方式相比,哪种比较好?原理是什么 |
|
返回顶楼 | |
发表时间:2011-08-22
public class buildhouse(){ //根据不同的参数类型
... public gethouse(args){ switch(args.type){ case "red":new redhouse(args).getHouse(); break; case "blue":new bluehouse(args).getHouse();break; } } ... } public interface house(){ void setcolor(args); void setwin(args); void setdoor(args); String getHouse(); } public class redhouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 1; door.setColor("black"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } public class bluehouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 2; door.setColor("yellow"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } 如果需要增加新类型的房子,需要做的事情: 1,增加一个新的类 2,修buildhouse()的调用 如果buildhouse()需要增加新的方法,需要做的事情: 1,在buildhouse()中增加方法 2,修改所有的子类 问题: class redhouse与class bluehouse中的方法,setcolor,setwin内容都是一样的,这样算代码重复吗? 第二种方式 public class buildhouse(){ ... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } door.setclock(1); } ... } 如果需要增加新类型的房子,需要做的事情: 需要修改gethouse的方法gethouse 问题: 每次需要修改代码的时候,都要修改gethouse.如果某些参数类型是不同的处理,又需要重新修改buildhouse. 如: public class buildhouse(){ ... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } if(args.type=="green"){ //新增加的类型的处理与原来的不同 door.setclock(3); }else{ door.setclock(1); } } ... } 两种方式相比,哪种比较好?原理是什么 |
|
返回顶楼 | |
发表时间:2011-08-22
最后修改:2011-08-22
vishare 写道 public class buildhouse(){ //根据不同的参数类型 //... public gethouse(args){ switch(args.type){ case "red":new redhouse(args).getHouse(); break; case "blue":new bluehouse(args).getHouse();break; } } //... } public interface house(){ void setcolor(args); void setwin(args); void setdoor(args); String getHouse(); } public class redhouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 1; door.setColor("black"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } public class bluehouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 2; door.setColor("yellow"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } 如果需要增加新类型的房子,需要做的事情: 1,增加一个新的类 2,修buildhouse()的调用 如果buildhouse()需要增加新的方法,需要做的事情: 1,在buildhouse()中增加方法 2,修改所有的子类 问题: class redhouse与class bluehouse中的方法,setcolor,setwin内容都是一样的,这样算代码重复吗? 第二种方式 public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } door.setclock(1); } //... } 如果需要增加新类型的房子,需要做的事情: 需要修改gethouse的方法gethouse 问题: 每次需要修改代码的时候,都要修改gethouse.如果某些参数类型是不同的处理,又需要重新修改buildhouse. 如: public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } if(args.type=="green"){ //新增加的类型的处理与原来的不同 door.setclock(3); }else{ door.setclock(1); } } //... } 两种方式相比,哪种比较好?原理是什么 首先,我想说你的排版让人看着相当的蛋疼。。。 其次,你的类名居然没有首字母大写。。。 1.关于setcolor,setwin重复问题,可以用继承来解决。。继承就是用来解决这档子事的。。 2.如果你想动态添加新类型又不想修改原有代码,Java的反射机制可以满足你的所有欲望,就像我前面回你的用一个json对象来替代if else或switch case一样(事实上你连else都没有...),具体自己Google。 |
|
返回顶楼 | |
发表时间:2011-08-22
axiheyhey 写道 vishare 写道 public class buildhouse(){ //根据不同的参数类型 //... public gethouse(args){ switch(args.type){ case "red":new redhouse(args).getHouse(); break; case "blue":new bluehouse(args).getHouse();break; } } //... } public interface house(){ void setcolor(args); void setwin(args); void setdoor(args); String getHouse(); } public class redhouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 1; door.setColor("black"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } public class bluehouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 2; door.setColor("yellow"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } 如果需要增加新类型的房子,需要做的事情: 1,增加一个新的类 2,修buildhouse()的调用 如果buildhouse()需要增加新的方法,需要做的事情: 1,在buildhouse()中增加方法 2,修改所有的子类 问题: class redhouse与class bluehouse中的方法,setcolor,setwin内容都是一样的,这样算代码重复吗? 第二种方式 public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } door.setclock(1); } //... } 如果需要增加新类型的房子,需要做的事情: 需要修改gethouse的方法gethouse 问题: 每次需要修改代码的时候,都要修改gethouse.如果某些参数类型是不同的处理,又需要重新修改buildhouse. 如: public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } if(args.type=="green"){ //新增加的类型的处理与原来的不同 door.setclock(3); }else{ door.setclock(1); } } //... } 两种方式相比,哪种比较好?原理是什么 首先,我想说你的排版让人看着相当的蛋疼。。。 其次,你的类名居然没有首字母大写。。。 1.关于setcolor,setwin重复问题,可以用继承来解决。。继承就是用来解决这档子事的。。 2.如果你想动态添加新类型又不想修改原有代码,可以考虑用Java的反射来实现你的getHouse(),就像我前面回你的用一个json对象来替代if else或switch case一样(事实上你连else都没有...),具体自己Google。 java还没入门,你说的问题以后我会注意的. Java的反射...这个不太了解... |
|
返回顶楼 | |
发表时间:2011-08-22
axiheyhey 写道 vishare 写道 public class buildhouse(){ //根据不同的参数类型 //... public gethouse(args){ switch(args.type){ case "red":new redhouse(args).getHouse(); break; case "blue":new bluehouse(args).getHouse();break; } } //... } public interface house(){ void setcolor(args); void setwin(args); void setdoor(args); String getHouse(); } public class redhouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 1; door.setColor("black"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } public class bluehouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 2; door.setColor("yellow"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } 如果需要增加新类型的房子,需要做的事情: 1,增加一个新的类 2,修buildhouse()的调用 如果buildhouse()需要增加新的方法,需要做的事情: 1,在buildhouse()中增加方法 2,修改所有的子类 问题: class redhouse与class bluehouse中的方法,setcolor,setwin内容都是一样的,这样算代码重复吗? 第二种方式 public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } door.setclock(1); } //... } 如果需要增加新类型的房子,需要做的事情: 需要修改gethouse的方法gethouse 问题: 每次需要修改代码的时候,都要修改gethouse.如果某些参数类型是不同的处理,又需要重新修改buildhouse. 如: public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } if(args.type=="green"){ //新增加的类型的处理与原来的不同 door.setclock(3); }else{ door.setclock(1); } } //... } 两种方式相比,哪种比较好?原理是什么 首先,我想说你的排版让人看着相当的蛋疼。。。 其次,你的类名居然没有首字母大写。。。 1.关于setcolor,setwin重复问题,可以用继承来解决。。继承就是用来解决这档子事的。。 2.如果你想动态添加新类型又不想修改原有代码,可以考虑用Java的反射来实现你的getHouse(),就像我前面回你的用一个json对象来替代if else或switch case一样(事实上你连else都没有...),具体自己Google。 看来我是得花些时间去看看相关的东西 |
|
返回顶楼 | |
发表时间:2011-08-23
最后修改:2011-08-23
function a (args){ if( do_router[args] ){ do_router[args]( args + args_hash[args] ); } else{ //no method todo something... } }; var args_hash = { 1: '123', 2: '123', 3: '456', 4: '456', 5: '123' }; var do_router = { 1: function(args){ //do something... }, 2: function(args){ //do something... }, 3: function(args){ //do something... }, 4: function(args){ //do something... }, 5: function(args){ //do something... } }; 大致就是这样,也可以将args_hash 和 do_router合并一下,这个解耦度——就看你根据实际场景怎么设计了。 |
|
返回顶楼 | |
发表时间:2011-08-26
axiheyhey 写道 vishare 写道 public class buildhouse(){ //根据不同的参数类型 //... public gethouse(args){ switch(args.type){ case "red":new redhouse(args).getHouse(); break; case "blue":new bluehouse(args).getHouse();break; } } //... } public interface house(){ void setcolor(args); void setwin(args); void setdoor(args); String getHouse(); } public class redhouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 1; door.setColor("black"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } public class bluehouse implements house{ void setcolor(args){color = args.color;} void setwin(args){ winnumber = args.winnum; } void setdoor(args) { door = 2; door.setColor("yellow"); door.setclock(1); } String getHouse(args){ this.setcolor(args); this.setwin(args); this.setdoor(args); }; } 如果需要增加新类型的房子,需要做的事情: 1,增加一个新的类 2,修buildhouse()的调用 如果buildhouse()需要增加新的方法,需要做的事情: 1,在buildhouse()中增加方法 2,修改所有的子类 问题: class redhouse与class bluehouse中的方法,setcolor,setwin内容都是一样的,这样算代码重复吗? 第二种方式 public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } door.setclock(1); } //... } 如果需要增加新类型的房子,需要做的事情: 需要修改gethouse的方法gethouse 问题: 每次需要修改代码的时候,都要修改gethouse.如果某些参数类型是不同的处理,又需要重新修改buildhouse. 如: public class buildhouse(){ //... public gethouse(args){ color = args.color; winnumber = args.winnum; if(args.type=="red") { door = 1; door.setColor("black"); } if(args.type=="blue"){ door = 2; door.setColor("yellow"); } if(args.type=="green"){ //新增加的类型的处理与原来的不同 door.setclock(3); }else{ door.setclock(1); } } //... } 两种方式相比,哪种比较好?原理是什么 面向对象与面向过程哪个更好呢?视情况而定。 假想有200种case,如果200个if/else堆在一块,逻辑关系如果又比较复杂,放在一个文件里假设有5000行,将来这代码好维护吗,你改一行敢不敢保证没有破坏其他的逻辑处理?(我曾经写过一个小函数只有短短100行,但由于逻辑非常复杂,没有10分钟是没法完全看懂函数是做了什么的,后来我很后悔写了那么复杂的一个函数) 与之相对,把每种的处理放到独立的类里面,这符合信息隐藏的原则,非常便于拓展而且不会乱。Favor composition over inheritance. 这是另外一个原则,时间久了你就能体会到这样作的合理性了。 如情况仅有几种,而且处理非常简单,那么用switch就足够了。 |
|
返回顶楼 | |