абстрактные классы и методы проверки - PullRequest
1 голос
/ 23 февраля 2011

Вводный вопрос ООП для вас:

Ситуация: Я хочу абстрактный класс с открытым сеттером и абстрактным валидатором, поскольку каждый дочерний элемент будет проверять это свойство уникальным способом.

Код:

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 будет одинаковым для каждого дочернего класса, он должен быть публичным методом в родительском классе, но валидатор должен быть абстрактным, чтобы заставить дочерние классы реализовать его.

I 'я просто делаю набросок на бумаге ...

1 Ответ

2 голосов
/ 23 февраля 2011

Да, это правильный подход, хотя ваш синтаксис в несовершенном:

        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 нет кода.

Но, пожалуйста, поймите, это зависит от того, как структурирована ваша программа.Мне нужно было бы увидеть хотя бы диаграмму архитектуры программы, чтобы сказать однозначно.

...