论坛首页 Web前端技术论坛

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

浏览 4665 次
精华帖 (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;


0 请登录后投票
   发表时间: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); } } ... } 两种方式相比,哪种比较好?原理是什么
0 请登录后投票
   发表时间: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);
}
}
...
}


两种方式相比,哪种比较好?原理是什么
0 请登录后投票
   发表时间: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。


0 请登录后投票
   发表时间: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的反射...这个不太了解...
0 请登录后投票
   发表时间: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。



看来我是得花些时间去看看相关的东西
0 请登录后投票
   发表时间: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合并一下,这个解耦度——就看你根据实际场景怎么设计了。
0 请登录后投票
   发表时间: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就足够了。



0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics