tl; dr - 以下引用的段落是什么意思?
要怀疑只有一个实例的类。一个 单个实例可能表示设计混淆了对象 类。考虑一下你是否可以创建一个对象而不是一个 新课。是否可以表示派生类的变体 数据而不是一个独特的类? Singleton模式是一个 本指南的明显例外。
麦康奈尔,史蒂夫(2004-06-09)。代码完成(第2版)
扩展版本:
我目前正在阅读Code Complete,而且我无法理解上述段落。对于上下文,它来自第6章的继承指南。起初我认为这是反对使用单身人士的建议,但当我到达段落末尾时,我显然被证明是错误的。
我根本无法理解作者试图穿过厚厚的头骨。例如,我不知道设计是否将对象与类混淆是什么意思,也不知道在只有一个实例的类的上下文中它意味着什么。救命啊!
答案 0 :(得分:4)
这里的措辞相当令人困惑,但我相信,有时新手程序员可能只是为了实例化它的一个对象而创建一个全新的类型。作为一个特别明显的例子:
struct Player1Name
{
string data;
};
我们可以在不创建全新类型的情况下使用string player1_name;
(甚至是多个玩家的聚合),因此尝试使用类来模拟新对象(现有类型的新实例)的混淆已经做到了。
在这种情况下,开发人员可能会使用数百种新的用户定义数据类型和可能的大规模继承层次结构来对代码库进行垃圾邮件处理,而对于每个他想要的新事物,单个实例都无法重复使用单个类。现有类通常就足够了。
真正的问题不是类被实例化一次, 但是他们的设计非常适用,只能值实例化一次。
类通常用于模拟与其实例(对象)的一对多关系。除了该类的单个实例之外,它们应该至少在某种程度上更普遍适用。粗略地说,一个班级应该模仿Dog
,而不是你邻居的特定宠物狗,Spark
。它应该模拟Rectangle
,而不是4.2米乘8.7米的精确Rectangle42x87
。如果您正在设计一次要实例化的东西,那么您可能过于狭窄地设计它们,并且可能存在您可以使用的现有东西。
新数据类型通常用于解决问题的类(类别),可以说,而不是一个只调用该类的一个实例的非常精确的数据类型。否则,你的课程设计将是一次性的交易,只是在表面上创建课程,以解决非常个别的问题,没有任何潜在的更广泛的应用。
单例是规则的一个例外,因为它不以这种正常的面向对象方式使用类。在那里,它故意开始创建一个单独的实例,懒惰构造,并具有全局访问点。因此,开发人员创建了一个旨在实例化一次的类,而不是因为面向对象设计的偶然和误解。可以这么说,这是一个非常慎重和有意识的设计决定,而不是对如何使用这些工具的误解。