2012-03-10 60 views
4

此应用程序的编写没有任何设计原则(SOLID)的知识由以前的开发人员。该应用程序最关键的问题是,它有上帝的类,有很多很多的switch语句。这种不明智的结构使得难以维护应用程序。当然,根本没有单元测试。过程或步骤来重构C++遗留应用程序中的神类?

首先在switch语句中,我发现在应用程序中有两个主要的潜在类。所以我会尝试首先构造这两个类,并将相应的代码移动到上帝类的类中。这是一个正确的方式吗?什么是一个很好的过程来解决这个问题?

BYW,我有这本书“有效地工作与遗产代码”。所以你可以建议本书的哪一部分我也要阅读:-)

+1

很简单,你将上帝的部分代码移动到天地,你从中得到一个耶稣。 – orlp 2012-03-10 14:25:23

+0

@nightcracker难道不是每个班级都应该依赖的另一个上帝班吗? – 2012-03-10 14:30:10

+0

神级的定义? – Kevin 2012-03-10 14:43:22

回答

2

开关是一个明显的重构目标。但也可能有其他人。你让我们继续下去。

我经常花大量的时间来处理代码,重写代码以便我可以改变注释/取消注释几行所使用的类型。

对于enum上的swich,定义一个包含一个成员的结构是非常有用的:枚举值,并隐式转换为枚举值。使用typedefs或宏,你可以确保你的新类型被传递,而不是枚举。如果有不良副作用,恢复,修复实施,并尝试使用你的新类型。

接下来,将开关代码移动到新类型的成员函数中,一次一个开关。

如果在这个过程中需要单元测试取决于你。

+0

我明白开关有时是必要的,可以是字典。但是我的意思是我需要类层次结构而不是它,以便我可以在类初始化中使用switch语句而不是在任何地方。是的,我同意我的问题写得很差,但我无法真正描述代码的所有结构,特别是当它以无序的方式编写时。 – 2012-03-10 15:40:43

+0

我的建议可以让你创建一个层次结构。但我推迟到最后。我认为这样更安全。 – 2012-03-10 15:45:28

+0

了解你在说什么。清单将更清晰但没有投诉。谢谢! – 2012-03-10 15:55:38

3

什么是一个很好的过程来解决这个问题?

“不修复它,如果它没有损坏”。

好的过程是让问题独立,直到您必须处理它或除非您被命令重构代码。这听起来不像你的情况是这样。

这种推理背后的理由非常简单:突然出现的完美主义(“让我们变得更好,更干净,更光滑”)可能会让您在未来6个月的生活中付出代价,无任何奖励(满意度不值得,因为这样的事情很快就不会令人满意了)。在这个过程中,你会引入多个新bug,并且可能至少破坏整个系统一次,所以会有一段时间你有大的代码库不起作用。整件事会增加工作量,并可能给你带来严重的压力,从而导致健康问题。除非你被赋予了重构代码的任务,并且保证了可观的回报,否则不要强调要“为了更好的”而改进代码库 - 这种想法可能会导致适得其反。

把整个事情放在允许快速分支/合并(git)的版本控制之下。因为你没有提到版本控制,所以按照墨菲定律,我不得不假设你没有使用它。

专注于需要解决的即时错误。在与您一起工作的领域中,改进代码以使其符合您最喜欢的风格,但保持最小化,并且不要触及与即时问题无关的任何事情。如果你有这种感觉,当你有空闲时间很多时,开始在必要的地方实施测试(与流行的观点相反,单元测试不是银色的子弹)。一旦你有一些方法来测试该应用程序仍然有效,创建单独的开发分支,并开始修改代码非常缓慢,只有当你有时间。尽可能避免将更改合并回主分支(包含未修改的旧版代码),直到您确定所有内容均正常工作。

请记住,您的目标不是完善的代码。 您的目标是使用最少量的资源(时间/精力)为当前问题提供快速高效的解决方案,同时获得工作的最大回报。根据我的经验,偏离这个原则是非常不健康的。

维持和改善现有的旧的代码基本上大致相当于重建3英尺高卡房的底层。即这是具有挑战性的,乏味的,冒险的,但并不能提供必要的情感满意度。所以除非有某种重要的奖励,否则尽可能避免这样做是有道理的。代码不会腐烂,所以如果现有的工作正常,没有理由修改它,只是因为你不喜欢当前源代码的外观。

但是,阅读代码并尝试理解以前作者的想法并更好地理解程序结构将是一个好主意。这从长远来看可能会得到回报。

+0

优秀的答案! +1 – lurscher 2012-03-10 16:05:40

+0

感谢您的回答。你听起来像我以前的老板之一,我的意思是一个好方法。我完全同意你的观点,“如果不能解决问题,不要解决问题”,我根本不是完美主义者。但问题在于,在其中添加/测试新代码变得越来越困难。因此,无需谈论测试,潜在的一小时编码工作就变成了几天的工作。在这种情况下,你认为没有变化仍然很好吗? – 2012-03-10 16:10:07

+0

@Paul:在这种情况下,将更改保持在最小限度并将其限制在您直接使用的区域内仍然是一个更好的主意。如果你觉得有必要进行大规模的重构,你可能想与你的上司讨论,而不用糖 - 涂层程序的风险。大规模修改的问题在于,在几个月后会发现将通过单元测试套件发现的错误。另外,如果代码库很大,试图单独重构它(您没有提到同事或其他开发人员)变得更加冒险,因为您将无法记住所有细节。 – SigTerm 2012-03-10 16:26:36

相关问题