代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

方法调用同一类中的其他方法

  •  0
  • GurdeepS  · 技术社区  · 14 年前

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

    谢谢

    6 回复  |  直到 13 年前
        1
  •  1
  •   anon    14 年前

    不,事实上,这样做是很好的做法。或者您认为执行调用的三个方法都应该复制被调用的代码?

        2
  •  3
  •   Tesserex    14 年前

    一点也不,如果你已经设计好了你的类,这是可以预料的。您应该有一个小的公共接口,如果实现是复杂的,您可能最终会在同一个类中调用许多私有方法。

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

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

        3
  •  1
  •   sharptooth    14 年前

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

    将代码的一些有意义的部分分离成一个被其他方法调用的方法,这只是代码重用的另一个例子,除非你真的做得过火了,否则这是很好的。

        4
  •  1
  •   spender    14 年前

    不,您似乎找到了维护 DRY principles .

        5
  •  0
  •   MaLio    14 年前

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

        6
  •  0
  •   nilskp    13 年前

    是的,如果这些方法是可重写的,即类和/或方法不是最终的。原因是,试图重写行为或提供服务层的子类不能可靠地做到这一点,因为可以多次输入该层。 示例(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 我们现在结束了重复计数。