2010-05-17 4 views
8

нормально, все вменяемые разработчики пытаются обеспечить ввод всех общедоступных методов (литье в соответствующих типов, проверяющий, дезинфицировать и т.д.)Защита ввода частных/защищенных методов?

Мой вопрос: вы в коде проверки достоверности данных и параметров, передаваемых защищенных/частных методов ? По-моему, это необязательно, если вы обеспечиваете правильное определение параметров общедоступных методов и возвращаете значения извне (другие классы, db, ввод пользователя и т. Д.).

Но я постоянно сталкиваюсь с фреймворками и приложениями (например, prestashop, чтобы назвать их), где валидация часто повторяется в вызове метода, в теле метода и еще раз для сохранения возвращаемого значения - что, я думаю, создает служебные накладные расходы и также является признаком плохого дизайна.

+0

Вы не получите много служебных накладных расходов от проверки, если не используете регулярные выражения (которых вам не следует). – Andy

+0

Я видел довольно плохие подтверждения, т.е. в упомянутом выше preashop у них есть метод isTableOrIdentifier в ORM, который использует regexp для проверки достоверности имени таблицы/столбца и называется буквально десятки раз внутри одного объекта (и представьте теперь импортировать сотни или тысячи объектов) –

+0

Если вы делаете подходящий уровень Unit Testing, то пропустить некоторую проверку некоторых частных членов будет хорошо. Всегда есть риск, но если ваш; или рецензентов; проверка кода показывает, что ваши исходные предположения всегда будут правильными, исходя из того, что делают публичные члены-вызовы, тогда это хорошо. – JoeGeeky

ответ

2

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

Примеры методов, которые должны сделать проверку:

class A { 
    protected final function myMethodDefaultImplementation(...) { 
     /* subclasses can just call this method in their myMethod implementations */ 
     /* should do validation */ 
     ... 
    } 
    protected abstract myMethod(...); 

    public function orderByDate() { 
     return $this->orderBy(ORDER_BY_DATE) 
    } 

    private function orderBy($crit) { 
     /* should do validation */ 
     ... 
    } 
} 
0

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

3

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

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

-1

только дезинфицировать вход в самый последний шанс. Я не вижу, как семантика OO делает это другим.

Например, если по какой-то причине вы не можете использовать параметризованные запросы или ОРМ (оны, например, я могу думать в тот момент :), вы бы написать функцию, как это:

function getname($id) { 
    $id = intval($id); 
    mysql_query("SELECT * FROM users WHERE id = $id"); 
    ... 
} 

Теперь любой код не может вызвать эту функцию и вызвать неожиданные результаты.

+0

Почему downvote? Вот как это делается. Нет смысла создавать API, который позволяет вам вводить SQL. Не говоря уже об этом ** точно так же, как и принятое решение. –

0

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

Смежные вопросы