防御式编程

       防御式编程是一种主动预防问题的编码风格,作为一种编程实践,防御式编程是由很多小目标融合而成的,例如编写具有可读性的代码、正确的命名规则、检查所有函数的返回值、以及运用设计模式。在防御式编程里,细节决定了一切。自底向上的方法让整个应用程序更加健壮、更加正确、以及更具有更佳的可扩展性。说白了,防御式编程基本上就是由各种常识性的实践所组成的。比如下面的这个表达式:

    price=price*1.05;

      这条语句有一个很明显的问题.它的可读性很差,是糟糕的编程实践和常识性问题的典型例子.它的问题就是数字1.05。这个数字的上下文是什么?1.05可以表示价格数量、税率、服务费用、甚至可以是版税。这个数字的上下文是非常重要的。如果不理解这一点的话,维护程序员就有可能不适当地修改这个公式或是错误地使用其结果。类似上面公式里的这类数字是很难优化的。这是第二个问题。而下面的代码就是一个防御编程的绝佳范例。它不但修正了前面提到的两点问题,同时还是一段很好的自然描述代码。

    price=price*priceIncrease;

      程序自己是不会出错的。一个正确的程序到了明天、下个礼拜、乃至几年以后仍然是正确的。而无论何时何地,引入代码问题的只有程序员。正确的代码需要程序员遵守严格的纪律。防御式编程正是这样的一组编码标准,为创建正确的代码提供了稳定一致的程序员纪律。在很多的到时候,防御式编程可以预防那些由于疏忽造成的问题。比如如下代码:

    if(a>5)

     a+=5;

     上面的 if 语句为真时要执行的语句是(a+=5;)。防御式编程要求这句应该放在一个代码块里。这不但是强制的,而且也是非常重要的。如果不这么做的话,程序员可能会给它加上第二条语句却忘了代码块。这样的代码还是可以通过编译的。但是你就在应用程序里引入了一个很难发现的bug。严格的测试有可能(但是不一定)发现这个问题。这个例子展示了细节对于防御式编程的重要性。下面是修正后的代码:

    if(a>5){

      a+=5;

    }

       防御式编程需要有合理理由的最后期限。你必须有时间去思考如何编程。把编程完全当做是一项技术过程的想法绝对是一种谬误。优秀的程序员很有创造性的,他们需要时间来进行分析和创新。太短的期限只会压迫思考的时间和降低创造力。你应该考虑在项目计划里加入一个叫做“思考”的任务。要是怕老板会皱眉头的话,可以给它其一个华丽的名字,比如通过坚实的应用程序探索未来的受益,或者写上在员工休息室里打游戏机也行。

防御式编程会增加应用程序的代码量。但是产品开发的目的是什么:更少的代码还是正确的代码--特别是当性能区别不是那么大的时候?无论如何,可以证明的是,客户更喜欢正确的代码,而不是一个好像快了那么一点点的应用程序。“在所有情况下都要假设会发生最坏的事情”是防御式编程里非常重要的信条之一。最糟糕的问题就是程序员假设它们不会发生。代码应该考虑到所有的问题。例如,在switch语句里一定要有 default case,就算它发生的可能性微乎其微。最坏的也就是default case 里的错误处理代码永远不会被执行。而最好的情况时,你正确处理了将来可能会发生的问题。

 

        防御式编程和C#

       C#的设计里随处可见防御式编程的影子。C++就像是西部荒野一样,基本上可以让你为所欲为。程序员在C++里有很大的灵活性,这是一把双刃剑。程序员手上有太多的控制权,有些人根本驾驭不了。C#正是试图想要控制C++里这种太过自由的局面。这样,程序员就能更加专注在解决商业问题上,而不用在语言细节上纠缠不清。赋值问题就是最佳例证。在C++里,下面的代码是合法的:

    int a=5;

    if(a)

    {

        //Do whatever

    }

       在C++里, true 是非零值,零代表 false。这表示整数值可以代替布尔可以出现在上面这样的表达式里。虽然用整数值代表布尔值可以说是相当的灵活,但是使用不当的话也很容易产生错误。原因之一是程序员会忘记规则。true和false 的定义在不同的语言之间有所不同,即便是经验丰富的程序员有时候也会混淆。而且,这个代码的可读性也不好。在C#里,布尔表达式限制在布尔值里(true或者false),这样显然更加清晰。清楚的表述可以防止问题的出现。这是在C#强制防御式编程的例子之一。这是另一个例子。下面的代码在C++里是合法的。控制转移语句(比如break语句)在每一个case语句里并不是必须的。因此,下面的代码可以很巧妙地计算出阶乘。C#在每个case语句之间都要求有控制转移语句,所以这样的代码是无法编译的。为什么?因为在switch块里遗漏break语句是一个常见的C++错误。在C#防止这类错误是防御式编程的一种形式。

    int factorial=s;

    int result=1;

    switch(factorial){

        case 5: result*=factorial--;

        case 4: resault*=factorial--;

        case 3: resault*=factorial--;

        case 2: resault*=factorial--;

    }

 

注:该文转载于:http://blog.qq.com/qzone/732397741/1273309817.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值