【问题标题】:Be suspicious of classes of which there is only one instance怀疑只有一个实例的类
【发布时间】:2015-08-06 09:27:21
【问题描述】:

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

怀疑只有一个实例的类。一种 单个实例可能表明该设计将对象与 类。考虑是否可以只创建一个对象而不是 新班级。派生类的变体可以表示为 数据而不是作为一个独特的类?单例模式是一种 本指南的明显例外。

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

加长版:

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

我根本无法理解作者试图从我厚厚的头骨中得到什么。例如,我不知道他设计混淆对象和类是什么意思,也不知道在只有一个实例的类的上下文中这意味着什么。救命!

【问题讨论】:

    标签: oop code-complete


    【解决方案1】:

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

    struct Player1Name
    {
        string data;
    };
    

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

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

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

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

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

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

    【讨论】:

    • “真正的问题不是类被实例化一次,而是因为它们的设计适用性太窄,只值得实例化一次。” ——这既解决了造成我最初困惑的原因,又用一句优雅的句子回答了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多