好的、坏的和丑陋的单身人士

在这篇笔记中,我将描述我和我的同事在处理各种(成功的和不那么成功的)项目时使用单例模式(外国文学中的单例)的经验。我将描述为什么我个人认为这种模式不能在任何地方使用,我还将描述团队中的哪些心理因素影响这种反模式的集成。献给所有跌倒和残废的开发人员,他们试图理解为什么这一切都始于一名团队成员带来了一只可爱的小狗,易于处理,不需要特殊的照顾和知识来照顾它,并以饲养的野兽结束劫持你的项目,需要越来越多的工时,消耗用户的神经和金钱,并为评估看似简单的实施创建绝对可怕的数字事情。


Wolf in sheep’s clothing by SarahRichterArt

故事发生在另一个宇宙,所有巧合都是随机的…

通过 Cat@Home 在家养一只猫

每个人在生活中有时都会有不可抗拒的想要抚摸猫的欲望。世界各地的分析师预测,第一家创建猫配送和租赁应用程序的初创公司将变得非常受欢迎,并且在不久的将来将被 Moogle 以数万亿美元收购。很快这种事就发生了。秋明州的一个人创建了 Cat@Home 应用程序,很快就成为了万亿富翁,Moogle 公司获得了新的利润来源,数百万压力重重的人们有机会请一只猫到他们家进一步熨烫并平静下来。

克隆人的攻击

来自摩尔曼斯克的一位极其富有的牙医 Alexey Goloborodko 对《福布斯》上一篇有关 Cat@Home 的文章印象深刻,决定他也想成为天文数字般的富有。为了实现这个目标,他通过朋友找到了一家来自 Goldfield &#8211 的公司。提供软件开发服务的 Wakeboard DevPops 向他们订购了 Cat@Home 克隆版本的开发。

获胜团队

该项目名为Fur&Pure,委托给一支由20人组成的才华横溢的开发团队;接下来我们关注一个5人的移动开发团队。每个团队成员都分担自己的工作,以敏捷和 Scrum 武装,团队按时(六个月内)完成开发,没有错误,在 iStore 中发布应用程序,在 iStore 中被 100,000 个用户评为 5,有很多关于应用程序有多棒、服务有多出色(毕竟是另类宇宙)的评论。猫熨好了,应用程序发布了,一切似乎都很顺利。不过,Moogle 并不急于斥资数万亿美元收购一家初创公司,因为 Cat@Home 中不仅出现了猫,还出现了狗。

狗叫,商队继续前进

应用程序的所有者决定是时候将狗添加到应用程序中,要求公司进行评估,并收到大约至少六个月的时间来将狗添加到应用程序中。事实上,应用程序将再次从头开始编写。在此期间,Moogle 将在应用程序中添加蛇、蜘蛛和豚鼠,而 Fur&Pur 将只接收狗。
为什么会发生这种情况?缺乏灵活的应用程序架构是一切的罪魁祸首;最常见的因素之一是单例设计反模式。

出了什么问题?

为了在家订购一只猫,消费者需要创建一个请求并将其发送到办公室,办公室将处理该请求并将猫寄给快递员,快递员将已经收到服务费用。
一位程序员决定创建一个类“Cat Application”;具有必要的字段,通过单例将此类带入全局应用程序空间。他为什么要这么做?为了节省时间(节省半小时的一分钱),因为公开应用程序比考虑应用程序架构和使用依赖项注入更容易。然后其他开发人员选择这个全局对象并将他们的类绑定到它。
例如,所有屏幕本身都访问全局对象“CatRequest”;并显示应用程序上的数据。这样,这样一个单体应用程序就被测试并发布了。
一切似乎都很好,但突然出现一位客户,要求将狗的请求添加到应用程序中。团队开始疯狂地评估系统中有多少组件将受到此更改的影响。分析结束时,我们发现有必要重做 60% 到 90% 的代码,以便让应用程序在全局单例对象中不仅接受“对 Cat 的请求”,还可以接受“请求猫”。而且还是“申请一只狗”,现阶段评估其他动物的添加已经没什么用了,应付至少两只。

如何防止单例

首先,在需求收集阶段,明确指出创建灵活、可扩展架构的需求。其次,值得对产品代码进行独立审查,并对薄弱环节进行强制研究。如果你是一名开发人员并且喜欢单身,那么我建议你在为时已晚之前醒悟过来,否则肯定会失眠和神经紧张。如果您正在开发一个具有大量单例的遗留项目,请尝试尽快摆脱​​它们或项目。
您需要从单例全局对象/变量的反模式切换到依赖注入–最简单的设计模式,在初始化阶段将所有必要的数据赋予类的实例,而无需进一步绑定到全局空间。

来源

https://stackoverflow。 com/questions/137975/what-is-so-bad-about-singleton
http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
https://blog.ndepend.com/singleton-pattern-costs/

Leave a Comment

Your email address will not be published. Required fields are marked *