在类中查找隐式通信

问题描述:

我目前正在重构C++中非常有用但设计不佳的类,并且遇到了设计问题:将数据传递给方法,数据通过设置传递类中的私有状态变量。这使我很难理解数据如何在函数中移动。这是我的周末任务,尽可能地尝试去除这种传递数据的风格,因为程序根据方法签名很难理解,因为签名只能告诉部分故事。我决定在类中查找隐式通信

我目前的做法,以测试方法使用私有类级变量传递的是以下几点:

  1. 编辑方法,使之成为功能,而不是一个方法,它删除其访问到类中的状态变量。
  2. 编辑所有对该方法的调用,以便它们调用该函数而不是方法。
  3. 编译,看看有没有什么问题。制作访问者列表以添加到原始类中。
  4. 运行单元测试,看看我是否以非常微妙的方式破坏了任何东西。

有没有更好的方法来做到这一点,也许有一个可以轻松自动化?如果我向其他人展示这个重构技术,我可以引用一个众所周知的技术吗?

这个问题,我已经迄今发现的唯一一提的是通过Object-oriented programming Wikipedia entryCoders at Work这句话:

“面向对象语言的问题是,他们已经得到了他们携带所有这些隐含的环境你想要一根香蕉,但你得到的是一只持有香蕉和整个丛林的大猩猩。“ - 响应一个很好的问题乔·阿姆斯特朗

编辑从Oli Charlesworth

我明白OOP的一点是,有时通过类的状态变量通信。我目前的情况的困难在于,目前该类中有78个不同的数据成员,其中许多是对其他数据类型的键 - 值对的字符串对,并且它们需要被初始化的顺序存在未记录的隐式依赖关系。有可能给一个足够聪明的程序员处理这个类很容易,但对我来说目前非常困难。我认为这些数据类型中的一些可以抽象成它们自己的类,但是在我能够做到这一点之前,我需要更清楚地理解数据成员之间如何进行交互。

+4

我不知道我明白了!数据传入和传出的位置在哪里?在某些时候,大多数类成员函数将最终访问成员变量,否则没有意义的是他们在类接口中。你的目标是避免物体状态?你可以举一些当前代码的例子,以及重构后你想要的样子吗? – 2010-11-27 19:06:52

+1

我与@Oli--有人为了创建一个既有属性又有方法的类,遇到了很多麻烦,并且这些方法对这些属性起作用,并且将它们全部分开。你会采取日期,并且所有的方法都采取“自拂晓以来的时间”,因为在SetMonth()和GetDayOfWeek之间存在隐藏的通信? – 2010-11-27 19:26:03

鉴于澄清的问题我“你确定它不只是你不喜欢其他程序员的风格”的评论去世死亡;)

个人而言,我只希望重构正常。也就是说,有78个数据成员和很多相关的位,但不是在他们自己的类中,我会先分组相关数据并提取对其有用的功能。没有必要,恕我直言,经历一个阶段,您明确地将数据传递到现有类中的函数。只需选择一组相关的数据项,拿出一个体面的名字,将它们提取出来,找出它们在哪里使用以及如何将功能移到新课程中。

理想情况下,我会开始为主类和新的分类课开始编写单元测试。

而不是让所有的方法的调用者调用该函数,一个较小的中间变化就是为所有调用者保留该方法,并通过调用该函数来简单地进行委托。稍后,您可以内联方法调用,以便所有调用者直接调用该函数。

此外,从您的描述中,您听起来像是用手动测试来解决这个问题。尽管您所描述的代码很难进行单元测试,但您将获得更好的成功(更轻松地进行重构,并降低错误风险),并具有全面的单元测试。尽管如此,还是需要更多的测试自动化。