使用动态类型语言进行重构

Lov*_*ode 9 ruby refactoring dynamic

好吧,我不是想在这里开始一场火焰战争,我知道静态语言和动态语言之间的争论已被多次删除,包括这里.但我有一个非常实际的问题,希望这里有人可以提供一些启示.抱歉长度,但这不是一个简单的问题,可能不是一个简单的答案.

Ruby,PHP和Javascript现在是非常流行的语言,他们有很多人为他们辩护,并认为动态类型不会让开发人员退缩.我是这些语言的新手,并希望开始将它们用于更大的项目,但这里是一个基本的重构场景,一直在工作(work == C#),我想知道这种方法是什么Ruby - 我之所以选择Ruby是因为它是OO.

好的,我正在使用Ruby,我构建了一个Customer对象.它具有从数据库加载/保存/删除的方法.很好,人们使用它.我为其他东西添加了更多方法,人们更多地使用它.我添加了一种基于某些参数计算订单历史的方法.到目前为止,这个类正在整个系统中使用.然后,有一天我决定更改GetOrderHistory方法的参数.所以我:

  • 将新参数添加到方法中
  • 重写方法的代码以使用新参数
  • 更改我想到的客户端代码以传递新参数并使用此修改后的方法

但现在呢?我有几十个/几百个/谁知道系统中有多少其他需要更改的地方.在像Ruby或Javascript这样的动态OO语言中,我该怎么做呢?

在我的头脑中,我不太了解Ruby,我可以想到两个愚蠢的答案:

  1. 100%代码覆盖率.我测试整个应用程序,每次打破我看看是否是那个方法并修复它
  2. 查找和替换.我使用文本搜索来查找该方法.但是我可以使用相同方法名称的其他对象.

对此有一个很好的答案吗?看起来IDE会很难.如果我有代码如

c = Customer.new
Run Code Online (Sandbox Code Playgroud)

它能够弄明白,但如果是的话

c= SomeFunctionThatProbablyReturnsACustomerButMightReturnOtherThings()
Run Code Online (Sandbox Code Playgroud)

那么Ruby专家在这种情况下采取什么方法?

Chu*_*bas 3

您将听到的强有力的论据之一是您应该事先编写测试。从理论上讲,这将准确地向您展示应用程序需要更改的位置,以防其他情况发生变化。

但这只是冰山一角。Ruby 的设计遵循一定的指导原则,例如简短、富有表现力的函数、模块中的职责划分、不重复代码 (DRY)、最少意外原则等;加上一组推荐的实践,例如首先测试、将参数作为散列选项传递、明智地使用元编程等。我确信其他动态语言也能做到这一点。

如果c不是客户,那么至少我希望表现得像客户一样。IDE 可以查找鸭子类型,这比检查特定类的实例更灵活。

一些 IDE(至少 Rubymine)也会查找约定。例如,在 Rails 应用程序中,Rubymine 会转到架构文件并将模型属性作为方法添加到数据库中。它还可以识别关联(has_many、belongs_to 等)并动态添加 Rails 在后台生成的相应方法。

现在,这几乎减少了重构的需要,至少将其保持在最低限度。但肯定解决不了。而且我认为这无法解决。