我应该把“丑陋”放在哪里?

时间:2008-10-16 00:06:38

标签: language-agnostic refactoring

场景:我有一个我需要以某种方式调整的功能(例子;让它在不同的地方稍微有所不同)。出于某种原因,我最终不得不在代码中添加丑陋的东西,无论是在函数中还是在现有的调用站点上。假设两种情况下总和“难看”是相同的。

问题是我应该选择哪个选项?为什么?

我应该封装它,所以我不需要查看它,或者我应该提取它以便它不会为函数添加语义垃圾?

您的选择会受到什么影响?怎么样:

  • 除了从当前位置以外,“永远”不会调用该函数。
  • 对该功能的新调用不需要“丑陋”。
  • 此功能现在非常干净和通用
  • 该功能已经成为一项黑客工作。
  • 你写了这个函数
  • 你没有怀疑这个功能

5 个答案:

答案 0 :(得分:5)

把丑陋的东西放在功能中,放下手。如果这是在C ++中,请确保在.cpp文件中具有实现。也许您可以考虑编写两个函数来从主函数体中抽象丑陋。

程序/ OOP编程的存在是为了将“丑陋”带出界面(除此之外)。重要的是要意识到调用函数所需的代码越多,它变得越不实用。还要记得清楚地记录代码,并注意到那里存在丑陋的代码以及原因。

此外,如果此功能足够大,您可以考虑将其放在自己的.cs文件或.cpp / .h对中(取决于您使用的语言)。

答案 1 :(得分:3)

如果新呼叫者不需要丑陋,那么我会将丑陋的内容封装在新的函数/帮助器中,并从旧呼叫者处调用它,这样就不会污染新呼叫者的现有功能,并且不会在旧的来电者之间重复。

如果新调用者永远不需要它,那么我会将它添加到函数中(如果它在函数的上下文中有意义),因为它本质上是一个遗留组件,只要你可以适当地测试功能

最重要的是,我尝试尽量减少在多个呼叫者之间没有重复并尽量减少新代码暴露的丑陋。我将它封装到可以进行单元测试的程度。

谁写的不会影响我的决定。

答案 2 :(得分:0)

我会亲自把它放在函数声明中 - 我无法理解如何将它放入函数调用中会“不那么难看”,因为你可能(至少,你暗示)你会有不止一次地使用“丑陋”。

答案 3 :(得分:0)

我将丑陋的封装在封装函数中并更改需要丑陋的所有函数来使用包装器。

//old call
call_some_function_with_ugly(params, case)

// new call
call_some_function(params)

void call_some_function(params){ }

void call_some_function_with_ugly(params, case){
    // do ugly depending on case
    switch(case) { ... }

    call_some_function(params);
}

答案 4 :(得分:0)

绝对把丑陋放在功能中。你可以做的最糟糕的事情之一就是在整个代码中散布丑陋,在许多不同的实例中它将被隔离。一旦丑陋以某种不可预见的方式发生变化(丑陋经常发生),这些将无法追查。

当然,最好的选择是首先没有任何丑陋......你现在想到的是什么特别的例子?