我目前正在使用C ++重构一个非常有用但设计不佳的类,我遇到了设计问题:相反使用方法传递数据,通过设置私有状态变量来传递数据。类。这使我很难弄清楚数据如何通过函数移动。这是我的周末任务,尝试尽可能地删除这种传递数据的方式,因为只使用方法签名使程序无法理解,因为签名只能说明故事的一部分。我决定了
我目前测试方法是否使用私有类级别变量进行通信的方法如下:
有没有更好的方法来做到这一点,或许可以轻松实现自动化?这种重构是一种众所周知的技术,如果我向其他人展示,我可以引用它吗?
到目前为止我唯一提到的这个问题是来自Coders at Work Object-oriented programming Wikipedia entry的引用:
“面向对象语言的问题在于他们已经拥有了所有这些随身携带的隐含环境。你想要一个香蕉,但你得到的是拿着香蕉和整个丛林的大猩猩。” - 乔阿姆斯特朗
根据Oli Charlesworth提出的问题进行编辑:
我理解OOP的重点是有时通过类的状态变量进行通信。我当前案例的困难在于,类中当前有78个不同的数据成员,其中许多是与其他数据类型的字符串的键值对,并且对于需要初始化它们的顺序存在未记录的隐式依赖性。有一个足够聪明的程序员可以很容易地使用这个类,但这对我来说很难。我认为其中几种数据类型可以被抽象到自己的类中,但在我能够做到这一点之前,我需要更清楚地理解数据成员之间如何相互作用。
答案 0 :(得分:2)
鉴于问题中的澄清我“你确定这不只是你不喜欢其他程序员的风格”评论死了;)
就我个人而言,我只是正常重构。也就是说,78个数据成员和许多位相关但不属于他们自己的类,我首先将相关数据分组并提取其上的功能。恕我直言,没有必要经历一个阶段,你明确地将数据传递给现有类中的函数。只需选择一组相关的数据项,提出一个不错的名称,提取它们并找出它们的使用位置以及如何将功能移动到新类中。
理想情况下,我开始为主课程和新课程编写单元测试...
答案 1 :(得分:1)
不是让所有方法的调用者调用该函数,而是一个较小的中间更改是将方法留给所有调用者,并让它通过调用函数简单地委托。稍后您可以内联方法调用,以便所有调用者直接调用该函数。
另外,根据您的描述,听起来您正在接近手动测试。通过全面的单元测试,您将获得更好的成功(更容易重构,降低错误风险),尽管您描述的代码当然难以进行单元测试。然而,努力实现更多的测试自动化。