重构——选择结构(if..else..,switch,try..catch..)的拆分
2012-08-17 18:21
471 查看
xxxx编程中经常遇到很多条件,以及条件套条件的情况,以至于一个方法会写得非常地长。有多种方法可以规避这个问题。比如反射,策略模式,表驱动等等。先抛开这些方法不讲,从根本需求来探索这个过程。
一个switch结构可能是这样:
swicth(case)
case 1:
//do1
break;
case 2:
//do2
break;
.....
这里注释的do部分代码可能会是很多很多行,以及嵌套switch,if结构。
进一步,这个模型演化成
swicth(case)
case 1:
do1();
break;
case 2:
do2();
break;
.....
do1(){}
do2(){}
也就是将里面的代码模块化。这个方法有效的减小了一个方法的代码长度。实际上这就是一个映射关系的调用。建立映射关系,用Hash结构和delegate就可以避免使用switch了。
delegate void funtionptr();
Dictionary<int, funtionptr> dict = new Dictionary<int, funtionptr>();
dict.Add(1,do1);
dict.Add(2,do2);
int parm = 0;
if(dict.ContainKey(parm)){
dict[parm].Invoke();
}
do1(){}
do2(){}
这个方法实际上就是表驱动,因为C#中一般不用指针,因此用delegate代替了指针的作用。而java中既没有指针也没有delegate怎么办呢?那就用接口模拟指针。
(这里就用C#的语法了,不使用JAVA了)
interface FactionFace{
void do();
}
class FactionFaceImpl1 : FactionFace{
public void do(){}
}
class FactionFaceImpl2 : FactionFace{
public void do(){}
}
Dictionary<int, FactionFace> dict = new Dictionary<int, FactionFace>();
dict.Add(1,new FactionFaceImpl1());
dict.Add(2,new FactionFaceImpl2());
int parm = 0;
if(dict.ContainKey(parm)){
dict[parm].do();
}
可以看出,实际上,上面的代码就是策略模式的简单实现了。(OH~~原理策略模式这么就来的~~)
可以看出,这里实际上是依靠一个字典来维护条件和调用的关系的。那如果没有这个字典来维护怎么办呢?代码再次演化:
interface FactionFace{
void do();
}
class FactionFaceImpl1 : FactionFace{
public void do(){}
}
class FactionFaceImpl2 : FactionFace{
public void do(){}
}
string parm = "FactionFaceImpl2";
FactionFace ff = Type.GetType(parm) as FactionFace;
ff.do();
OH~~这就是简单的反射了。再复杂一些就可以搞成工厂模式,插件模式了。
可以看出,用字典来维护映射关系就可以避免使用反射。(这个是不是一般规律,贫道没本事证明,起码这里是适应的。)
一个switch结构可能是这样:
swicth(case)
case 1:
//do1
break;
case 2:
//do2
break;
.....
这里注释的do部分代码可能会是很多很多行,以及嵌套switch,if结构。
进一步,这个模型演化成
swicth(case)
case 1:
do1();
break;
case 2:
do2();
break;
.....
do1(){}
do2(){}
也就是将里面的代码模块化。这个方法有效的减小了一个方法的代码长度。实际上这就是一个映射关系的调用。建立映射关系,用Hash结构和delegate就可以避免使用switch了。
delegate void funtionptr();
Dictionary<int, funtionptr> dict = new Dictionary<int, funtionptr>();
dict.Add(1,do1);
dict.Add(2,do2);
int parm = 0;
if(dict.ContainKey(parm)){
dict[parm].Invoke();
}
do1(){}
do2(){}
这个方法实际上就是表驱动,因为C#中一般不用指针,因此用delegate代替了指针的作用。而java中既没有指针也没有delegate怎么办呢?那就用接口模拟指针。
(这里就用C#的语法了,不使用JAVA了)
interface FactionFace{
void do();
}
class FactionFaceImpl1 : FactionFace{
public void do(){}
}
class FactionFaceImpl2 : FactionFace{
public void do(){}
}
Dictionary<int, FactionFace> dict = new Dictionary<int, FactionFace>();
dict.Add(1,new FactionFaceImpl1());
dict.Add(2,new FactionFaceImpl2());
int parm = 0;
if(dict.ContainKey(parm)){
dict[parm].do();
}
可以看出,实际上,上面的代码就是策略模式的简单实现了。(OH~~原理策略模式这么就来的~~)
可以看出,这里实际上是依靠一个字典来维护条件和调用的关系的。那如果没有这个字典来维护怎么办呢?代码再次演化:
interface FactionFace{
void do();
}
class FactionFaceImpl1 : FactionFace{
public void do(){}
}
class FactionFaceImpl2 : FactionFace{
public void do(){}
}
string parm = "FactionFaceImpl2";
FactionFace ff = Type.GetType(parm) as FactionFace;
ff.do();
OH~~这就是简单的反射了。再复杂一些就可以搞成工厂模式,插件模式了。
可以看出,用字典来维护映射关系就可以避免使用反射。(这个是不是一般规律,贫道没本事证明,起码这里是适应的。)
相关文章推荐
- 选择结构(if..else..,switch,try..catch..)的拆分
- 选择结构(if..else..,switch,try..catch..)的拆分
- 选择结构:switch...case与if...else
- C# 选择结构 if、if..else、if..elseif...else、switch
- Javascript:基本语句(if-else/switch/for/while/for-in/try-catch)
- 选择结构--if和switch语句
- Java (if else)(switch case)结构
- 选择结构if-else语句
- 黑马程序员------C语言-----流程控制(选择结构:if,switch)
- 浅谈选择结构if语句和switch语句的区别
- 重构第四天 : 用多态替换条件语句(if else & switch)
- 浅谈C语言 if else, switch, 条件运算符, 函数指针的选择问题
- Java 分支结构 - if...else/switch
- 黑马程序员——选择结构if、switch,循环结构while、do-while、for
- stackoverflow 上关于选择 switch 而不是 if / else 的讨论
- if-else和switch语句的区别,及选择。
- Java 分支结构 - if...else/switch
- switch语句与多重if选择结构的异同点
- java学习09--选择结构-switch练习、if和Switch使用比较
- 选择 | 循环 | 语句(if,if……else,switch,while,for)的理解和使用