写高质量的代码,永不言晚!
作者 | Nitesh sharma
译者 | 弯月
责编 | 郭芮
出转载自 CSDN(ID:CSDNnews)
以下为译文:
在如今这个时代,每个人都在努力提升资源能力。在Web应用程序方面,我们有Spring、Play和Struts等框架,这些框架可以帮助我们构建具有可扩展性和可管理性的软件。这些框架提供了许多样板代码,所以你无需在应用程序中再写这些代码。
不过,写代码并不难,但是写高质量的代码却很难。
作为开发人员,在日常工作中我们也应该遵循相同的基本原则。我们应该将工作完成得尽善尽美,不能将任何错误留给客户。很多时候,迫于压力开发人员会编写管理不善或复杂的代码。为了编写高质量的代码,有一条经验法则是写出的代码应该让所有人都能当作短语一样阅读。
写代码时应当牢记的事情
多想少写,在写之前深思熟虑;
遵循最佳实践;
使用SonarQube等代码质量工具,或者如果使用eclipse或IntelliJ等IDE的话,也可以使用Sonar插件(SonarLint),这些都可以轻松入手;
尽量编写通用的代码;
不要自行创建API中存在的isEmpty、isNull或isNotNull等方法,许多有名的开源库(比如Apache)都提供了定义良好的方法;
使用IDE的重构工具,并了解其快捷方式:
public void doSomething ( ) {
Line1 ....
Line2 ....
Line3 ....
Line4 ....
Line5 ....
}
如果你想抽取1-4并创建一个单独的方法。常见的做法是:复制,创建一个方法,然后将复制的行粘贴到该方法中;总共需要3-4步。在做这样的任务时,你可以使用IDE的重构工具(而无需复制粘贴)。
重构工具有许多重要的功能,包括:
将一段代码从一个位置移动到另一个位置;
从其他地方抽取一段代码,然后创建一个方法(如上例所示);
重命名文件,变量或方法,注意,如果你手动做这个任务,那么就需要手动修改所有的地方;
尽量编写正确的测试用例(可选)。
编写类
类名应该是名词,每个单词的首字母都应该大写;
在编写新类之前,搜索项目中是否存在这样的文件。很多时候,我们会发现我们以不同的名称创建了相同的文件,这会误导项目和其他开发人员。例如:
已存在 | 新创建 |
AppUtil | ApplicationUtil |
ConfigutationUtil | ConfigurationHelper |
LoggerUtil | LoggerHelper |
通过类名完整地描述的功能;
不恰当的类名 | 恰当的类名 |
PersonRestApi | PersonController |
PersonRest | PersonController |
PersonImplementation | PersonService |
使用适当的访问修饰符;
文件的打包也非常重要,把正确的文件放在正确的地方,不要把常量文件放在util包等错误的地方,正确的地方应该是常量或元数据。
编写方法
方法是动词,所以名称应该采用驼峰式命名法,例如doWhatToDo(),而非doWHatTODO();
一个方法不应该超过30行,如果超过30行则说明过于复杂;
在定义方法之前认真考虑,方法应该具有某些含义,或者应该为特定的任务服务,例如createPerson或sendMail;
一个方法不应该同时执行多个任务,如果方法名为createPerson,那么就应该只创建一个人,不应该再做别的任务。很多人会这样做:
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行代码,最后只会让代码面目可憎且难以理解。
引发的问题包括:
无法理解代码流;
调试问题;
测试问题;
解决一个bug需要很长时间。
解决方法:
将其他任务转移到别的方法中;
提取方法中的有效代码,然后调用其他方法。
所以,这段代码应该像下面这样:
public Long createPerson(PersonVO personVO) {
appoitnmentValidation();
updatingSomething();
creating person code;
}
编写变量
变量名应该采用驼峰式命名法,例如isTrue、userService、personName以及localServiceRerpository;
不应该使用一个字符的名称,除非在临时情况下;
不应该以_和$开头;
在定义变量名之前认真考虑;
不要使用大写。
编写常量
尽量通过类来定义常量,而不是接口;
定义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,这会增加代码的循环复杂度;
尽量编写通用的代码;
不要仅仅利用log来记录异常,应当抛出正确的消息或异常,而不是只输出异常。
什么是“通用代码”?
在很多项目重构的时候,我们都会发现一些本不应该存在的冗余代码。
假设我们有一个邮件草稿的POJO类,它的成员会在发送邮件时被使用。那么,发送邮件所需的步骤有哪些?
我们需要通过设置数据来创建一个POJO对象;
我们需要编写发送邮件的代码。
那么最终的代码行数为:
对象创建——1行:
MailDraft mailDraft = new MailDraft();
设置数据——3行:
mailDraft.setTo();
mailDraft.setBody();
mailDraft.setMessage();
发送邮件的逻辑至少需要4行,所以总共有9-10行代码。
如果我们需要在多重条件或事件中发送邮件,那么情况会怎样?我们需要相同的逻辑,而且通常我们会发现开发人员在每个地方都重复了相同的步骤,并创建一个拥有某些特定代码的方法,于是冗余开始层层叠加。
但是,如果我们将创建草稿和发送邮件的代码提出来,放到另一个方法中,那么每个方法都可以调用这段代码,于是每个方法都省却了10行代码,我们就无需一次又一次地重复这段代码了。
不要匆匆忙忙地赶代码。如果情非得已,那么也要记得加注释:
TODO:需要重构。
原文:https://dzone.com/articles/its-not-too-late
作者:Nitesh sharma, 高级软件工程师@GlobalLogic。
推荐阅读
- CSDN创始人蒋涛:AI定义的开发者时代
- 机器学习开源项目Top10
- 啥是佩奇?Python告诉你
- Python | 面试官最喜欢问的几个问题
- Kafka学习笔记
- “拼多多”惊爆重大 Bug!程序员的眼泪,羊毛党的狂欢
- “黄鳝门”视频女主播一审宣判!
- V神说,解释以太坊2.0最好的文章就是这篇了
- 服!税改第1天,程序员同事竟还多挣了两千……
相关文章:

