Programming 版 (精华区)
发信人: SwordLea (飞刀李), 信区: Programming
标 题: 编码的境界——从MOC到COM(原创).7
发信站: 哈工大紫丁香 (2004年01月15日13:48:08 星期四), 站内信件
下面我们从便于修改、添加功能的角度去考虑代码的设计。
首先回顾一个前面提到的例子,就是打印命令行参数的那个:
void main(int argc, char *argv[])
{
printf("\n");
if (argc == 2)
printf("%s\n", argv[1]);
if (argc == 3)
printf("%s\n", argv[2]);
if (argc == 4)
printf("%s\n", argv[3]);
if (argc == 5)
printf("%s\n", argv[4]);
……
if (argc == N)
printf("%s\n", argv[N-1]);
else /* 没有参数 */
printf("%s\n", "ECHO is off.");
}
如果说把if语句改为case语句是一种改良,那么代码将会是这个样子:
void main(int argc, char *argv[])
{
printf("\n");
switch (argc)
{
case 1:/* 没有参数 */
printf("%s\n", "ECHO is off.");
break;
case 2:
printf("%s\n", argv[1]);
break;
case 3:
printf("%s\n", argv[2]);
break;
case 4:
printf("%s\n", argv[3]);
break;
case 5:
printf("%s\n", argv[4]);
break;
……
case N:
printf("%s\n", argv[N-1]);
break;
}
}
当然,在这里case语句并不是最佳解决方案,不难看出正确方法应该是
使用for循环,也就是这个样子:
void main(int argc, char *argv[])
{
printf("\n");
if (argc == 2) /* 没有参数 */
printf("%s\n", argv[1]);
else
{
for (int i = 2;i < argc ;i ++)
{
printf("%s\n", argv[i - 1]);
}
}
}
这个问题虽然简单,却给了我们一个启示,用case语句代替if语句并没有使
程序的可维护性得到很大的提高,真正能使我们摆脱编码的羁绊的良方是以代码
来维护代码,也就是引擎式的代码。
说到引擎,大家可能会联想到游戏引擎,比如传奇,比如cs. 我们不会天真
地认为cs里加一个关卡需要sierra公司的程序员们去修改代码、重新编译,因为
我们经常会主动、被动地得到不知道谁制作的游戏地图。为什么我们的程序不可
以写成引擎式的呢?如果还记得多年前的那个计算器程序,我们就用它来作例子
吧。在GUI 界面,我们布置了加、减、乘、除等按钮,上方还显示了一个漂亮的
EDIT控件,这就是主框架。假设我们能够让主框架与程序功能分离,即新功能的
添加不需要对主框架程序修改,那么这就是个引擎式的设计思想。
有人说“这怎么可能?”,有人则立刻就想到了DLL 方式。不错,动态链接
库方式是一种比较容易的实现手段。可是怎么才能让主框架程序识别并使用新加
入的功能模块呢?
(to be continue ...)
--
没有星光的夜晚,觉得自己象一只漂泊无依小舢舨,在
汹涌浪涛与暴风骤雨中挣扎着存活。划动着已经残破的孤桨,
听得见逝水的呻吟和凄泣,却看不见哪里是岸,哪里是曙色
天边,也不知道自己在前进,在后退,还是在沉沦……
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.246.232]
※ 修改:·SwordLea 於 01月15日13:49:30 修改本文·[FROM: 202.118.246.232]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.626毫秒