【问题标题】:abstract classes and validation methods抽象类和验证方法
【发布时间】:2011-02-23 03:26:20
【问题描述】:

面向您的介绍性 OOP 问题:

情况:我想要一个带有公共设置器和抽象验证器的抽象类,因为每个孩子都会以独特的方式验证该属性。

代码:

abstract class Parent {
    public function setName($name) {
        if (validateName($name)) {
            $this->_name = $name;
        } else {
            // error msg
        }
    }

    abstract public function validateName($name);
}

class Child extends Parent {
    public function validateName($name) {
        // ensure name gits this child's requirements
    }
}

问题:这是一种“合法”的设计方法吗?我想既然setName方法对于每个子类都是一样的,它应该是父类中的公共方法,但验证器应该是抽象的,以强制子类实现它。

我只是从概念上在纸上勾勒出来......

【问题讨论】:

  • 人们习惯于简化他们的例子,以便其他人可以快速找到问题的根源。通常这很好,但是对于询问最佳 OOP 实践的问题,了解确切的上下文是什么变得至关重要。类旨在表示事物;在不知道这些东西是什么的情况下,没有什么可以设计一个类。
  • 在法律上,法律试图与正义相匹配。在物理学中,法律可以是袭击孤儿院的电锯杀人狂。编程中的合法性更像是物理学中的合法性。
  • 真的没有那么多,尽管我很感谢您在下面的反馈。再多一点数据就是Parent 类是一个通用的游戏类,我们想要设置获胜方。子 GameA 只有 2 个边,因此有效的获胜边将是 1、2 或 0(平局)。 GameB支持8人,可以有平局,也可以是个人获胜,也可以是2人或3人获胜的团队。所以,我想在父级中定义 setter 并让子级决定验证。这对我来说似乎是合乎逻辑的,但我只是将我的小脚趾浸入 OOP。

标签: php oop parent-child abstract


【解决方案1】:

是的,这是一种有效的方法,尽管您的语法不完善:

        if (validateName($name)) {

应该是这样的:

        if ($this->validateName($name)) {

但如果这是架构的范围,为什么不直接定义抽象的setName() 来验证和设置它?像这样:

interface Parent {
    public function setName($name);
}

class Child implements Parent {
    public function setName($name) {
        if (/* $name is valid */) {
            $this->_name = $name;
        } else {
            // error message
        }
    }
}

我这里当然用了接口,因为Parent里面没有代码。

但请注意,这取决于您的程序结构。无论哪种方式,我都必须至少看到程序架构的图表。

【讨论】:

  • 你好乔纳。谢谢你的回答。你能否澄清你以why not just...开头的建议——我没听懂你的意思。
  • 这种变化有不同的含义,乔纳,但我并不是说它是错误的。在原始版本中,父级强制执行设置参数的过程(并且该方法应定义为 final)。随着您的更改,孩子需要以任何它想要的方式设置参数(或选择不设置)。希望这有助于澄清差异,Andrew Heath。
  • 我理解 Jonah 提供的接口派生替代方案,因为现在有一些示例代码。无论如何,他回答了我最初的问题并提出了一个额外的想法。谢谢你们俩!
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多