【问题标题】:php OOP: Doing something in a class's constructor vs calling a private method to do the same thing [closed]php OOP:在类的构造函数中做某事与调用私有方法做同样的事情[关闭]
【发布时间】:2014-04-01 16:10:05
【问题描述】:

在阅读各种教程时,我注意到这两种不同的方法,我很好奇幕后发生了什么。

第一种方法在构造函数中做所有事情——所有事情都是设置变量,或者在这种情况下调用类的方法来做某事。第二种方法在构造函数中调用私有方法来做同样的事情。什么时候一种方式优于另一种方式?我知道微优化是邪恶的,但是在学术层面上调用私有方法会慢一点吗?

这是第一种方法的代码示例(这是一些 zf2 代码):

class LoginForm extends Form
{
    public function __construct($name = null) {
        // we want to ignore the name passed
        parent::__construct('login-form');

        $this->setAttribute('method', 'post');

        $this->add(array(
            'name' => 'username',
            'attributes' => array(
                'type'=> 'text',
            ),
            'options' => array(
                'label' => 'User Name',
            ),
        )); ...

VS 这个:

class LoginForm extends Form
{
    public function __construct($name = null) {
        // we want to ignore the name passed
        parent::__construct('login-form');

        $this->setAttribute('method', 'post');

        $this->addElements();
    }
    private function addElements() {
        $this->add(array(
            'name' => 'username',
            'attributes' => array(
                'type'=> 'text',
            ),
            'options' => array(
                'label' => 'User Name',
            ),
        )); ...

不明白为什么会被标记。我没有问哪种方式更好我看到了一些我不完全理解的东西,想听听一些可能的原因为什么一个程序员可能会用一种方式来做,而另一个以另一种方式做到了。接受的答案对我很有帮助,因为它还指出了一种方法可能可能出现的设计问题。

【问题讨论】:

  • 保持构造函数简单是个好习惯。
  • 我认为大多数人会倾向于第二种方法以提高可读性。如果 addElements 公开,你的重构就会减少。
  • 所以它主要是为了可读性?这是有道理的。
  • 我同意,第二种方法很可能是首选。不仅是为了可读性,也是为了可扩展性。
  • 是不是更慢了——再次只是为了满足我的好奇心。我知道这么微小的性能优势不值得造成无法维护的混乱。

标签: php oop constructor


【解决方案1】:

构造函数中的私有函数调用是代码异味的症状。要么函数很长——这就是你首先想要函数调用的原因——要么构造函数正在做一些它不应该做的事情。

在这种情况下,setAttributeaddElements 似乎正在为对象设置一些默认值。还有其他方法可以实现这一点。

具体来看这个案例,您可能会争辩说LoginForm 不应该是一个类。相反,你可以有一个函数:

function create_login_form() {
    $form = new Form();
    $form->setAttribute("method", "post");
    // etc
    return $form;
}

更仔细地查看这段代码:它似乎是某种 HTML 包装器,但......值得怀疑。 HTML 非常擅长它的功能。它是一种 DSL(领域特定语言)。 LoginForm 与 DSL 的原始概念相去甚远。

如果你更进一步,你会得到:

function create_login_form() {
    $form = new HTML_Element("form");
    $form->setAttribute("method", "post");
    // etc
    return $form;
}

这对我来说看起来很合理。

【讨论】:

  • 这更像是一个意见而不是一个答案。
  • 问题是征求意见。欢迎您将其标记为离题。
  • 您可能是正确的,LoginForm 不是最好的方法。我已经有一段时间没有使用 ZF2 了,但它肯定会让你以某种风格编写代码。代码异味可能是 ZF2 的症状,而不是 OP 的代码。
  • 很好的答案。可能是“固执己见”,但你说得很好。作为新手,我没有看到太多代码,因此这是识别可能的代码气味的好技巧。正如 pbible 所建议的,这实际上是如何在 zf2 应用程序中实现 Zend\Form 的典型示例。开始理解为什么许多开发人员说 zend 臃肿。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2018-05-18
  • 2020-09-28
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多