我目前正在处理一段代码,其中逻辑和数据访问都存在于GUI类中.显然,我想改善这种情况.
目前的结构基本上是:
泥的大球
最终目标是实现类似DDD的结构:
DAL
领域模型
服务层
演示模型
GUI
那么,你会如何解决这个问题呢?
大爆炸
定义最终状态的结构并将代码推送到其最终的主页.
分而治之
尝试将大球泥分成两块.重复直到完成......
绞杀
扼杀课程(如http://martinfowler.com/bliki/StranglerApplication.html中所述)
Aaron Digull.. 16
永远不要尝试"大爆炸".它几乎总是吹在你的脸上,因为当其他一切都失败时,它是一种高风险,绝望的措施.
分而治之:这很有效......如果你的世界只有两面.在真正的软件中,你必须同时征服这么多的战线,你很少能够生活在黑白幻想中.
我想我在职业生涯的大部分时间里都在使用类似"扼杀"的东西:逐渐将糟糕的旧代码变成闪亮的新代码.这是我的食谱:
从某处开始,在哪里并不重要.编写一些单元测试,以了解代码的真实行为.找出它做你认为它做什么的频率和不经常做的频率.使用您的IDE重构代码,以便您可以测试它.
在第一天之后,猜猜你是否已经开始在正确的地方将这个怪物分开.如果是这样,继续.如果没有,找一个新的地方重新开始.
这种策略的优点:它可以在很小的步骤中工作,因此可以控制风险,如果出现问题,如果必须在上周你一直在处理的代码中.
缺点:需要花费大量时间而且你会感到沮丧,因为通常情况下,进展只会看起来如此缓慢,直到"结"突然出现,突然间,一切都开始就像魔术一样落到了位置.
永远不要尝试"大爆炸".它几乎总是吹在你的脸上,因为当其他一切都失败时,它是一种高风险,绝望的措施.
分而治之:这很有效......如果你的世界只有两面.在真正的软件中,你必须同时征服这么多的战线,你很少能够生活在黑白幻想中.
我想我在职业生涯的大部分时间里都在使用类似"扼杀"的东西:逐渐将糟糕的旧代码变成闪亮的新代码.这是我的食谱:
从某处开始,在哪里并不重要.编写一些单元测试,以了解代码的真实行为.找出它做你认为它做什么的频率和不经常做的频率.使用您的IDE重构代码,以便您可以测试它.
在第一天之后,猜猜你是否已经开始在正确的地方将这个怪物分开.如果是这样,继续.如果没有,找一个新的地方重新开始.
这种策略的优点:它可以在很小的步骤中工作,因此可以控制风险,如果出现问题,如果必须在上周你一直在处理的代码中.
缺点:需要花费大量时间而且你会感到沮丧,因为通常情况下,进展只会看起来如此缓慢,直到"结"突然出现,突然间,一切都开始就像魔术一样落到了位置.
我从来没有听说过"扼杀者应用"这个词 - 我喜欢它.在可能的情况下,这总是一个很好的方法,它确实可以最大限度地降低风险并且非常务实,一点一点地削减大型建筑.
在我的经验中不起作用的地方是需要立即进行合理重大的更改 - 需要进行一些重构(或大量黑客攻击)的更改.在那种情况下,我经常发现我需要做的改变是在泥球大的核心,没有选择,但变脏 - 即使应该是标准维护或轻微的增强变化只是可怕的和主要的重构是最好的选择.
对于那些情况,我会分而治之 - 我一直瞄准的第一个目标是可测试性,一旦你完成所有其他事情就更容易了.事实上,这通常是我从重大泥浆中重构的主要驱动因素之一 - 这种代码通常几乎无法测试,希望有一些示例UI输入和输出,但有时甚至会丢失.
因此,当面对将所有内容集中到UI中的代码时,我通常首先将离散的功能单元分解为类和方法,然后将这些代码部分下推到域或服务层.一点一点地做到这一点大大降低了破坏某些东西的可能性,并且当事情出错时更容易确定破坏代码的位置.
运行在每次更改结束时可用的任何测试用例,并确保您仍在满足某种基线.
如果你去编写好的单元测试,你可以开始减少问题的规模,我发现采用扼杀者的方法很快变得切实可行 - 通过适当的单元测试或者至少是正确的框架来允许写出正确的单元测试逐渐替换部分功能变得更加实用.