0

在类设计中,如果一个方法调用同一个类中的另一个方法(例如,3个方法调用同一个类中的1个方法)是不是一个坏习惯。

谢谢

4

6 回答 6

3

一点也不,如果你正确地设计了你的课程,这是可以预期的。你应该有一个小的公共接口,如果实现很复杂,你可能最终会在同一个类中调用许多私有方法。

事实上,这样做可能是一种反模式。如果您经常调用另一个类的方法,则称为 Feature Envy,您可能应该组合类。如果您将所有实现都放在一个庞大的函数中,那将是不可维护的,并且可能包含大量代码重复。

将事物分解为其他可重用的方法是一件好事。您调用同一个方法的 3 个方法的情况是完美的代码重用。如果该函数的代码在每个调用函数中都重复,那将是非常糟糕的。

于 2010-05-28T13:26:02.340 回答
1

方法只是函数,函数是对代码重用和设计改进有用的抽象。如果一个类的三个方法在运行时需要做同样的事情,他们应该复制粘贴代码还是调用单独的方法?

将一些有意义的代码部分分离到一个由其他方法调用的方法中只是代码重用的另一个例子,除非你真的过度使用它。

于 2010-05-28T13:23:15.317 回答
1

不,您似乎找到了维护DRY 原则的有效用途。

于 2010-05-28T13:23:55.980 回答
1

不。事实上,这样做是一种很好的做法。或者你认为你的三个调用方法都应该重复被调用的代码?

于 2010-05-28T13:24:32.177 回答
0

一点也不。事实上恰恰相反。方法是用来完成特定任务的,你应该准确地使用它们。

于 2010-05-28T13:24:53.753 回答
0

是的,如果这些方法是可重写的,即如果类和/或方法不是最终的。原因是试图覆盖行为或提供服务层的子类不能可靠地做到这一点,因为可以多次输入该层。我们假设HashSet.addAll调用它自己的示例(Scala 伪代码) HashSet.add

class MemCountingSet[T] extends HashSet[T] {
  private def sizeOf(t: T) = ...

  private var memCount = 0

  def add(t: T) = {
    memCount += sizeOf(t)
    super.add(t)
  }
  def addAll(coll: Collection[T]) = {
    memCount += coll.foreach(sizeOf)
    super.addAll(coll)
  }
}

使用时,addAll我们现在最终会重复计算。

于 2012-01-02T19:27:58.060 回答