怀疑只有一个实例的类

ger*_*erg 4 oop code-complete

tl; dr-以下引用的段落是什么意思?

怀疑只有一个实例的类。单个实例可能表明设计使对象与类混淆。考虑是否可以仅创建对象而不是新类。可以将派生类的变体表示为数据而不是单独的类吗?Singleton模式是该准则的一个明显例外。

麦康奈尔,史蒂夫(2004-06-09)。代码完成(第二版)

扩大的视野:

我目前正在阅读Code Complete,并且无法理解上述段落。对于上下文,它来自继承准则的第6章。起初我以为这是不建议使用Singletons的建议,但到本段末尾时,我显然被证明是错误的。

我根本无法理解作者试图通过我厚厚的头骨做些什么。例如,我不知道他通过将对象与类混淆来设计的意思,也不知道在仅具有一个实例的类的情况下这意味着什么。救命!

Dra*_*rgy 5

这里的措辞相当混乱,但是我相信这意味着有时候新手程序员可能会创建一个全新的类型来仅实例化它的一个对象。作为一个特别公然的例子:

struct Player1Name
{
    string data;
};
Run Code Online (Sandbox Code Playgroud)

在那里,我们可以只使用string player1_name;(甚至是多个玩家的集合)而无需创建全新的类型,因此尝试使用类来建模新对象(现有类型的新实例)已经可以做的困惑。

在这种情况下,开发人员可能会将数百种新的用户定义数据类型以及可能的大规模继承层次结构泛滥成代码库,从而可能无法在他希望创建的每个新事物之外,将单个类重用到单个实例之外。现有的课程通常就足够了。

真正的问题不是类被实例化一次,而是它们的设计适用范围很窄,只值得实例化一次。

通常,类是用来与其实例(对象)建立一对多关系的。他们应该至少在该类的单个实例之外更普遍地适用。简而言之,一个班级应该模拟一个Dog,而不是您邻居的特定宠物狗Spark。应该模拟一个4.2米乘8.7米的Rectangle,而不是精确度Rectangle42x87。如果您要设计要一次实例化的事物,那么您可能会设计得过于狭窄,并且可能已有可以使用的事物。

可以说,一种新的数据类型通常意味着要解决一类问题(类别),而不是只需要一个此类实例的一种非常精确的数据类型。否则,您的班级设计将是一站式交易,只是在各处肤浅地创建班级,以解决非常个别的问题,而没有潜在的广泛应用范围。

单例是该规则的例外,因为它没有以这种普通的面向对象的方式利用类。在此刻意着手创建一个懒惰构造的,具有全局访问点的单个实例。因此,开发人员创建一个可以实例化一次的类并不是偶然的和对面向对象设计的误解。可以这么说,这是一个非常刻意和有意识的设计决策,而不是对如何使用这些工具的误解。