2015-05-24 23 views
3

tl; dr - 以下引用段落的含义是什么?对于只有一个实例的类别可疑

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

McConnell,Steve(2004-06-09)。代码大全(第2版)

扩展版本:

我目前正在读Code Complete,而我无法理解上述段落。关于上下文,它来自第6章,继承的准则。起初我认为这是反对使用单身人士的建议,但我明显被证明是错误的,当我到了段落的末尾。

我简直无法理解作者试图穿过我厚厚的头骨。例如,我不知道他的设计将对象与类混淆在一起,也不知道在只有一个实例的类中,这意味着什么。帮帮我!

回答

4

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

struct Player1Name 
{ 
    string data; 
}; 

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

在这种情况下,开发人员可能会使用数百个新的用户定义数据类型和可能的大量继承层次结构来代码库发送垃圾邮件,而且没有可能为单个实例重新使用单个实例,当现有的类通常足够时创建。

真正的问题不在于这些类被实例化一次, 但他们的设计是如此狭隘适用为仅是值得实例一次。

类通常意味着模型的实例(对象)一个一对多的关系。它们应该至少比该类的单个实例更普遍适用。粗暴地说,一个班级应该模拟Dog,而不是你邻居的特定宠物狗,Spark。它应该模拟一个Rectangle,而不是精确的Rectangle42x87,它是4.2米乘8.7米。如果你设计的东西要被实例化一次,那么你可能将它们设计的太狭窄,可能有现成的东西可以用来代替。

新的数据类型通常意味着解决问题的类(类),可以说,而不是一个非常精确的问题,只需要一个类的实例。否则,你的班级设计将成为一次性交易,只是表面上创建各地的班级来解决非常个人化的问题,而没有任何更广泛的应用潜力。

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

+1

“真正的问题不在于类实例化了一次,而是因为它们的设计如此狭隘地适用以至于只值得实例化一次。” - 这两个地址都是造成我原来的困惑的原因,并用一句优雅的句子来回答这个问题。谢谢! – gerg

相关问题