您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > C/C++ > 正文
可怜的Bool——浅析程序可扩展性
[文章信息]
作者:Oversense
时间:2004-04-16
出处:论坛
责任编辑:方舟
[文章导读]
哎,真困!喝点咖啡,靠在我的小椅子上,看看我的代码
advertisement
热点推荐
· IE最新安全漏洞补救几大措施
· M牛的网络生活之下载篇
· Norton Ghost 9.0全新体验
· InstallShield简明使用教程之前言
· Linux系统的硬件驱动程序编写原理
[正文]
天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。

  嘿嘿...今天的活比较爽!前几天写了点破程序,今天改改就搞定了。

  哎,真困!喝点咖啡,靠在我的小椅子上,看看我的代码...

  神奇,这是啥?



void f()
{
TextHandler t;
t.sendText("Hello, world", true);
// ...
}

  后面那个true是什么东东?翻翻定义:

class TextHandler
{
public:
void sendText( const std::string & msg,
bool sendNewLine );
//...
};

  喝点coffee,我想起来了,true表示sendText函数自动加上一个回车换行,我怎么忘了?

  难道是我笨?我陷入迷茫的沉思...

  砰!!!的一声巨响,我一慌张,嘴里的咖啡差点喷出来,还好我嘴紧。一定是Guru合上了她的什么大头书。我转向她,挤出一点微笑。她手里拿着一本不到一百页的小册子。神奇,这么小的书弄得这么响,她是怎么弄得?

  显然,她什么都知道了。

  "我的宝贝!如果你这么快就忘了参数的含义,那么当其他程序员第一次看你的代码的时候,他怎么明白你要表达的意思呢?"

  "嗯,是啊" 我咕噜道 "但是在IDE里面,他只要把鼠标移到函数上,他就可以看到参数说明了啊!"

  "有些IDE如此,并非全部,甚至不是大多数!我说过很多次,源代码最主要的用途是用来交流,对意图的交流。我手中这本古老的,令人尊敬的卷册阐述了交流的艺术。在这儿,它写道,'使用明确,详细,具体的语言'[1],你代码中的bool与此无缘,他不能传递任何有用的信息给读者。 "

  "不哈,一旦他知道这个bool是什么意思,就很容易记住了哈!"我中气不足的说。

  Guru用她美丽而坚定的蓝眼睛盯着我,我心里扑通扑通跳起来。

  "你多久以前写的这段代码?"Guru很温柔的说道--那种我喜欢的温柔。

  "嗯,好,嗯,那如何改正呢?"我巧妙的回避她的问题。

  "你不能另外想一种方式去表达你的意图吗?"她也不直接回答我,我们就好像在煎鸡蛋。

  "我可以不要第二个参数,让用户自己加 '\n' 好了。"我边说边写:

{
t.sendText("Hello, world\n");
}

  "如果传递给sendText是一个变量呢?" Guru问。

  "那就这样好了"

{
t.sendText( variable );
t.sendText( "\n" );
}

  我抬头看到Guru脸色不善,赶紧说道:

  "那就这样,我提供两个函数"

void sendText( const std::string & );
void sendTextWithNewLine( const std::string & );

  "没有其他的办法了吗?"Guru思考的时候,微微皱眉。

  哎,看来我今天不要想轻松溜走了,我一阵猛想......什么也没想出来,我投降了,"就这样吧!"

  "关于你的问题,你还要认识一点" Guru写道:

void displayText( const std::string &,bool applyItalics, bool applyBold );

void f(){
displayText( "This is bold but not italic",true, false );
}

  "如果一个程序员要用斜体显示文字,但是弄错了参数顺序,那么这些文字就要用粗体显示了,而且
显然编译器无法发现这个错误。"

  "如果Bob拿到了这段代码,改变了参数的顺序,一种叫做'Permute And Baffle'的技术[2]。会怎样?"

  "显然,问题多多的displayText不能得到 '明确,详细,具体' 的参数。"

  "现在来看你的问题,你的第一个方案,因为displayText需要其他参数而没法用。你的第二个方案,
可以工作,但是如果displayText需要很多信息,比如颜色,字体等,你是不是要提供如此多的函数呢?"

  "所以,我们可以用enumerated."

  "Enumerations?"我奇怪的说。

  "是的,Enumerations在这儿能得到很好的应用,看,"

class TextHandler
{
 public:
  enum NewLineDisposition { sendNewLine, noNewLine };
  void sendText( const std::string &, NewLineDisposition );
};

void f()
{
 TextHandler t;
 t.sendText( "Hello, ", TextHandler::noNewLine );
 t.sendText( "world", TextHandler::sendNewLine );
}

  "这种写法很好,这段代码现在self-documenting了,不需要注释,意图和结果都很清楚。看的人不需要去查找函数的定义了。"

  "而且,这种写法有很好的扩展性,如果你需要只加一个回车,你只需要在enumeration中加上prependNewLine就可以了,现有的代码无需任何改变。"

  "不要抛弃你第一个方案,宝贝。在有的情况下,他是最优的。"Guru转过身,重新打开那本书,优雅而轻快的走开,消失在拐角处。

  注解:

  [1] William Strunk Jr. and E.B. White. The Elements of Style (MacMillan Publishing Co. Ltd,

1979).

  [2] From Roedy Green's "How To Write Unmaintainable Code,"

<http://mindprod.com/unmaindesign.html>. (Primarily aimed at Java programmers, it still has
lots of relevance for C++ programmers.)

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 深入解析C++中的三个修饰符
  • C++虚函数和动态联编技术分析
  • C++开发中数据结构和算法的分离
  • 给C++初学者的50个忠告
  • 深入剖析C++重载函数的应用
  • 详解11月三大硬件杀手游戏及四大凶器
  • 选硬盘 用好希捷互动存储专家
  • NDS十大最受期待游戏
  • 中国星际个人联赛第6轮综述
  • 教你破解GeForce6800变Ultra
  • 魔兽UD必胜的几大原因
  • 韩国OnGameNet职业联赛最新战况
  • 买LCD有秘诀 两绝招识别坏点
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索