Class 我应该把我所有的抽象类命名为AbstractFoo吗

Class 我应该把我所有的抽象类命名为AbstractFoo吗,class,abstract,Class,Abstract,确保所有抽象类的名称都以“abstract”作为前缀是否是一种良好的做法?您可以这样做,但我倾向于不这样做,因为这是一个实现细节 我不喜欢在类型和标识符的名称中添加实现细节信息,因为这种信息将来可能会改变。在我看来,最好的命名方式是什么,而不是如何实现它们。这取决于您的编码约定 你也可以称之为FooBASE,或者只是Foo,如果你还没有一个接口FO。 < P>如果你考虑在.NETFramework中是怎样的,不用。例如,抽象流类。类名中没有任何内容表明它实际上是抽象的。我发现用这种方式命名类很有

确保所有抽象类的名称都以“abstract”作为前缀是否是一种良好的做法?

您可以这样做,但我倾向于不这样做,因为这是一个实现细节


我不喜欢在类型和标识符的名称中添加实现细节信息,因为这种信息将来可能会改变。在我看来,最好的命名方式是什么,而不是如何实现它们。

这取决于您的编码约定


你也可以称之为FooBASE,或者只是Foo,如果你还没有一个接口FO。

< P>如果你考虑在.NETFramework中是怎样的,不用。例如,抽象流类。类名中没有任何内容表明它实际上是抽象的。

我发现用这种方式命名类很有用。它发送一条消息,表明它们打算被分类;没有实例化;包含子类等通用的代码

但这并不总是必要的。大多数程序员可能会将“Shape”识别为抽象类,“Square”、“Circle”等识别为具体类。但如果不能马上弄清楚,这是一个有用的提示


您还应该遵循本地编程惯例和样式指南。

我认为这部分取决于您将如何使用该类。如果它只用于强制派生类符合接口的内部使用,那么在它之前添加抽象可能不是一个坏主意。但是,如果您提供的Foo工厂将提供实际为SpecializedFoo1或SpecializedFoo2的Foo实例,那么返回AbstractFoo实例似乎很尴尬。

我认为使用这种命名约定只是因为很难找到另一个好名称。如果您已经有一个名为“List”的接口,那么如何命名“AbstractList”类?它更多的是避免名称冲突,然后告诉实现细节。

有点难以解释,但我使用它只是为了避免在函数类中复制/粘贴相同的代码,而不是在域对象之类的对象中

  • AbstractServiceTestCase-->抽象前缀似乎很有用
  • 抽象动物似乎很奇怪,而且毫无用处

当然,你应该自己决定,只要在整个项目中遵循相同的惯例。

到目前为止的答案非常有用,并显示出负责任的实践推广。我倾向于同意名称不应该表示实现(
Foo
可能是一个抽象类,后来被移动到接口)。然而,在编写代码时,它对我来说很有用,因为我需要为派生类提供方法

例如,我目前有一个层次结构(不要问名称的基本原理,但它们在上下文中是有意义的,并映射到XML元素名称)。我正在使用Java,但我认为大多数语言都是类似的:

public abstract class Marker {...}
public class Template extends Marker {...}
public class Regex extends Marker {...}
我现在倾向于:

public abstract class Marker {...}
public class TemplateMarker extends Marker {...}
public class RegexMarker extends Marker {...}
而不是

public abstract class AbstractMarker {...}
public class Template extends AbstractMarker {...}
public class Regex extends AbstractMarker {...}


我个人记得,
Marker
是一个抽象的函数概念,子类是具体的实现。

我不会将抽象类称为抽象类,原因如下:

每个矩形都是一个形状。在任何可以使用形状的地方,都可以使用矩形。处理矩形(但也可以处理圆形)的代码可能如下所示:

Shape s = .....;
s.drawTo(myGraphicsContext);
在任何可以使用对象(例如矩形)的地方使用对象(例如形状)是面向对象概念的一个重要部分,称为。(这也是显而易见的:什么样的句子或逻辑会对形状做出陈述,但不适用于矩形?)

如果将泛化命名为AbstractShape,则违反此原则。矩形不是抽象的形状。如果有什么区别的话,那就是“混凝土形状”!矩形不是抽象的(在“我不知道这是什么类型的形状。可以是矩形,也可以是其他任何形状”的意义上)。使用AbstractShape的代码读取错误:

AbstractShape s = new Rectangle(...);

关于这个话题,我在博客上发表了更多的想法。

FooBase是一个很有吸引力的替代品。这一点在《代码》等书中有所阐述,我倾向于同意。这一点在本次对话中经常被忽略,也许是最重要的一点。此外,它还导致了一个犹豫不决的时刻:有时,您可以为超级抽象类想出一个好的替代名称。其他时候,你不能。您是否在同一项目范围内混合样式?Shape将是一个接口,而AbstractShape将是抽象类<代码>类矩形扩展了AbstractShape并且
类AbstractShape实现了Shape
;或
类矩形扩展抽象形状实现形状
;任何最适合你的场景。
AbstractShape s = new Rectangle(...);