Должен ли я добавить все общедоступные функции для интерфейса? - PullRequest
0 голосов
/ 28 июня 2019

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

Вот так класс и интерфейс .transform метод не объявлен в интерфейсе.

AFAIK мы используем интерфейсы, чтобы позволить компьютеру применять определенные свойства к объекту (классу).

Поэтому мы должны добавить все открытые методы винтерфейс, когда есть только одна реализация этого интерфейса?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

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

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

Примером в вашем приложении является хранилище, для этого есть шаблон :

Репозиторий

Посредничество между доменом и слоями отображения данных с использованием подобный коллекции интерфейс для доступа к объектам домена.

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

Как только вы определите правила и запустите deptrac, он создаст образ, подобный этому:

enter image description here

0 голосов
/ 28 июня 2019

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

Вы определяете интерфейсы абстрактно, чтобы описать ожидания, которые должен выполнить объект. E.g.:

interface Foo {
    public function bar();
}

function baz(Foo $foo) {
    $foo->bar();
}

Здесь описывается функция baz, для которой требуется аргумент $foo, который реализует как минимум один метод bar(). Чтобы выполнить это требование, вам нужно иметь класс implements Foo. Этот класс может дополнительно реализовывать другие интерфейсы или реализовывать больше методов, чем просто.

class ConcreteFoo implements Foo, Bar, Baz, Countable, ArrayAccess {
    public function bar() { ... }

    public function ham() { ... }

    ...
}

Этот класс выполняет ожидание interface Foo, в дополнение ко многим другим вещам. Это не должно касаться interface Foo, ни function baz. Это называется интерфейс разделения .

Итак, нет, интерфейс не обязательно выражает каждый метод класса, который его реализует.

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