【问题标题】:OOP: Private methods vs new classOOP:私有方法与新类
【发布时间】:2014-03-25 06:26:13
【问题描述】:

如果这个问题已经回答了,请告诉我;我只能找到通常的“什么是公共/私人/受保护”问题!

所以这是我的问题: 何时使用私有方法,何时使用公共方法创建新类?

例子:

class MyActualWorker {
    public function work() {
        $this->helperMethod1();
        $this->helperMethod2();
    }

    private function helperMethod1() {
        ...
    }

    private function helperMethod2() {
        ...
    }
}

替代方案:

class MyActualWorker {

    public function __construct() {
        $this->helperObject = new HelperObject();
    }

    public function work() {
        $this->helperObject->helperMethod1();
        $this->helperObject->helperMethod2();
    }
}

什么时候用第一个例子,什么时候用第二个? 对我来说,第二个示例的主要优点是 UnitTesting 非常简单。

感谢您的任何回答!

【问题讨论】:

  • 如果您不需要重用其他类的方法,并且方法访问私有或仅对所属类可见的变量,则应使用私有方法。跨度>
  • @Ted 委派最常见的用途不是重用方法(这些方法应该只是公共的,可能是辅助类中的公共静态),而是能够在运行时交换实现。
  • 是的,但是在效果与所属类紧密耦合的情况下,交换也可以经常通过接口和继承来管理。 Java 使用对象委托来处理方法与所属类的耦合不是很紧密的大多数事情,而 C# 则更谨慎地使用它。其中一些是我认为的程序员偏好。但是如果您需要访问私有变量,我不建议您委托给其他对象,除非您确实必须这样做,然后您可以将值作为参数传递。
  • 此外,当您想将业务逻辑从 GUI 中拉出并进行整理时,委托给另一个类是一个好主意。见:en.wikipedia.org/wiki/Single_responsibility_principle

标签: php oop design-patterns architecture testunit


【解决方案1】:

通常,您使用第一个。

"Delegation Pattern"(使用子对象)是一种很好的方法,可以让您在运行时换出不同的方法实现 - 但如果您不需要它,那只是不必要的开销。

另一种常见的情况是我所说的“库方法”,即不与任何对象绑定但无状态的方法,只执行一些计算。这些可以被删除public static并移动到一个抽象类。但是,您不会为这种关系创建对象(只是具有静态方法的类),因此它与您的示例完全不同。

【讨论】:

  • 非常感谢。现在我有另一个问题:假设我想计算任何东西。在 Java 中,我知道 java.lang.Math 包含许多静态方法。到目前为止,这似乎很合乎逻辑。但现在我也可能是一个极端的 OOP 人,说:“嘿,只有计算器才能计算,所以让一个计算器对象提供所有这些方法!”。我知道这是多么的努力,但它似乎仍然是一种非常有效的方法......?
  • @TimJoseph 在 PHP 中,这些方法无需任何前缀即可使用,因为它并不总是能够执行任何 OOP。 most php wayof 这样做是使用命名空间 (php.net/manual/en/language.namespaces.php),但您也可以创建一个抽象类(就像它在 Java 中的样子),请参阅我的答案的第二部分)
  • @TimJoseph 你刚刚编辑了你的评论吗?无论如何,至于“硬核 OOP 方式”:使用单例模式。 en.wikipedia.org/wiki/Singleton_pattern
  • 是的,我不小心按下了提交按钮(编辑:现在又一次)。我明白你的意思!非常感谢!
  • 我很惊讶没有人谈论可测试性。在我看来,这是创建新课程时要考虑的因素。
猜你喜欢
  • 2017-03-11
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2021-04-27
  • 2020-05-21
  • 2018-07-08
  • 2018-03-01
相关资源
最近更新 更多