首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构多个单子

如何重构多个单子
EN

Software Engineering用户
提问于 2015-10-14 07:51:17
回答 2查看 3.4K关注 0票数 7

我有一个中等规模的python程序(大约5000行代码),随着时间的推移,我建立了这个程序,但在我继续的过程中并没有具体的计划。我得到的体系结构由5-6个大型Singleton对象组成,每个对象都处理程序的某个方面,例如数据库通信、web服务器、数据收集客户端和内部计算。

我觉得像这样使用几个单点程序并不能真正利用OO编程的真正好处,即它很容易地允许您创建许多相关的对象。我的单身汉也相当依赖于彼此,如果我长了很多这个程序(比如5万行),我可以看到我的方法变成了意大利面代码。

所以我想知道是否有更好的方法来构造我的程序。例如,我的单身汉是否应该是单独的模块?但是,我将如何处理在我的单例对象中组织得非常整齐的属性呢?还有其他的架构选择吗?

我对设计模式不是很熟悉( GOF的书在我的待办事项清单上),所以也许有一些设计和/或架构模式会对我的程序更好?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-10-14 08:44:55

单例被许多人认为是“邪恶的”,虽然单例模式有它的用途,但它们很少.我使用过几个大型代码库,并且几乎总是设法将它们从单个代码库中移开。

消除单身者的最简单方法是:

  1. 在单例之上引入一个接口:这使您可以将契约与实现分开,并减少与实际实现的耦合。
  2. 在单例中提供一个setter,这样就可以从unittest中设置单例实例:这允许您在单元测试中“交换”单例实例。
  3. 在您想要更改的类上创建单元测试:使用1中引入的接口的模拟和2中引入的setter,您现在可以在类上编写单元测试。
  4. 注入单例而不是静态地获得它:在依赖于您的单例的类中,有一种方法可以注入该单例(通过在1中创建的接口)。您可以使用构造函数注入,基于方法的设置器.任何对你有用的东西。这是您第一次真正接触您正在重构的类!3中引入的测试将帮助您在不破坏任何内容的情况下重构。

如果您想要“全在”,可以避免步骤2,但这种方法是最纯粹的,因为您避免更改任何没有测试的类,以检查是否有任何故障。就我个人而言,我觉得这有点过分,但是YMMV。基本的前提是,您将转向一个具有注入依赖项而不是静态获取的类。

而且,即使你有合法的单身用途,你仍然应该注射他们。单例就是要确保只存在给定类的单个实例。具有全局可访问的静态功能的经典模式实现了这一点,但不幸的是,由于web上浮动的示例代码很糟糕,这也使我们远离了注入该实例。有很多框架可以为您处理依赖项注入,其中大多数框架将有一种方法来配置对象,以便在整个应用程序中重用相同的实例,从而有效地使其成为一个单例。

票数 23
EN

Software Engineering用户

发布于 2015-10-14 08:42:57

对单身人士的恐惧被大大夸大了。如果您确实需要可靠的、确切地说是几个大型构造中的一个,那么拥有它们没有什么错。(如果您想编写静态模块,而语言不允许,那么这可能是语言的问题,而不是您的程序。)

反对单例的一个常见论点是,它们很难在单元测试中模拟。但是,只有当您在代码中硬编码他们的类时,这才适用。单例模式实际上关注的是确保只存在特定类的一个实例。没有人阻止您有几个服务接口的实现,每个实现都是一个单例,并根据业务和测试的需要,交换/注入/动态加载它们。

票数 12
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/299825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档