如何编写高质量代码

编写高质量代码有一个很好的经验法则:任何人都可以像读文章一样阅读代码,一切以牺牲可读性为代价的编码,都是拙劣的写法。

注意事项

思考在前,动手在后,写一次想两次。

遵循最佳实践。

使用代码质量管理工具,如:Sonar插件(SonarLint),支持常见IDE。

尝试编写通用代码。

为程序命名不要与众所周知的API起冲突,如:isEmpty,isNull或isNotNull。

使用IDE的快捷重构

大面积替换时,尽量使用IDE Refactor Tool,防止遗漏与拼写错误。做代码分解时,使用IDE的快捷重构(Refactor Tool)功能,而非复制和粘贴。

类名

类名应是名词,单词首字母应大写。编写新类之前先作全局搜索,项目中可能已存在此类文件。很多时候,会发生不同的类具有相同的功能,不易管理且容易产生误导。

已存在                 新创建

AppUtil               ApplicationUtil

ConfigutationUtil     ConfigurationHelper

LoggerUtil            LoggerHelper

类名应足够清楚准确的描述核心功能。

不提倡                    提倡

PersonRestApi             PersonController

PersonRest                PersonController

PersonImplementation      PersonService

使用适当的访问修饰符。package命名也非常重要,把正确的文件放在正确的地方,不把常量文件放在util包中。

方法

方法名是动词,应遵循驼峰原则,比如:doWhatToDo(),而不是doWHatTODO()。一个方法的长度不应超过30行,相反,就是在增加方法的复杂性。在定义方法之前,考虑它应具有某种意义,或是为特定任务所创建,例如createPerson或sendMail。

方法不应同时包含多个任务/功能。若方法名为:createPerson,那么,它只用于创建Person,别无其他。通常,会见到如下的万金油写法:

public Long createPerson(PersonVO personVO) { 
    1.Appointment appointment = trying to getting an appointment from DB.
    2.then performing if else over the result of appointment.
    .
    .
    .
    .
    14.then updating something on the basis of some condition.
    15.then finally creating person.
 }

很多时候,开发人员在一个方法中放入100-300行代码,已超出了方法的极限,使代码变得可怕和难以理解。很多时候,开发者会觉得这是在优化代码的调用效率,其实完全没必要;这种调用优化是HotSpot VM的强项。尝试在单独的方法中组合多个方法。

public  Long  createPerson(PersonVO  personVO){
  appoitnmentValidation();
  updatesSomething();
  creating person code;
 }

变量

变量名应遵循驼峰原则:isTrue,userService,personName和localServiceRerpository。除个别情况外,不应使用一个字符作为名称。不应该以_和$开头。在定义变量名称之前先想一想。不应使用过长的变量名。

常量

尝试使用类来定义常量,而不是接口。将Class标记为final。在常量类中创建一个私有的构造函数,防止对其创建实例。若有一个常量列表,应通过以下方式的注释,对常量进行隔离是个好主意。会使搜索更容易。

/**** Cache ****/
public static final String CACHE_NAME = "personCache";
/**** Attributes ****/
public static final String NAME = "name";
public static final String MOBILE = "mobile";
/**** Configuration ****/
public static final String APP_NAME = "PersonDemo";
public static final String APP_VERSION = "1.0";

常量命名应是非常具体的,应全部大写,且用下划线_分隔,比如APP_NAME,而非appName。

代码逻辑

避免if else多层嵌套,尝试编写通用代码。不止要使用日志记录异常,还应适当的抛出异常消息,或把异常来打印出来。

通用代码

在项目重构时,应被剔除的冗余代码。假设,有一个表示邮件的POJO类,与发送邮件相关的类。需要遵循以下步骤:

1、创建一个POJO对象,使用setter选择要发送的数据。

2、编写发送邮件的代码,如下所示:

创建对象:

MailDraft mailDraft = new MailDraft();

设置数据:

mailDraft.setTo(); 
mailDraft.setBody(); 
mailDraft.setMessage();

发送邮件逻辑最少有4行,所以共有9-10行代码。若需要在多处发送邮件,在单独的方法中编写邮件发送逻辑,每个邮件业务都调用该代码。