繁体   English   中英

要怀疑只有一个实例的类

[英]Be suspicious of classes of which there is only one instance

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

要怀疑只有一个实例的类。 单个实例可能表示设计将对象与类混淆。 考虑一下你是否可以创建一个对象而不是一个新类。 派生类的变体可以用数据表示而不是作为一个独特的类来表示吗? Singleton模式是本指南的一个值得注意的例外。

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

扩大的视野:

我正在阅读Code Complete ,我无法理解上面提到的段落。 对于上下文,它来自第6章的继承指南。 起初我认为这是反对使用单身人士的建议,但当我到达段落末尾时,我显然被证明是错误的。

我根本无法理解作者试图穿过厚厚的头骨。 例如,我不知道设计是否将对象与类混淆是什么意思,也不知道在具有只有一个实例的类的上下文中它意味着什么。 救命!

这里的措辞非常令人困惑,但我相信这意味着有时新手程序员可能会创建一个全新的类型来实例化它的一个对象。 作为一个特别明显的例子:

struct Player1Name
{
    string data;
};

我们可以使用string player1_name; (或者甚至是多个玩家的聚合)而不创建一个全新的类型,因此尝试使用类来模拟新对象(现有类型的新实例)已经可以做的混淆。

在这种情况下,开发人员可能会使用数百种新的用户定义数据类型以及可能的大规模继承层次结构来对代码库进行垃圾邮件处理,而对于他想要创建的每个新事物,单个实例都无法在单个实例之间重复使用。现有的课程通常就足够了。

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

类通常用于模拟与其实例(对象)的一对多关系。 除了该类的单个实例之外,它们应该至少在某种程度上更普遍适用。 粗略地说,一个班级应该塑造一只Dog ,而不是你邻居的特定宠物狗Spark 它应该模拟一个Rectangle ,而不是一个4.2米乘8.7米的精确Rectangle42x87 如果您正在设计要实例化的东西,那么您可能过于狭窄地设计它们,并且可能存在您可以使用的现有东西。

新的数据类型通常用于解决问题的类(类别),可以说,而不是一个只需要该类的一个实例的非常精确的数据类型。 否则,你的课程设计将是一次性的交易,只是在表面上创建课程,以解决非常个别的问题,没有任何潜在的更广泛的应用程序。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM