我有一个中等规模的python程序(大约5000行代码),随着时间的推移,我建立了这个程序,但在我继续的过程中并没有具体的计划。我得到的体系结构由5-6个大型Singleton对象组成,每个对象都处理程序的某个方面,例如数据库通信、web服务器、数据收集客户端和内部计算。
我觉得像这样使用几个单点程序并不能真正利用OO编程的真正好处,即它很容易地允许您创建许多相关的对象。我的单身汉也相当依赖于彼此,如果我长了很多这个程序(比如5万行),我可以看到我的方法变成了意大利面代码。
所以我想知道是否有更好的方法来构造我的程序。例如,我的单身汉是否应该是单独的模块?但是,我将如何处理在我的单例对象中组织得非常整齐的属性呢?还有其他的架构选择吗?
我对设计模式不是很熟悉( GOF的书在我的待办事项清单上),所以也许有一些设计和/或架构模式会对我的程序更好?
发布于 2015-10-14 08:44:55
单例被许多人认为是“邪恶的”,虽然单例模式有它的用途,但它们很少.我使用过几个大型代码库,并且几乎总是设法将它们从单个代码库中移开。
消除单身者的最简单方法是:
如果您想要“全在”,可以避免步骤2,但这种方法是最纯粹的,因为您避免更改任何没有测试的类,以检查是否有任何故障。就我个人而言,我觉得这有点过分,但是YMMV。基本的前提是,您将转向一个具有注入依赖项而不是静态获取的类。
而且,即使你有合法的单身用途,你仍然应该注射他们。单例就是要确保只存在给定类的单个实例。具有全局可访问的静态功能的经典模式实现了这一点,但不幸的是,由于web上浮动的示例代码很糟糕,这也使我们远离了注入该实例。有很多框架可以为您处理依赖项注入,其中大多数框架将有一种方法来配置对象,以便在整个应用程序中重用相同的实例,从而有效地使其成为一个单例。
发布于 2015-10-14 08:42:57
对单身人士的恐惧被大大夸大了。如果您确实需要可靠的、确切地说是几个大型构造中的一个,那么拥有它们没有什么错。(如果您想编写静态模块,而语言不允许,那么这可能是语言的问题,而不是您的程序。)
反对单例的一个常见论点是,它们很难在单元测试中模拟。但是,只有当您在代码中硬编码他们的类时,这才适用。单例模式实际上关注的是确保只存在特定类的一个实例。没有人阻止您有几个服务接口的实现,每个实现都是一个单例,并根据业务和测试的需要,交换/注入/动态加载它们。
https://softwareengineering.stackexchange.com/questions/299825
复制相似问题