在类设计中,如果一个方法在同一个类中调用另一个方法,这是一个坏习惯(例如,3个方法在同一个类中调用1个方法)。
由于
答案 0 :(得分:3)
完全没有,如果您正确设计了课程,那就是预期的。你应该有一个小的公共接口,如果实现很复杂,你可能最终会在同一个类中调用许多私有方法。
事实上,不这样做可能是一种反模式。如果你经常调用另一个类的方法,那就叫做Feature Envy,你应该把它们组合起来。如果你把所有的实现都放在一个巨大的功能中,那就是不可维护的,并且可能包含很多代码重复。
将事情分解为其他可重用的方法是一件好事。您调用相同方法的3种方法的情况是完美的代码重用。如果在每个调用函数中复制了那个函数的代码,那将是非常糟糕的。
答案 1 :(得分:1)
方法只是函数和函数,是代码重用和设计改进的抽象。如果一个类的三个方法在运行时需要做同样的事情,他们应该为此复制粘贴代码还是调用一个单独的方法?
将一些有意义的代码部分分成一个被其他方法调用的方法,这只是代码重用的另一个例子,除非你真的过度使用它。
答案 2 :(得分:1)
没有。您似乎找到了有效的用途来维护DRY principles。
答案 3 :(得分:1)
没有。事实上,这是一个很好的做法。或者您认为执行调用的三种方法应该每次都复制被调用的代码吗?
答案 4 :(得分:0)
完全没有。事实恰恰相反。方法是完成特定的任务,你应该使用它们。
答案 5 :(得分:0)
是的,如果这些方法可以覆盖,即类和/或方法不是最终的。原因是尝试覆盖行为或提供服务层的子类无法可靠地执行此操作,因为可以多次输入该层。
示例(Scala伪代码),我们假设HashSet.addAll
调用自己的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
时,我们现在最终重复计算。