程序是一种很严密的东西,美国航天局因为程序中的一个标点符号导致了一次航天的失败,这就是程序的严密性带给我们的警示。
程序的严密性在于程序的逻辑,不能有遗漏,更不能有错误,程序的错误相对于遗漏,更容易被发现,程序的逻辑遗漏总是在我们的编程当中给我们制造了很多的麻烦。
看一段很简单的代码,实现根据输入的数字,显示月份:
if(month==1)
{
return "January";
}else if (month==2)
{
return "February";
}
...........
}else if(month==12)
{
return "December";
}
这个程序再简单不过了,相信每个程序员不用三分钟就能写完,然而,上面的程序写完了吗?很显然没有,如果用户输入的是13应该如何?如果用户输入1.5,应该如何?可能你会说:谁会傻到输入13月啊!有人就会,程序员一定不要觉得某种情况永远不会发生而遗漏这种可能性,如果真的就有人输入13了,那么这个程序是没有返回结果的,也就是NULL,而调用它的程序很可能因为这个NULL导致崩溃,从而引发一系列的问题,所以,我们需要在这段代码最后,写上else {return "Error"}。
上述问题就属于百密一疏。你想到了一百种情况,可是遗漏了一种情况,那么程序也是错误的,这种错误带来的问题和语法错误同样致命,而且极难发现,要求程序员在编写程序时格外小心。
可能你会说:这么简单的逻辑谁会遗漏啊。如果逻辑再复杂一些呢?我总结这个问题是因为我遇到了很多次逻辑不严密的情况,最典型的就是JSP中的Get和Post方法。
在Servlet中,有两种处理函数,一种是doGet,一种是doPost,这两种方法处理客户端不同的请求,而我发现,很多人(不是一个),只写其中一个函数,也就是只写doPost,doGet函数是一片空白的。我问他说为什么不写doGet函数,他说我前台调用这个页面时就是用的Post方法啊,为什么要写Get方法?这是一种思维定势,他觉得自己不会用Get方法请求这个地址,理所当然其他人也不会,这就是典型的百密一疏,你在用自己的主观想法遗漏了程序本应该存在的逻辑。后来程序果然出问题了,我找到doGet函数,写上依据代码,那就是doPost(request,response);问题迎刃而解,而他也终于在焦头烂额之后意识到百密一疏的重要性。
像这种情况,一般我来写的时候,首先写上两个函数,然后在doGet函数里面直接写上doPost,然后再写doPost函数,我管你前台使用什么方式调用,我只用一段代码来回答你。
在编程的过程中还有很多这样的情况,而每次基本上都是直到最后百密一疏带来很多问题的时候我们才去认真的慎思程序的逻辑,为什么不在刚开始的时候就将这种潜在的隐患扼杀在摇篮里呢?其实如果稍微仔细一点,这种问题很容易避免,可是有人就是不在意。同样是写程序,有人写得好,有人写得差,区别就在于这点滴的细节。
这个问题很多人都会遇到,通常一段程序完全可以暴露出一个人的思维过程以及这个人的性格习惯等等,不可小觑
@xiaoman 使得,这也正是这个坏习惯难以克服的地方
"很多人(不是一个)"我就是其中之一。哈哈,谨记教诲!
@Hope 在你之前我就遇到过,我看到你也犯这样的错误,才意识到问题的严重性
@老杨 嘿嘿,下不为例!
其实和设计网页是一样的,就像我上次提供的模板,就是因为少了一个CSS隐藏属性,如果评论字数过多,会导致错位是一样的道理
@卢松松 是的,网页设计也是编程,不过语言不同而已,这种东西是一通百通的
“百密一疏”,总结得很到位哦~~大家很多时候总以细心或者粗心来简单的总结自己的失误或者遗漏,在我看来有一点点为自己找借口的嫌疑。看了你这篇文章,我得好好培养自己的习惯~~
@sunshineyxp 你做的已经很不错了
呵呵 程序员的要求就是逻辑严谨。
@chanthon 你也写过程序么?
@老杨 没有。。呵呵我是程序门外汉。