ios searchBar 的代理方法 集合
下面是搜索框控件的一些代理方法: - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar;将要开始编辑时的回调,返回为NO,则不能编辑- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;已经开始编辑时的回调- (BOOL)…

双绞线接法详解
一直以来很多人(包括作者)都认为10 base-t 10m网络使用了网线中8条信号线之4条,而100 base-t 100m则使用了全部8条信号线(要不怎么那么快呢?)。可是作者前不久在使用一条按所谓10m直连接法(1与3…

step by step YAML 复用
yaml文件适合用来描述软件测试过程的步骤。当不同类型的CI过程集中在一个yaml文件时,首先碰到的一个问题是:大量重复的步骤如何进行复用? 举个例子: stage1:run_it:exec:- A- B- C- D1stage2:run_it:exec:- A- B- C- D2显然&#…

在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)
最近一个项目要用到从listview向treeview拖动item,达到从外部拖动图标成为树形结构的一部分,通过查阅资料总结了一些实现方式,分享给大家。这是winform中的例子。 在进行拖放操作之前,必须要对进行拖放操作的组件的"AllowDro…

node 模块化 require expores,简易实现原理。
为了更好的理解 Node.js 的 require 实现机制,我实现了一个简易的版本。我们node index.js的时候就是require(./index.js),话不多说我们直接上代码: 目录index.jsa.jsb.jsc.jsindex.js use strictfunction $require(filepath) {const fs req…

100+Python编程题给你练~(附答案)
整理 | Just 出品 | Python大本营 春节马上就要到了,怎么能让自己在假期里不掉队?今天,营长给大家准备一个项目: 100 编程练习,这些题如果能坚持每天至少完成一道,一定可以帮大家轻松 get Python 的编程技…

为了一窥国足输韩国之后人们的评论,我爬了懂球帝App
【导语】2019亚洲杯决赛正如火如荼进行中,国足的晋级之路可谓用“惊现”二字评论。继1月16日,国足对战韩国队败北后,一名Python学习者为了一窥网友们的评论,特意爬了懂球帝App的数据。最新喜讯是在20日国足对战泰国的比赛中&#…

Mac下mysql服务器安装
Mac下mysql服务器安装 下载mysql 进入http://dev.mysql.com/downloads/mysql/ 下载Mac OS X 10.9 (x86, 64-bit), Compressed TAR Archive 安装 tar -zxvf mysql-5.6.25-osx10.9-x86_64.tar.gz mv mysql-5.6.25-osx10.9-x86_64 mysql cd mysql sudo scripts/mysql_install_db -…

linux查找文件
find . | grep xyz 将当前目录下(包括子目录)的文件名中含有xyz的文件过滤出来 find . | xargs grep xyz 将当前目录下(包括子目录)的文件内容中含有xyz的行过滤出来 转载于:https://www.cnblogs.com/anovana/p/8036032.html

Grape Api 笔记
关键字:namespace aliases:group,resources,resources,segment define route parameter: 1. namespace :id 2. param_route :id 关键字before 每次api请求前均执行一次 关键字helpers 1. 定义module,通过…

第一个spring boot应用
前提 首先要确保已经安装了java和maven: $ java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) $ mvn -v Apache Maven 3.3.9 (bb52d850…

【转载】xp自动校时
招式一. 自由设定XP时间同步间隔 而对于Windows 2000和XP,由于自身已经集成了自动对时功能,就不用像Win98那样麻烦地安装第三方软件了。但系统默认的时间同步间隔只是7天,我们无法自由选择,使得这个功能在灵活性方面大打折扣。其实…

发改委:互联网企业没有出现大规模裁员现象
1 月 22 日,据中国网报道,国家发改委就宏观经济运行情况举行发布会,新闻发言人孟玮就近期互联网行业裁员情况以及就业保障问题予以回应。 孟玮表示,近期国家发改委通过多种方式进行了调研,包括到有关企业进行座谈&…

php操作mysql的常用语句(大全)
SQL分类:DDL—数据定义语言(Create,Alter,Drop,DECLARE)DML—数据操纵语言(Select,Delete,Update,Insert)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)p…
ElasticSearch + xpack 使用
ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应。我们为什么要选择 ElasticSearch ?因为它是一个准实时的搜索工具,在一般情况下延时少于一秒&…

