如何编写好的代码?

大多数时候,我们都在想怎么编写出好的代码,大多数时候我们都在为之前写过的代码懊恼,但从事另一项工作时,犯同样的错误,这其实是自己的编程思维意识不够。

下面将从命名,函数,站在读者的角度上等多个维度讲述如何编写好的代码。

1、命名

涉及到多个地方,是项目中最普遍也是最头疼的一件事。原则:在命名之前多想一下读者看到这个命名会不会产生误解。

原则1 精准和准确的命名

结合名称所代表的含义或值所代表的含义来命名



原则2 很多程序都有表示计算结果的变量:总额、平均值、最大值,等等。如果你要用类似Total、Sum、Average、Max、Min、Record、String、Pointer这样的限定词来修改某个名字,那么请记住把限定词加到名字的最后。




原则3 嵌套循环的迭代变量的命名尽量表明其含义,而不是使用i,jk

如果循环下标变量只在循环内部使用,那么如此使用是没问题的,但是,如果该变量需要在循环之外使用,那么就应该为它取一个比i,j,k更有意义的名 字。举个栗子,如果你从文件中读取记录,并且需要记下所读取记录的数量,那么类似于redcordCount这样的名字就更合适:

recordCount = 0;
while ( moreScores() ) {
    score[recordCount] = GetNextScore();
    recordCount++;
}

// using recordCount

另一种情况就是嵌套循环,比较常犯的错误就是在想写j的时候写了i,想用i的时候却写了j。

如果你使用了多个嵌套的循环,那么就应该给循环变量赋予更长的名字以提高可读性:

for ( teamIndex = 0; teamIndex < teamCount; teamIndex++) {
    for ( eventIndex = 0; eventIndex < eventCount[teamIndex]; eventIndex++) {
        score[teamIndex][eventIndex] = 0;
    }
}

原则4 对仗词使用得当

变量名中的常用对仗词

对仗词要使用正确,不然会产生歧义。

常用对仗词如下:

  • begin/end
  • first/last
  • locked/unlocked
  • min/max
  • next/previous
  • old/new
  • opened/closed
  • visible/invisible
  • source/target
  • source/destination
  • up/down


原则5 临时变量的命名也应该清晰的表示其含义

临时变量常用于存储计算的中间结果,作为临时占位符,以及存储内部值。它们常被赋予temp,tmp,x或者其他一些模糊且缺乏描述性的名字。通 常,临时变量是一个信号,表明程序缘还没有完全把问题弄清楚。而且,由于这些变量被正式地赋予了一种“临时”状态,因此程序员会倾向于比其他变量更为随意 地对待这些变量,从而增加了出错的可能。

警惕临时变量

临时地保存一些变量是很有必要的。但无论从哪种角度看,程序中的大多数变量都是临时性的。把其中几个称为临时的,可能表明你还没有弄清它们的实际用途。看看下面的示例:

temp = sqrt( b^2 - 4*a*c );
root[0] = ( -b + temp ) / ( 2*a ); root[1] = ( -b - temp ) / ( 2*a );

更好的做法:

discriminant = sqrt( b^2 - 4*a*c );
root[0] = ( -b + discriminant ) / ( 2*a ); root[1] = ( -b - discriminant ) / ( 2*a );


原则6 布尔变量的命名

典型的布尔变量名:

  • done
  • error
  • found
  • success/ok

给布尔变量赋予隐含“真/假”含义的名字。像done和success一样,它们的值不是true就是 false,表示某件事情完成了或者没有完成;成功或者失败。另一方面,想status这样的名字却是很糟的布尔变量名,因为它们没有明确的true或者 false。status是true反映的是什么含义呢?表示某件事情拥有一个状态吗?然而,每件事情都有状态。true表明某件事情的状态是OK吗?或 者说false表明没有任何错误吗?对于status,你什么都说不出。

为了更好的效果,可以把status命名为error或者statusOK。

有时,也可以在布尔变量名前加上Is。这样,变量名就成了一个问题:isDone?isError?isFound?用true或false回答问 题也就为该变量给出了取值。优点是不能用于那些模糊不清的名字,比如:isStatus?毫无意义。缺点就是降低了简单逻辑表达式的可读 性:if(isFound)的可读性要略差于if(Found)。

使用肯定的布尔变量名。避免双重否定:not notFound。


与语言无关的命名规则的指导原则

  • 区分变量名和子程序名字
  • 区分类和对象
  • 标识全局变量
  • 标识成员变量
  • 标识类型声明
  • 标识具名常量
  • 标识枚举类型的元素
  • 在不能保证输入参数只读的语言里标识只读参数
  • 格式化命名以提高可读性







Java编程风格指南:
http://www.hawstein.com/posts/google-java-style.html
http://www.cnblogs.com/Javame/p/3513670.html
http://download.csdn.net/detail/freakwiko/7865715
http://www.cnblogs.com/bluestorm/archive/2012/10/04/2711540.html
http://www.oracle.com/technetwork/java/codeconventions-150003.pdf
http://www.oracle.com/technetwork/java/codeconvtoc-136057.html




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来了就走下去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值