我应该将所有抽象类命名为AbstractFoo

时间:2009-09-15 11:36:03

标签: class abstract

确保所有抽象类的名称都以“Abstract”为前缀是不错的做法?

9 个答案:

答案 0 :(得分:8)

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

我不喜欢在类型和标识符的名称中添加实现详细信息,因为这种信息将来可能会发生变化。在我看来,最好将事物命名为它们,而不是它们是如何实现的。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

这取决于您的编码惯例。

如果你还没有Foo接口,你也可以称它们为FooBase,或者只是Foo。

答案 3 :(得分:1)

如果你考虑它在.NET框架中的表现,没有。以抽象Stream类为例。类名中没有任何内容表明它实际上是抽象的。

答案 4 :(得分:1)

有点难以解释,但我只是用它来避免在功能类中复制/粘贴相同的代码,而不是像域对象那样。

  • AbstractServiceTestCase - >抽象前缀似乎很有用
  • AbstractAnimal - >似乎奇怪而无益

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

答案 5 :(得分:1)

由于以下原因,我不会将抽象类称为Abstract:

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

Shape s = .....;
s.drawTo(myGraphicsContext);

使用对象(例如Rectangle)可以使用它的泛化(例如Shape)是面向对象概念的重要部分,称为Liskov Substitution Principle。 (这也很明显:什么样的句子或逻辑会对形状做出陈述,但不适用于矩形?)

如果您将概括命名为 AbstractShape ,则会违反此原则。 Rectangle不是AbstractShape。如果有什么它是“混凝土形状”!矩形不是抽象的(在“我不知道这是什么类型的形状的意义上。可能是一个矩形,可能是其他任何东西。”)。然后使用AbstractShape的代码读错了:

AbstractShape s = new Rectangle(...);

我在博客上发表了关于此主题的更多想法here

答案 6 :(得分:0)

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

但并不总是必要的。大多数程序员可能会将“Shape”标识为抽象类,将“Square”,“Circle”等标识为具体。但如果不能立即明确,这是一个有用的暗示。

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

到目前为止,答案非常有用,并显示了负责任的实践传播。我倾向于同意名称不应表示实现(Foo可能是一个抽象类,后来被移动到接口)。但是,在编写具有视觉线索的时候,我需要为派生类提供方法。

作为一个例子,我目前有一个hieararchy(不要询问名称的基本原理,但它们在上下文中有意义并映射到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 {...}

public abstract class AbstractMarker {...}
public class TemplateMarker extends AbstractMarker {...}
public class RegexMarker extends AbstractMarker {...}

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