防御式编程
编程技术  /  houtizong 发布于 3年前   104
防御式编程是一种主动预防问题的编码风格,作为一种编程实践,防御式编程是由很多小目标融合而成的,例如编写具有可读性的代码、正确的命名规则、检查所有函数的返回值、以及运用设计模式。在防御式编程里,细节决定了一切。自底向上的方法让整个应用程序更加健壮、更加正确、以及更具有更佳的可扩展性。说白了,防御式编程基本上就是由各种常识性的实践所组成的。比如下面的这个表达式:
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--;
}
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接