Когда проверять / очищать аргументы переопределенного метода?

#php #validation #oop #sanitization #overriding

#php #проверка #ооп #очистка #переопределение

Вопрос:

Что вы можете сказать о проверке / очистке аргументов переопределенного метода в классе?

Если у меня есть что-то вроде

 class parentClass
{
    public function originalMethod($id) {
        if(is_numeric($id) amp;amp; (int) $id > 0) {
            // use $id
        }
    }
}
  

и подкласс, который переопределяет метод

 class childClass extends parentClass
{
    public function originalMethod($id) {

        parent::originalMethod($id);

        // do other stuff 
    }
}
  

Мой вопрос:

в каких случаях вы бы продолжили проверку аргументов метода?

Разве я не должен ожидать / предполагать, что правильная проверка уже выполнена в родительском методе?

Я когда-то видел код, в котором проверка выполняется снова (не в простом случае, подобном приведенному выше).

Вы бы проверяли каждый раз? Никогда? Только при некоторых обстоятельствах?

Ответ №1:

Обычно я использую в качестве общей направляющей линии:

  • Если базовая функция вызывается в переопределенной функции в качестве первого оператора, проверка выполняется уже в переопределенной функции. В некоторых случаях необходимо добавить дополнительные проверки в переопределенную функцию. Если базовая функция не изменяет переменные, используемые для проверки, которые используются в переопределенной функции.
  • Если базовая функция не вызывается, вам нужно подумать о проверке; обычно ее нужно скопировать, иногда расширить или удалить (частично).
  • Если базовая функция вызывается после переопределенной функции (или не в начале), может потребоваться некоторая проверка; другая проверка будет обработана в базовой функции.

Конечно, это всего лишь руководство; могут возникать исключения.

Ответ №2:

В приведенном выше случае вы должны выполнить повторную проверку, потому что родительский элемент не прерывает выполнение вашего кода, если входные данные недопустимы. Он просто инкапсулирует свой собственный код.

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

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