java coverage exclude使用
使用cobertura:http://mojo.codehaus.org/cobertura-maven-plugin/usage.html 若想要忽略一部分代码,可以通过exclude来指定: <configuration> <instrumentation><excludes><exclude>com/alibaba/ws/gcenter/web/**/…

人工智障?243个机器人被裁
图片源自 Henn-na 官网作者 | 若名出品 | AI科技大本营(ID: rgznai100)全球经济降温,企业裁员消息不断,如果你不能带来显著效益,则很有可能被淘汰,即使是机器人,也难逃被裁的命运。“我们酒店的…

Silverlight C# 游戏开发:Silverlight开发环境
Silverlight C# 游戏开发:Silverlight开发环境 所谓工欲善其事必先利其器,没有好的工具也没有办法做事,我以前曾经想学习C以外的程序语言,当时有java和C#来选择,当时考虑java比较受推崇,可能会比较好一些&a…

算法工程师必须要知道的面试技能雷达图
本文作者王喆,硅谷高级机器学习工程师。转载自知乎专栏:https://zhuanlan.zhihu.com/p/52169807这里是 王喆的机器学习笔记 的第五篇文章,今天我们不聊paper,换一个轻松一点的话题,聊一聊如何准备算法工程师的面试。今…

Qt中文手册 之 QHeaderView
一、 头文件:#include<QHeaderView> 继承自:QAbstractItemView 二、属性 1、cascadingSectionResizes : bool 如果下一区域已经达到最小,是否继续改变下下一个区域的大小。 前提条件是:设置setResizeMode()为interactive 默认是false 相关函数: bool cascadingS…

Linux硬盘性能测试工具 - FIO
1.安装:方法一:直接用指令yum -y install fio方法二:如果方法一不可行则,在官网http://freshmeat.net/projects/fio/下载fio的安装包。安装方法很简单。解压缩后,进入目录输入./configure make make install。2.执行…

linux下vmware tools工具共享
(1.)现在windows 创建一个文件件linux,添加一个test.txt文件(2).虚拟机—设置(red hat linux挂载起来,或运行,有的时候都处于禁用状态,如果这样就有关闭red hat linux,然后再进行设置)--选项 –文件夹共享—…

在全面部署 IPV6 前,你需要了解都在这儿
IPv6 的发展形势 近日,中办国办印发《推进互联网协议第六版(IPv6)规模部署行动计划》(以下简称《计划》),加快推进基于 IPv6 的下一代互联网规模部署,计划指出到 2018 年末国内 IPv6 活跃用户数…

Qt中文手册 之 QApplication
QApplication管理GUI程序的控制流和主要设置。 QApplication包含由窗口系统和其他来源处理过和发送过的主事件循环。它也处理应用程序的初始化和收尾工作,并提供对话管理。QApplication可以对系统和应用的大部分设置项进行设置。 对于用Qt写的任何一个GUI应用,不管这个应用…

微信真要做操作系统了?
整理 | 仲培艺转载自CSDN(ID:CSDNnews)微信爸爸又带着小程序搞事了,一夕之间,小程序界面“变天”,类操作系统来了。「微信二楼」:欢迎来到小程序的世界下拉即见又一个手机桌面?!1 月…

netsh命令修改ip
当前笔记本的可移动性增强,我们需要在多个环境下接入网络开始工作,在没有路由器自动分配的情况下,就需要每次手动设置IP地址和网关等信息,相当烦琐,通过实践利用netsh命令用快捷方式实现了IP地址的快速切换。A. 基本用…

谷歌Waymo自建车厂,L4级无人车量产指日可待
编译整理 | 一一出品 | AI科技大本营(ID:rgznai100)现在,Waymo 宣称世界上第一家 100% 致力于大规模生产 L4 自动驾驶汽车的工厂,即将诞生。美国当地时间 1 月 22 日,Google 旗下无人驾驶公司 Waymo 宣布&a…

Qt中文手册 之 QTableWidget
简介: QTableWidget是基于QTableView的一个默认的视图模型;它用于显示一个标准的表格。表格中每一个项通过QTableWidgetItem来实现。 头文件:#include <QTableWidget> 继承自:QTableView 成员函数: 1、QTableWidget::QTableWidget(QWidget * parent = 0) 默认构…

vue-cli 使用小技巧
1.关闭烦人的eslint 语法检测,在 config 文件夹下 设置: // Use Eslint Loader? // If true, your code will be linted during bundling and // linting errors and warnings will be shown in the console. useEslint: false, //设置为false 2.引入sc…

架构师成长之路-个人学习经验分享(公司研发峰会演讲ppt)
前天在公司分享了一些学习经验,园子中感兴趣可以看看。建议大家使用pptPlex来看这个片子。 首先从我在成长中不同阶段的工作和体会来谈不同阶段的学习内容谈起,为了做好这些必修课,我会对知识+实践+思考+心态ÿ…