Language agnostic 提供接口完整实现的类的命名,但这些类被设计为可扩展/用作mixin

Language agnostic 提供接口完整实现的类的命名,但这些类被设计为可扩展/用作mixin,language-agnostic,naming-conventions,Language Agnostic,Naming Conventions,如果您编写了一个包含很多方法的接口,比如说IPerson,并且您期望它有很多不同的实现,那么提供一个抽象类AbstractPerson,它实现了大部分功能是非常常见的做法 通常,AbstractPerson是抽象的,因为您通常会留下一些关键功能未实现。在这种情况下,命名是有意义的 但是,如果您已经实现了所有IPerson,但仍然需要子类,那么什么是好的命名约定呢?也许是PersonMixin,PersonHelper,GenericPerson或者干脆是Person?我认为Person有点模糊,

如果您编写了一个包含很多方法的接口,比如说
IPerson
,并且您期望它有很多不同的实现,那么提供一个抽象类
AbstractPerson
,它实现了大部分功能是非常常见的做法

通常,
AbstractPerson
是抽象的,因为您通常会留下一些关键功能未实现。在这种情况下,命名是有意义的


但是,如果您已经实现了所有IPerson,但仍然需要子类,那么什么是好的命名约定呢?也许是
PersonMixin
PersonHelper
GenericPerson
或者干脆是
Person
?我认为
Person
有点模糊,因为它没有清楚地显示预期用途

我认为
很好。关键是,你可以将它专门用于特定类型的人,但它仍然是一个人。

如果它可以按原样使用,我会坚持使用
人。如果不是,我会将其抽象化(即使它没有抽象成员),并将其称为
PersonBase

,虽然这是来自(for.NET),但我认为它同样适用于任何语言。建议如下:

如果要在公共API中使用基类,请避免使用基类后缀命名基类。如果库将基类公开为返回类型或参数类型,则不应使用基类后缀

一般来说,如果该类是公共的(甚至是私有的,尽管在这种情况下风险较小),并且您将其命名为
PersonBase
,则意味着它是一个基类。如果在将来的某个时候,类层次结构被重构,并且
PersonBase
不再是基类,那么您可能希望将
PersonBase
重命名为其他类,这很可能会导致任何使用者代码的重大更改


我只需给类命名
Person
,并让任何派生类使用更具体的名称。我认为
Person
非常清楚,表明它被用作泛型(非特定)Person。

PersonBase如果类层次结构被重构,并且
PersonBase
不再是基类,那么从长远来看可能会导致问题。当这种情况发生时,您重命名
PersonBase
和/或引入一个新的
PersonBase
,它有可能破坏下游消费者。谢谢。我接受你的答案,因为这是一个最好的动机,虽然史蒂文斯的答案非常接近你的答案。