阅读更多

2顶
5踩

编程语言

转载新闻 升级 Java 编程规范的6个约定

2016-01-11 16:40 by 副主编 mengyidan1988 评论(9) 有5900人浏览
原文地址:https://dzone.com/articles/upgrade-your-code-conventions-2
译文来自:OneAPM
作为Java开发人员,我们会遵循一系列的编码风格和开发习惯。习惯使然是一方面,另一方面,我们也从不停下脚步质疑这些习惯。一段时间以后,笔者养成了一些不同于常人的编码风格和开发习惯。当第一次了解到这些编码风格时,笔者感到又惊又气。但是,花了一段时间践行这些习惯之后,笔者意识到它们的确能造就更加简洁可控的代码库,同时也让开发者更加省心。

不要因这些想法的另类而否定它们,笔者建议你用几周时间尝试其中的一两条,如果你仍然不喜欢它们,换回以前的代码风格也用不了多久时间。

零注释(公共 API 除外)
笔者一度认为业内对于零注释这种编程习惯已经达成共识,但是当与许多同事合作之后,笔者发现事实并非如此。所以,让我们再次探讨这个问题:无注释。注释很快就会与代码脱节。假如你在一段代码的上面写了行注释,谁也不能保证下一个修改代码的人会更新注释。根据笔者的开发经验,没人会更新注释。原来的代码段可能被删除,业务需求也可能改变。因此,你的注释往往弊大于利。

对此,有个简单的解决方案,就是写自记录代码(self documenting code)。对变量、对象或者函数等进行命名时,选择能清晰表达其用途的名字。假如不够清晰,你需要对它们进行重构,将之拆分为更简洁的形式。只要能直观地表达其用途,过长的名字也无需担忧。别忘了编辑器有自动填写功能,没人需要敲出整个标识符的名字。

然而,公共API是一个明显的例外。假如你正在建立一个准备公开发版的库,那还是使用简洁的方法名比较好。不过, Javadoc对这种情况大有裨益,但也仅限此情况。

不要用 “Test” 为测试方法开头

确实没有必要这么做。你写的方法会注释为测试,方法所在的类也存在于测试包中。明眼人都知道那是测试。其实,测试方法名应该明确指出测试的内容与条件。例如, “reversesTheWordRandomToModnar()”或者“adds70ToBalanceOf100ToMakeBalanceOf170()”,这些名字都准确表达了测什么功能以及预期的结果。

如果你正在使用 IntelliJ ,有一款特别棒的插件叫做 Enso 。它可以将测试名转化成一个句子,一目了然地显示测试的内容。这意味着当你在注视任何类的时候, Enso 都会展示其说明文档。

不要使用@Override
这个观点争议颇多,请听笔者说完。假如你不使用 @override ,最坏的结果就是你重写了一个函数,而调用时执行的却是原版函数,而非重写的版本。值得庆幸的是,在测试驱动开发模式下,测试整段代码时就会定位到这个 bug 。这让 @Override 成了一段冗余的代码。显然,冗余的代码不仅没有好处,还会让人分心。因此,停止使用 @Override ,而依赖 TDD(测试驱动开发)。

不要使用 getX()/setY() 这样的函数名
这确实让人不由得感到恼火。 getXXX 和 setXXX 这种命名方式是 Javabeans 时代的前朝遗物。而 JavaBeans 时代早已过去,这种命名方式也不再适用了。后者让代码变得令人反感却没有带来什么好处。去掉 get/set 这类关键字有利于字段名称的简洁。例如, car.engine() 函数将生成一个引擎对象,而 car.engine(new v8()) 将引擎设置为新的型号。如果需要读取多层级内的对象(例如:car.lights().frontLeft() 对比 car.getLights().getFrontLeft()),前者依旧表达清晰而且代码更加简洁。这个编程习惯笔者一开始也很反对,后来逐渐改变了看法,现在非常热衷这一风格。

可运行的代码>高性能的代码

这段内容和代码风格关系不大,而是更加泛泛而谈。每次看到人们为了一个问题,精雕细刻地设计解决方案,花费大量的时间,笔者都会感到不悦。其实,在最基本的层面上解决问题然后测试性能。十有八九,这类方案都是高速,可扩展或符合其他时髦概念的。相反,笔者经常看到人们设计了一个复杂的缓存解决方案,结果没有提高性能却把代码弄成一团乱麻。解决问题时,先实施你能采取的最基本方案,然后再进行优化。最起码,这种方式能让你有实例证明问题已经解决。

