看似简单但容易忽视的编程常识

这些年写了很多的代码、也读过很多的人写的代码,这几年,写代码的机会越来越少,但是每次写代码,感觉需要思考的东西越来越多,好的代码确实难能可贵,在国内业界中,好的软件不少,但是好的代码确实有点凤毛麟角了,写得出来的人不多,有追求的也不多,看到的好的代码越来越少。

可能是因为每个人对于好的评判标准不一,程序员中,也不乏文人相轻的较劲,总觉得比人写的代码都不够好,我不想介入这些无谓的争论,这篇文章中,我将结合我的编码经验,探讨一下,如何写出设计优良的代码,希望作为大家的参考。

好的代码首先是逻辑正确的

如何用编程语言表述正确的代码逻辑,这个问题好像很少有人单独拎出来讲,因为这个问题的答案很简单,简单得你都懒得去思考它,因为你肯定觉得,用编程语言正确的表述代码逻辑无非就是if、while之类的东西,有什么好探讨的,其实我要分享的并不是这些关键词的本身在逻辑中表达的含义,而是这些关键词的背后,编写程序的过程中,是否真的认真思考过背后的逻辑。我曾不止遇到过很多有年编程经验的程序员,犯下类似的错误,也见过很多年轻的同学,反复强调纠正后,逻辑上还是会漏洞百出,这几年,我会经常组织我组里面的同学对代码进行走读,总结这些编码中的逻辑错误,很大一部分也是因为编程逻辑背后的思考是不够的。所以我要讲的,是很简单的知识,但是往往是最容易忽略的思考点。

我先给大家看一个例子:

这段代码为的目的是判断userInfo不为空串的时候couponing,看起来这段代码非常简单,判断上似乎还算比较严谨,其实这段代码只是看到了眼前要做的事情,但是并没有看到整体逻辑,

if(userInfo!=null){

//给用户派发一个单位的优惠券

couponing(userInfo,);

}

为什么这么说呢,请看下面几行代码,也许会引发最这个简单问题新的思考。

if(userInfo==null){

//思考尝试恢复不存在的userInfo情况

userInfo=fetchUserInfo(userId);

}

if(userInfo!=null){

couponing(userId);

}else{

//思考userInfo不存在的情况下,是否是符合整体的业务逻辑,如果整体上不符合业务逻辑,应该立刻异常终端程序。

thrownewRuntimeException(userInfonotexist.);

}

这段代码虽说相比之前的代码长了一些,但是反映出来的是逻辑思考的严谨性,从这两个例子比较我们可以很明显的感觉到,第一段代码的问题,我们看到的只是为了保护是否能做couponing的条件,但是并没有去思考,条件不满足的时候,如何去做,是否有能力去恢复这个错误,确实无法恢复的时候,我们是否还要在错误的道路上越错越远呢,这一点非常重要,也很容易忽略,需要在编码的过程中,进行完整的思考才会意识到这个问题的,如果让错误继续执行下去,直到程序运行到下一个我们不期望的点,如果下一个不期望的点,代码上也遵循这个风格,简单的判断不为null,就跳过执行,这样下去,就会有无穷的隐患,代码整体上看上去,就漏洞百出了。所以从这里要给大家一个建议:

我们应该都知道,错误越是早发现越好处理,其实程序在执行过程中也是一样的,越早发现错误,执行中就越容易处理。我一般称这种代码为代码的盲目容错,看上去这行代码很健壮,不会报错,但是不报错,不能影响错误的客观存在性,错会还是会存在的,遇到错误的时候,我们应该首先想到的是恢复这个错误,对容错问题,是需要进行非常深入很全局的思考才能做的决定,盲目的容错,只会让情况变得更加不可控制。

这一小节只是拿一个小例子来说明我们需要有更多的思考,介绍到这里,我相信大家都理解这些思考的重要性了,但是最关键的问题我还没有给大家说清楚,就是如何保证我们的思考是完整的。我给大家介绍一个我朴素有效的方法,这也是我在做CodeReview中最能发现问题的方法,当然了这边也可以建议大家去看看这套设计模式,讲解如何重构的教程




转载请注明:http://www.aierlanlan.com/rzfs/4326.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了