Является ли плохой практикой добавление дополнительных методов к реализации, не определенной в интерфейсе в PHP? - PullRequest
2 голосов
/ 27 января 2011

У меня есть интерфейс для проверки данных из базы данных, и его реализации делают разные вещи с функциями поиска и проверки.Некоторые реализации требуют дополнительных функций для выполнения своей задачи, это плохая практика?

Ответы [ 7 ]

1 голос
/ 27 января 2011

По моему мнению, это не плохая практика, если вы не раскрываете те дополнительные функции, которые выходят за рамки того, что определяет интерфейс;как при наличии их protected или private

Редактировать:

У него также был тег factory в его вопросе.Поэтому я предположил, что он использует factory method.Таким образом, было бы плохо, если бы в данной реализации интерфейса было больше методов, определенных в интерфейсе.

1 голос
/ 27 января 2011

Похоже, ваш вопрос: нормально ли, чтобы класс, реализующий интерфейс, имел больше методов, чем те, которые фактически определены в интерфейсе?Ответ будет: да, это совершенно нормально, и на самом деле вполне нормально.

0 голосов
/ 27 января 2011

Это не плохая практика, если вы используете ее правильно.Позвольте мне показать пример.С этим:

interface Foo {
   public function foo();
}

class Baz implements Foo {
   public function foo() {
      // implementation of Foo::foo()
   }

   public function baz() {
      // specific to Baz
   }
}

Следующее является плохой практикой:

function test(Foo $foo) {
    $foo->foo();
    $foo->baz();
}
test(new Baz);

В PHP это работает.В предварительно скомпилированных языках это не так.Это потому, что ваш аргумент $foo имеет тип Foo, у которого нет метода baz.Это будет ошибка компиляции: компилятор проверяет аргумент типа Foo, а Foo::baz является недопустимой ссылкой.Тем не менее, они не существуют в PHP, поэтому, если вы передадите своей функции объект Baz, это будет работать.Но это открывает дверь к странным ошибкам во время выполнения.

Правильный способ будет сделать:

function test(Baz $foo) {
    $foo->foo();
    $foo->baz();
}
test(new Baz);
0 голосов
/ 27 января 2011

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

0 голосов
/ 27 января 2011

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

0 голосов
/ 27 января 2011

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

0 голосов
/ 27 января 2011

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

См .: Принцип подстановки Лискова

...