使用自己的异常类型
笔者又一次错误地认为这一开发习惯是业内的共识。 Java 中的检查性异常 (Checked exceptions) 很糟糕,几乎所有其他编程语言(例如C#)都意识到了这一点,所以它们甚至没有这个类型。在笔者编写的任何应用程序中,都会创建自己的异常类型,在这些应用程序中抛出的任何异常都会用笔者创建的异常类接住,然后抛出运行时异常。这让代码更加整洁(笔者从未在程序中抛出大量 XXXException ),也意味着笔者能通过 log 追朔异常来自代码的哪一部分或者这是完全出乎意料的异常类型。
来自: OneAPM
2
5
评论 共 9 条 请登录后发表评论
9 楼 =寂寞_狐狸= 2016-01-26 15:03
默默潜水好多年,这是潜水3年来第一次发表言论,说实话,真的看不下去了!
首先楼主你是猴子派来的吗?
其次,我深表怀疑楼主你是来骗回复,骗经验的!
最后,楼主你可以转行了,不要在我们java界了,扛不住你啊~~~
8 楼 huscarter 2016-01-24 20:30
不知道编者做过项目管理没有,你这几条规范如果真的让团队人员执行,对项目开发和维护都将产生不好的影响。
1、零注释。
1-1、同意你属性命名的可读性,但是必要的注释不能少,毕竟你的名称不是详细说明。
1-2、类的注释不能少(包括类的作用、创建则、和时间等),也许你自己看一个类就知道它是为什么而创建的,但是当你离职了,项目交给了别人,当接受的人看到你这个类时就会想CTM。
1-3、一些方法需要添加方法参数和方法的逻辑说明,(当然不是要求所有的方法都得加注释),有些逻辑比较复杂的方法必须加上。不信的话,你过个1个月再去看自己的代码,你就会很庆幸这茫茫代码中的这一片绿洲了。
2、不要使用 getX()/setY() 这样的函数名 。
2-1、我就纳闷了,编者你解析过json字符串吗?
2-2、个人认为javabean规范并不过时(只是很多人不知道其意义何在)。将对象的属性通过get和set方法对外公开有时很有必要。比如项目中要求商品的价格都保留小数点后2位,那么我们可以只在getPrice()里将价格处理成小数点后2位,然后返回就行了,不需要在项目里的每个地方对它做处理。
3、可运行的代码>高性能的代码 。
3-1编者提到“解决问题时,先实施你能采取的最基本方案,然后再进行优化”。这种只能是因人而异,不能定为规范。很多有经验的开发人员在动键盘之前进行构思,作出设计,不一定就会把代码搞乱了。
4、使用自己的异常类型
4-1、编者提到不要使用java的异常检测,做项目都会创建自己的异常类,如果有异常,自定义异常类会接住,然后抛出运行时异常。我要问的是项目要记录log日志,你的自定义异常类有划分log的等级吗?

少年,请开下门,我是查水表的...

7 楼 r361251 2016-01-21 17:18
"零注释(公共 API 除外)" 和 "不要使用 getX()/setY() 这样的函数名"  都已经成为大家约定俗成的规范了,还让大家不要这样做?楼主是来逗逼的?
6 楼 kioxo 2016-01-20 16:40
几个点都很有争议,零注释 中说很少人改注释,其实这已经是个问题,不能在一个问题已知而不处理却使用另一种途径去规避。第二就是代码本来就需要简洁   比如一个算法很复杂的方法,那你名称岂不是要盖住几行了?而且没有注释的话,也许你隔了几个月 自己都要仔细读代码才能理解了。
5 楼 JianbinJava 2016-01-20 12:48
不写注释,简直无法容忍.谁TMD整天把你的代码完全读一遍然后再思考你真正的意图..
这六条一条都不能放过.楼主可以转行不用写Java了.
4 楼 sgq0085 2016-01-18 16:23
这是多初级的程序员拍脑袋想出来的?
3 楼 mfkvfn 2016-01-15 14:43
关于“不要使用 getX()/setY() 这样的函数名 ”这一条,的确不怎么好,还是jQuery这种无参数代表get有参数代表get更好,且set支持连缀式写法。

But,现在各大主流框架,如Spring,Hibernate,Struts、JSON系列化等都通过反射来找getter/setter方法,如果不这么写,就玩不转了。

所以理想很丰满,现实很骨感。
1 楼 飞天奔月 2016-01-12 00:32
要是这么来 小编 你出来   我保证不打死你 

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 串行通信速度一定比并行通信速度“更快”吗?

    并行接口速度比串行接口速度快,这是若干年前的情况了。 在实际时钟频率比较低的情况下,并口因为可以同时传输若干比特,速率确实比串口快。 但是,随着技术的发展,时钟频率越来越高,并行导线之间的相互干扰越来越...

  • Linux是实时系统还是分时操作系统?

    实时操作系统定义 实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致...

  • 基于Java+Spring+Vue+elementUI大学生求职招聘系统详细设计实现

    主要功能设计:首页、个人中心、学生管理、学生简历管理、企业管理、企业信息管理、招聘信息管理、学生应聘管理、兼职评价管理、留言板管理、系统管理等

  • 实时操作系统分类、特点及实现原理

    本章节将介绍各类操作系统的特点。 裸机系统 单片机的程序可以分为三种:轮循系统、前后台系统和多任务系统。 轮询系统 即在裸机编程时,先初始化相关硬件,让主程序在一个死循环里面不断循环,顺序地处理各种事件。...

  • 物联网设备终端和云端系统如何通讯?

    随着5G通讯的诞生,网络通讯速度更快,周围从事互联网行业的同事都说下一个风口可能是物联网。由于目前公司产品偏硬件,我也有幸接触了一些物联网的知识,这篇文章想给大家分享一下关于物联网产品中的终端设备和软件...

  • 卡尔曼滤波原理详解及系统模型建立(simulink)

    卡尔曼滤波原理详解及系统模型建立(simulink) 卡尔曼滤波器 卡尔曼滤波器是在上个世界五六十年代的时候提出的,到今天已经有六十年左右的时间,但卡尔曼滤波算法不管在控制、制导、导航或者通讯方面对数据的预测...

  • 即时通讯实现思路

    2. 网络上两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 socket 3. 应用程序通常通过“套接字”向网络发出请求或者应答网络请求 网络上的通信要素 1. 网络上的请求就是通过 Socket 来...

  • 超市商品信息管理系统/超市管理系统的设计与实现

    系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据超市商品信息管理系统的现状来进行开发的,具体根据现实的需求来实现超市商品信息管理系统网络化的管理,各类信息有序...

  • 基于微信小程序的课堂考勤系统设计与实现【源码私信】

    本系统服务端使用java开发,版本为jdk1.8,数据库采用mysql5.7,使用到的技术有springboot,mybatis,gradle,poi,微信开发者工具

  • 基于socket的即时通信系统的设计与实现

    系统的设计建立在用户的需求之上,通过对用户需求的分析,可以更好的实现系统,明确系统的设计方向。 随着互联网的不断发展,人与人之间的交流也逐渐开始越来越依赖网络,在这种形势下,我们开发出了这款即时通信...

  • 如何基于 Android Things 构建一个智能家居系统?

    Android Things 是 Google 在 2016 年底推出的基于物联网的操作系统,广泛运用于物联网设备。本文作者从其技术原理开始,详解了 Android Things 本身及与之相关的技术之后,总结了如何搭建一个物联网系统的技术路线...

  • 基于JavaFX实现的数据库学生管理系统

    JavaFX Mysql 数据库 学生管理系统 Java

  • 鸿蒙系统手机电脑互传文件,效率提升利器,手机与电脑之间如何快速传输文件?...

    原标题:效率提升利器,手机与电脑之间如何快速传输文件?随着智能手机的快速发展,手机功能已经不再局限于通话、娱乐,甚至渐渐肩负起了辅助电脑办公的工作需求。... 实现手机与电脑端文件共享的方法这里先...

  • Java网络聊天室系统的设计与实现

    就计算机的编程而言,互联网软件开发逐渐以Java为核心而全面发展,之前的编程技术已经慢慢满足不了我们的需求,java正在以恐怖的速度发展。人们日常所要面对的各种问题,如吃饭,娱乐,工作,休息还有现在大家所逐渐...

  • 以较小的代价实现PLC快慢速数据混合采集的技巧

    大家都知道,PLC是一个高可靠性的控制系统,为了确保控制程序(逻辑计算、I/O访问等)的及时运行,CPU会控制其他任务的资源消耗,在这种情况下,普通的以太网通讯...本文介绍了不同速度混合采集的思路和实现方法。

  • 电商推荐系统论文:基于Spark机器学习的电商推荐系统的设计与实现,大数据电商推荐系统毕设论文,Spring MLlib电商推荐系统

    题 目: 基于Spark机器学习的电商推荐系统的设计与实现 这是我去年本科毕业时做的毕业设计论文,全文三万多字,知网查重对重复率1%,由于本科论文不会被发表到知网上,再加上我已毕业近一年,现在将论文发表到CSDN...

  • ROS--基于机器人操作系统设计与实现

    更令人感到振奋的是,越来越多的高级智能算法让机器人的自主等级逐步提高。尽管如此,对于机器人软件开发人员来说,仍然存在着诸多挑战[1]。主要介绍一个软件平台,即机器人操作系统(Robot Operating System, 或...

  • LIS系统通讯程序原理与实现

    LIS系统通讯程序原理与实现一、BSLIS仪器数据采集方法BSLIS对检验仪器的数据采集主要通过串行口通讯、USB端口通讯、TCP/IP通讯、定时监控数据库和手工录入等几种方法。串行口通讯最为普遍,采用RS-232C标准,一般的...

  • 西门子S7-200PLC与MCGS触摸屏联动控制步进伺服电机的技术解析及应用实例

    内容概要:本文详细介绍了利用西门子S7-200PLC与昆仑通泰MCGS触摸屏联合控制步进伺服电机的方法和技术要点。首先阐述了硬件接线的具体方式,包括PLC输出接口与伺服驱动器之间的正确连接以及必要的安全措施如急停开关的接入。接着深入探讨了PLC程序的核心代码片段,涵盖原点回归、手动正转触发、绝对位置计算等功能模块,并解释了关键指令如PLS的作用及其使用注意事项。此外,针对触摸屏的关键配置进行了说明,涉及数值输入框、指示灯、多状态按钮等组件的设置,强调了绝对定位逻辑的实现。文中还分享了一些常见的调试问题及解决方案,例如伺服电机抖动、数据刷新延迟等问题的处理办法。最后提到该方案已在实际生产环境中成功应用并表现出良好的性能指标。 适合人群:从事自动化控制领域的工程师和技术人员,特别是那些希望深入了解PLC与触摸屏协同工作的专业人士。 使用场景及目标:适用于需要高精度定位控制的小型自动化生产线或机械设备中,旨在帮助用户掌握如何构建稳定可靠的步进伺服控制系统,提高工作效率的同时降低成本。 其他说明:作者凭借丰富的实践经验提供了许多宝贵的建议和技巧,对于初学者而言是非常有价值的参考资料。

  • 光储并网直流微电网Simulink仿真模型:MPPT与混合储能系统的优化设计

    内容概要:本文详细介绍了光储并网直流微电网的Simulink仿真模型构建,涵盖多个关键技术点。首先讨论了光伏系统的最大功率点跟踪(MPPT)算法,特别是扰动观察法的具体实现及其优缺点。接着探讨了由蓄电池和超级电容组成的混合储能系统,强调了它们各自的特点以及如何通过控制算法进行有效的功率分配。此外,还讲解了二阶低通滤波法的应用,用于提高电能质量和优化不同频率范围内的功率管理。最后,文章深入解析了逆变器的双闭环控制系统,包括电压环和电流环的设计,以确保逆变器输出与大电网的良好匹配。 适合人群:从事新能源系统设计、电力电子技术研究的专业人士,尤其是对Simulink仿真工具有所了解的研发人员。 使用场景及目标:适用于希望深入了解光储并网直流微电网内部机制和技术细节的研究者和工程师。主要目标是帮助读者掌握如何利用Simulink工具箱搭建完整的光储并网直流微电网仿真平台,从而为实际工程应用提供理论支持和技术指导。 其他说明:文中提供了大量具体的Matlab/Simulink代码片段,便于读者理解和实践。同时,作者分享了许多宝贵的实战经验和调试技巧,有助于解决实际建模过程中可能遇到的问题。

Global site tag (gtag.js) - Google Analytics