2011-01-20 66 views
2

最近,我重构了我的项目的代码,我发现有很多单身对象,几乎是一个单独的函数。例如,我应该做周期任务,所以我有一个叫做CPeriodTask的类,它有一个名为ScanPeriodTaskThreadProc的线程函数和一个保存任务的成员变量,而CPeriodTask是一个单例对象。减少项目中的单身对象

在我的项目中有这么多的单身物件,单身物件的一些参考 其他单件物件。

现在我想减少单身人士的使用和单身人士的引用。 任何建议,谢谢。

+1

确保您有单元和验收测试,涵盖您即将更改的任何内容。事后挖掘这些东西可能会变得混乱。 – 2011-01-20 02:24:39

回答

1

减少单身人士的一种方法是创建一些神级,SingletonManager,然后可以包含所有其他单身人士作为实例成员。也就是说,您可以删除项目中现有单例的单例行为,然后该管理器按照需要按照正确的顺序创建/销毁这些对象,因为您提到这些对象中的某些对象之间存在依赖关系。

因此,在主要的顶部,你创建SingletonManager,发布一些对这个对象的引用,这样你的代码的其余部分就可以得到这些以前的单例对象。而且,同样重要的是,在主要的底层,你“关闭”管理器,然后管理器以确定的顺序以正确的顺序破坏这些对象。再一次,这很重要,因为你提到了这些对象之间的相互依赖关系,并且至少有一个你现在拥有的单例包含一个线程。

1

单身经常被过度使用。首先看看哪个单身人士是真正的,因为它只能有一个单身人士;例如,这些可能与设备相关联。 Singleton解决了两个问题:实例的数量和对象的导航。即他们真的只是全局的。所以要删除一个全局对象,你必须弄清楚你的新对象模型将会是什么样的,以便允许导航到这个对象。如果你有很多单身人士,你可能会发现保留其中一个作为对象层次结构的根,可以让你将其中的剩余部分从它中删除。这样思考,问为什么你现在需要不止一个对象的实例,以及它们是否总是关联。

并且:将来会避免单身/全局,除非真正有价值。

1

简单的答案是不要让他们单身。如果他们拥有程序的生命周期,请在main中创建它们。如果有人需要对该对象执行某些操作,请将其设置为明确的依赖关系。

下面是一个例子你CPeriodTask

int main() 
{ 
    // Create something so my program can use periodic tasks 
    CPeriodTask* pMyPeriodicTasks = new CPeriodTask(); 

    // Object foo needs to do periodic tasks, lets pass this functionality in 
    CFoo* myProgramsFoo = new CFoo(pMyPeriodicTasks); 
} 

另一种选择,暴露的代理共享资源和处理幕后的资源:

class CMyPeriodicTask 
{ 
public: 
     // obtain resource 
     CMyPeriodicTask(/*function ptr*/); 

     // release resource 
     ~CMyPeriodicTask(); 
}; 

在此代码,与任何系统界面您需要启动一个定期任务的代码。然后Cfoo的只是使用它:

class CFoo 
{ 
private: 
     CMyPeriodicTask periodicTask; 
... 
}; 

我建议使用前一种情况时,并不是所有人都需要的功能,而后者情况下,当功能将被大量使用。