4

tl;dr -- What does the below quoted paragraph mean?

Be suspicious of classes of which there is only one instance. A single instance might indicate that the design confuses objects with classes. Consider whether you could just create an object instead of a new class. Can the variation of the derived class be represented in data rather than as a distinct class? The Singleton pattern is one notable exception to this guideline.

McConnell, Steve (2004-06-09). Code Complete (2nd Edition)

Extended version:

I'm currently reading Code Complete, and I'm having trouble understanding the above mentioned paragraph. For context, it's from Chapter 6 under guidelines for inheritance. At first I thought this was advice against using Singletons, but I was obviously proven wrong by the time I got to the end of the paragraph.

I simply can't grasp what the author is trying to get through my thick skull. For example, I don't know what he means by design confusing objects with classes, nor what that means in the context of having a class with only one instance. Help!

4

1 回答 1

5

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

struct Player1Name
{
    string data;
};

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

在这种情况下,开发人员可能会向代码库发送数百种新的用户定义的数据类型和可能的大量继承层次结构,而在他想要创建的每一个新事物的单个实例之外,单个类没有被重用的可能性。现有的类通常就足够了。

真正的问题不在于这些类被实例化一次,而是它们的设计适用性如此之窄,以至于只值得实例化一次。

类通常用于建模与其实例(对象)的一对多关系。它们应该至少在该类的单个实例之外更普遍适用。粗略地说,一个类应该建模 a Dog,而不是你邻居的特定宠物狗,Spark。它应该建模 a ,而不是4.2 米乘 8.7 米Rectangle的精确值。Rectangle42x87如果您正在设计一次实例化的东西,那么您可能将它们设计得过于狭隘,并且可能有现有的东西可供您使用。

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

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

于 2015-05-24T23:24:54.143 回答