资深程序员之路(2)--如何保证代码是clean的

来源:互联网 发布:js target srcelement 编辑:程序博客网 时间:2024/06/01 10:43

究竟什么是“干净的”代码
在一定程度上,干净的代码——像漂亮一样——就是在旁观者眼中所留下的印象。有经验的程序员能够一眼看出程序的源代码并断定它是否是一个易读的代码。他们还能够很快地提出关于这个代码是否是高效,结构是否合理以及是否简单明了的意见。所有的这些特征都很难定义,但是当您把代码呈现给这些程序员时,您通常会很赞同他们对代码是否干净的判断。
决定干净代码的因素很多。有些是普遍性的,适用于任何类型的编程语言或者您所开发软件的问题领域。有些是干净代码的属性取决于特定的编程语言。
让我们快速浏览一下这两个能运行出相同结果的代码。这个代码是一个网球运动的记分规则。3 它们都有一个记录比赛中赢家分数的算法,和一个返回包含这个分数消息的算法。假设所有的输入都是有效的,并且没有对无效状态的核查。他们都是用契约式设计的方法编写的,因此所有正确使用这个类的担子都落在这个客户机程序上。您认为哪一个“更优秀”呢,列表1还是列表2?
列表1

列表2

列表1编写的风格非常简单,一个编程的初学者可能会这样用,看起来像是在重复它本身。这种复杂性完全没有必要,但是对我来说似乎很混乱而且效率非常低。列表2有很多复杂的条件,但是如果您了解Java就会知道它很容易理解。唯一可以让您有疑问的是在最后一个else if中条件的开始部分。结果证明当您获得这样的一个子句时,就有一个选手会赢。
这两个程序运行都没有错误。事实上,它们都很小,跟一个玩具例子差不多,因此除了用您的偏好来判断哪个代码更优秀外,这些列表还不足以用来说明干净代码的重要性。

我们为什么会编写出一些不干净的代码呢?
我认为有以下几个造成我们编写不干净或者冗长代码的原因:
时间压力
缺少训练
动机

做不好会有各种原因这里不展开了。需要的可以点击底部的原文链接来看。上面的例子比较简单,我再举一个笔者实际的例子,来讨论干净和易读之间的权衡。
这里写图片描述
这是某公司的员工年假天数计算表,根据员工的累计社会工作年限,在本公司的服务年限和员工类别,来计算天数。这个如果按照上面简单堆叠if语句的形式,一样是能够计算出来的,这里就不演示这种了,这里分享一下笔者的对于福利年休假的实现方式(法定年休假太简单确实3个if就可以了)。
这个计算笔者是放在了sql server的存储过程里面,所以下面的代码为sql 代码。

        DECLARE @gDays DECIMAL(18, 1)  = 0; --  福利年休假        DECLARE @worker varchar(100)  = '5,6,8,10,10,11,0,1,3,5,6,6,0,0,0,0,1,1';--生产线工人        DECLARE @profes varchar(100)  = '10,11,12,13,14,15,5,6,7,8,9,10,0,1,2,3,4,5';--专业人员及其他        IF ( YEAR(GETDATE()) - @firstYear =0 )--累计社会工作年限小于1年                BEGIN                    IF ( @staffType = 1 ) SET @tempInt=15--专业人员及其他                    ELSE SET @tempInt=10--生产线工人                    SET @gDays = CAST(((1- DATEPART(DAYOFYEAR, @joinDate) / @divInt)*@tempInt)/0.5+1 AS INT)*0.5--当年的全部年假*在职的天数/365                END;        ELSE                BEGIN                    SET @tempInt=YEAR(GETDATE())-YEAR(@joinDate)--计算在本公司服务年限                    IF(@tempInt>6) SET @tempInt=6--第6年起按第6年算                    SET @tempInt+=(YEAR(GETDATE()) - @firstYear)/10*6 --计算福利年休假所在位置                    IF ( @staffType = 1 ) SET @tempStr=@profes --设置从生产线工人还是专业人员取数                    ELSE SET @tempStr=@worker                    SET @gDays = CONVERT(DECIMAL(18, 1), dbo.Get_StrArrayStrOfIndex(@tempStr,',',@tempInt)) --取天数

这里面把两种类型员工的福利年休假都存进了逗号分隔的字符串中,这样方便分拆进数组,根据累计社会工作年限,在本公司的服务年限的逻辑来计算数组中的位置,并取对应的值。(Get_StrArrayStrOfIndex这个函数是把一个字符串按’,’分拆,并取第几个值)

这种方式逻辑性很强,但是只要逻辑通了,很容易查错和维护,比几十条if语句容易多了。笔者认为这是clean的一种形式,逻辑难并不意味着不易读,尤其是在有注释的基础上。

参考链接:https://www.ibm.com/developerworks/cn/rational/rationaledge/content/dec06/pollice/

原创粉丝点击