Answers:
没有约定。这一切将帮助开发人员更快更好地编写代码,并帮助他人理解您的代码。
询问将要查看和维护代码的人员。他们宁愿看到什么?什么会使他们更轻松?然后根据他们想要的名称进行命名。
另外,Java编程语言的代码约定:9.命名约定建议不要求:
类名应为名词,大小写混合,每个内部单词的首字母应大写。尝试使您的类名称保持简单和描述性。请使用整个单词,避免使用首字母缩写词和缩写(除非缩写比长格式(如URL或HTML)使用得更广泛)。
不会。Intellisense会简单地告诉我它是否是抽象的,因此您在这里违反了DRY。
abstract
到类名不会违反DRY,并且不是每个人都使用智能。例如,如果您正在阅读网页上的代码,或者该代码是您在纯文本编辑器或外部差异工具中查看的补丁程序的一部分,该怎么办?
abstract class AbstractName
?显然有两次“抽象”。如果您不使用Intellisense,那就是您的问题,其他所有人都使用理智的工具来查看代码。
在.NET中,经常看到使用“ Base”作为后缀来表示抽象基类。对于这是否是Java的普遍做法,我将参考其他答案。
我认为,实体的名称不应传达有关其类型结构的信息,而应传达其语义。因此,如果抽象不是其运行时目标的一部分,则将类定义为“ AbstractSomething”是没有意义的。它是基础抽象类,对于程序员来说是可见的,不需要在名称中反映出来。
但是,如果可以完美地将抽象工厂的实现称为AbstractFactory,因为这确实与类的意图有关。
通常,建议使用命名约定,以帮助传达有关课程目标的最多信息。
同样,请从清除SomethingImpl
。我们不在乎它是一个实现而不是基类。如果您的类层次结构是为继承而设计的,那么有人可以从中继承。当然,在它们中添加更多的“ Impl”后缀或其他工件毫无价值。添加“接口”后缀或“ I”前缀也没有任何价值。
考虑:
IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl
相对于:
Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
<-- Ferrari
<-- Trabi
我到目前为止更喜欢后者。
这一点,在某些方面,类似于公然滥用了的匈牙利命名法是后者确定了它的坏名声,人们错误地开始把它解释为要求开发商与变量的类型的指标前缀它们的变量。尽管有时可以使用它(大多数情况是如果您懒于查找类型的定义),但是它几乎没有用。Simonyi最初使用匈牙利符号法的想法是将其用作助记符,以提醒开发人员该实体的功能,而不是其类型。
一个好的经验法则是不要在语法中明显包含名称的属性。由于在Java中,您需要使用适当命名的abstract
关键字标记一个抽象类,因此我不会在名称中包括它。例如,在C ++中,情况不是很清楚,但是至少当错误使用抽象类时,编译器会告诉您。再次使用Python之类的方法,明确地这样命名一个抽象类并不是一个坏主意。
该规则的常见例外是名称不明确时。如果由于某种原因存在一个具体的子类Task
(在其他示例中,这可能更明智,但无论如何),那么请确保使用AbstractTask
。
protected abstract SomeClass { }
这告诉我这是一个Abstract类。添加前缀是一种重言式和反模式,在大多数情况下并不适用,例如,请参见该链接中提到package local
的例外。
在大多数情况下,Abstract
类不应成为面向公众的API的一部分,如果确实存在,则应该有充分的理由,并且有充分的理由应该提供一个明显的好名字,而不是AbstractSomeClass
。
在大多数情况下,如果您无法提供更具描述性的名称,则可能需要重新设计。
我的五分钱,可能您将拥有该抽象类的实现,它们的名称将为“ SomeSpecificTask”,“ TaskWithBubbles”,“ StrangeTask”等。因此,抽象的“ Task”与它们之间不会发生名称冲突。
另外,“抽象”一词与语言语法有关,而不与业务领域实体有关,因此我宁愿不要将其用作名称的一部分。
另一方面,在这里的一个答案中,我看到了J.Bloch Effective Java的摘录,该摘录说使用“抽象”作为名称的一部分是一种公认的做法。可能是这样。但是无论如何,在正式的Java代码约定中,都没有关于此的任何内容。
我不是Java开发人员(INAJD?),也不知道这些事情的标准命名法,但是我认为Task
听起来很抽象,可以按原样独立。
我已经做到了。我确实在名为AbstractOperation的抽象类中添加了“ Abstract”作为前缀。我这样做的原因是,还有另一个包含非抽象类的软件包,名为Operation,它可以帮助我的团队和后来接手的程序员避免两者之间的混淆。