Java命名:可怕的DefaultAbstractHelperImpl

JOOQ的卢卡斯·艾德
研究了在Spring和Java命名策略中富有创造性的类名所带来的价值。

Java开发相关命名规范,java开发规范

这篇文章最早是发表在jooq.org上,作为聚焦于jOOQ上所有关于Java、SQL以及软件开发的系列的一部分。

JAVA文件命名规范

前段时间,我们发布了这款被我们称作Spring API
Bingo的趣味游戏。这是对Spring构造类名时展现出的创造性极尽赞美。类名如下:

1.类命名

抽象类以ABstract或者Base开头。
异常类以Exception结尾。
枚举类以Enum作为后缀。
工具类以Utils作为后缀(相应的包名最后以.util结尾)。
形容能力的接口使用able作为后缀。
实现类与接口用后缀Impl区别。
数据类:表名(首字母大写)+DO。
传输类:领域相关名+DTO。
澳门新葡亰手机版,展示类:页面名称+VO。

  • FactoryAdvisorAdapterHandlerLoader
  • ContainerPreTranslatorInfoDisposable
  • BeanFactoryDestinationResolver
  • LocalPersistenceManagerFactoryBean

2.service/dao层方法命名

获取单个对象用get做前缀。
获取多个对象用list做前缀
获取统计值用count做前缀。
插入用save做前缀。
删除用remove做前缀。
修改用update做前缀。

其中有两个是实际存在的,你能指出来吗?如果不能,来玩下Spring API
Bingo吧!

3.变量的命名规范

第一个单词的首字母小写,其后单词的首字母大写 例如:maxValue
变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。
pojo中的布尔变量,都不要加is(数据库中的布尔字段全都要加is_前缀)

很明显,Spring API也不得不面对下列问题……

4.常量的命名规范

常量名应该都使用大写字母,下划线分割单词。
例如:MAX_VALUE

命名

“计算机科学中只有两个困难的问题。缓存失效,命名,以及差一错误” –Tim
Bray quoting Phil Karlton

在Java代码中有几对前缀和后缀非常难以摆脱。考虑到最近在推特上的讨论,前缀和后缀问题不可避免的引发了非常有趣的争论。

使用接口:PaymentServce的实现:PaymentServiceImpl
,它的测试应该命名为PaymentServiceImplTest而不是PaymentServiceTest。

——Tom Bujok (@tombujok) 2014年10月8日

是的,Impl后缀是一个有趣的主题。我们为什么要使用它,以及我们为什么要继续这样命名?

数据库命名规范

库:应用名表:业务名称_表的作用(单数形式
主键索引:pk_字段名
唯一索引:uk_字段名
普通索引:idx_字段名
表示是否字段:is_xxxx unsigned tinyint(1.表示是,0表示否)

说明 vs 主体

Java是一个古怪的语言。Java面世的时候,面向对象是最热门的话题。但是过程式语言也有一些有趣的特性。当时一个非常有趣的语言叫做Ada)(以及大部分源于Ada的
PL/SQL)。Ada(像PL/SQL)在包里合理的组织了一些过程和方法,由此产生了两种类型:说明(specification)和
主体(body)。来自维基百科的例子):

-- Specification
package Example is
  procedure Print_and_Increment (j: in out Number);
end Example;

-- Body
package body Example is

  procedure Print_and_Increment (j: in out Number) is
  begin
    -- [...]
  end Print_and_Increment;

begin
  -- [...]
end Example;

你必须要这么做,并且这两个都要命名为Example。这两部分要存到两个不同的文件中,一个叫做
Example.ads(ad出自于Ada,s出自于specification),另一个叫做Example.adb(b来自body)。PL/SQL模仿这一规范,给package文件命名为Example.pks和Example.pkb,pk源自Package。Java走了一条不同的路,主要是因为多态和类的运行方式:

  • 类既是说明也是主体,接口不能和实现类用同样的名字(当然主要是因为有多个实现类)。
  • 特别的,类可以分为仅说明,有部分主体的(当它们是抽象类时)以及说明和主体都有的(具体类)这几类。

JUnit单元测试命名规范