Jas*_*ker 6 oop singleton design-patterns anti-patterns god-object
情况就是这样:我的课程做得太多了.它主要用于访问配置信息,但它也具有数据库连接.它是作为一个单独实现的,所以这也使单元测试变得困难,因为大多数代码与它紧密耦合.这甚至更成问题,因为它创建了一个导入时间依赖项(我们在Python中这样做),这意味着某些模块必须按特定顺序导入.理想情况下,我想将它分成两个类,并使其成为非单例.
幸运的是,我的雇主已经热心这样一个事实,即这种测试是好的,如果它使代码更容易测试,我愿意允许我做这样的改变.但是,我怀疑他们是否愿意让我花太多时间在上面.而且我宁愿逐步修复它,而不是试图过于激进.
所以,我在这里看到三个选择:
那我该怎么办?
没有看到你的代码就很难知道,但为什么不做你说的话 - 逐步做到这一点?首先执行步骤1,拆分数据库.
如果这很快就回去了,你现在只有一个较小的物体停止成单身而不是2.所以第2步应该更快.或者在这个阶段,您可能会看到一些其他代码可以从单例中重构.
希望你可以逐步减少单身人士中的内容,直到它消失,而不必在任何一步上缴纳巨额的时间税.
例如,如果配置的各个部分是独立的,那么配置中的一部分可能一次单独进行.因此,在重构文件配置时,GUI配置可能会留下单例,还是类似的?
我认为你有望分成两个班级.您可能需要考虑使用工厂根据需要创建数据库上下文/连接.这样,您可以将连接视为根据需要创建/处置的工作单元,而不是在对象的生命周期内保持单个连接.但是YMMV.
至于配置,这是我发现单身人士可能是正确选择的一种情况.我不一定会抛弃它只是因为它很难进行单元测试.但是,您可能需要考虑构建它以实现接口.然后,您可以使用依赖项注入在测试期间提供接口的模拟实例.如果注入的值为null,则构建生产代码以使用单例实例或注入单例实例.或者,您可以构造类以允许通过私有方法重新初始化,并在setup/teardown测试方法中调用它,以确保它具有适合您的测试的配置.我更喜欢前者到后者的实现,但是当我没有直接控制接口时我也使用过它.
逐步进行更改肯定是要走的路.如果可能的话,用测试包装当前的功能,并确保在修改后仍然通过这些测试(当然,不是那些直接处理修改的测试)是确保你不破坏其他代码的好方法.