软件代码设计零碎杂想-2
2010-07-23 19:49
204 查看
想到一个极端的例子,主要是想说如何提取变化的东西和设计的取舍。
先看一个题目:考试分数为百分制,请将给定的分数进行分类,分类规则是
[0,60) 不及格
[60,70) 合格
[70,80) 良好
[80,90) 优秀
[90,100] 杰出
嗯,题目简单,做法也很简单,如下,简便起见,假设分数为整形:
char* get_result(int x)
{
if ( x < 60 ) return "..";
else if ( x < 70 ) return "...";
else if ( x < 80 ) return "....";
else if ( x < 90 ) return ".....";
else return "....."
}
以这个简单的例子,说明一下抽象的思想。一个规律,凡是用到了if else 的地方,就有抽象可以派上用场。我来过度设计一下,变成这样的:
struct score
{
virtual char* result()=0;
};
struct score_bad : public score
{
char* result(){ return "bad";}
};
struct score_yes : public score
{
char* result(){ return "yes";}
};
....
score* get_score(int x)
{
if( x< 60 ) return new score_bad;
else ( x< 70 ) return new score_yes;
...
}
char* get_result(int x)
{
score* s = get_score( x );
return s->result();
}
有的人说,有的时候,用if只是简单判断下参数是否正确而已,可以像上面进行抽象么?如:
int abc::get_xyz(int x)
{
if ( x < 0 ) return -1;
set(x);
draw(x);
y=x+1;
return 0;
}
当然可以过度设计一把。
struct doer
{
virtual int do()=0;
};
struct error : public doer
{
int x;
error(int _x) : x(_x){}
int do(){return -1;}
};
struct yes:public doer
{
int x;
abc* a;
yes(int _x,abc* _a):x(_x),a(_a){}
int do()
{
a->set(x);
a->draw(x);
a->y=x+1;
return 0;
}
};
int abc::get_xyz(int x)
{
doer* d = x < 0 ? new error(x) : new yes(x,this);
return d->do();
}
嗯,这里好像用上了一个简单工厂模式,根据输入的参数不同,返回不同的产品。这里都把产品抽象了一下。虽然过度设计的厉害,但是实际上思想都差不多的。
先看一个题目:考试分数为百分制,请将给定的分数进行分类,分类规则是
[0,60) 不及格
[60,70) 合格
[70,80) 良好
[80,90) 优秀
[90,100] 杰出
嗯,题目简单,做法也很简单,如下,简便起见,假设分数为整形:
char* get_result(int x)
{
if ( x < 60 ) return "..";
else if ( x < 70 ) return "...";
else if ( x < 80 ) return "....";
else if ( x < 90 ) return ".....";
else return "....."
}
以这个简单的例子,说明一下抽象的思想。一个规律,凡是用到了if else 的地方,就有抽象可以派上用场。我来过度设计一下,变成这样的:
struct score
{
virtual char* result()=0;
};
struct score_bad : public score
{
char* result(){ return "bad";}
};
struct score_yes : public score
{
char* result(){ return "yes";}
};
....
score* get_score(int x)
{
if( x< 60 ) return new score_bad;
else ( x< 70 ) return new score_yes;
...
}
char* get_result(int x)
{
score* s = get_score( x );
return s->result();
}
有的人说,有的时候,用if只是简单判断下参数是否正确而已,可以像上面进行抽象么?如:
int abc::get_xyz(int x)
{
if ( x < 0 ) return -1;
set(x);
draw(x);
y=x+1;
return 0;
}
当然可以过度设计一把。
struct doer
{
virtual int do()=0;
};
struct error : public doer
{
int x;
error(int _x) : x(_x){}
int do(){return -1;}
};
struct yes:public doer
{
int x;
abc* a;
yes(int _x,abc* _a):x(_x),a(_a){}
int do()
{
a->set(x);
a->draw(x);
a->y=x+1;
return 0;
}
};
int abc::get_xyz(int x)
{
doer* d = x < 0 ? new error(x) : new yes(x,this);
return d->do();
}
嗯,这里好像用上了一个简单工厂模式,根据输入的参数不同,返回不同的产品。这里都把产品抽象了一下。虽然过度设计的厉害,但是实际上思想都差不多的。
相关文章推荐
- 软件代码设计零碎杂想-1
- 软件代码设计零碎杂想-6
- 软件代码设计零碎杂想-3
- 软件代码设计零碎杂想-5
- 软件代码设计零碎杂想-4
- 界面代码分离的软件设置界面设计
- 多通道软件同步——代码设计
- 最近设计了一个生成asp代码的程序,同时也可以作为数据库管理查询的软件,有兴趣的朋友可以去下载!
- 多通道软件同步——代码设计
- 代码大全--软件构建中的设计
- 软件系统性能设计之七代码性能设计
- SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则
- 通过读代码学习软件架构设计
- 如何将算法翻译成代码,软件设计实践,一个B Plus Tree算法实现(未完待续)
- 嵌入式软件设计之提高代码可移植性
- 代码大全(五)-- 软件构建中的设计
- EasyJWeb作为一个快速Java Web MVC框架,其设计目标不尽是要简化软件开发人员的代码书写工作,更是要能方便界面设计人员的工作。
- web标准设计工具:代码本地校验软件A Real Validator(附注册码)
- SoC嵌入式软件架构设计之三 :代码分块(Bank)设计原则
- 代码大全第二版读书笔记 第二部分-创建高质量的代码 五、软件构建中的设计