2015-04-07 2 views
2

Мне сказали, что я должен кодировать мои объекты POPO Doctrine для реализации интерфейса. Я понимаю, что лучше всего использовать код для интерфейсов.Должны ли мои объекты Doctrine реализовывать интерфейсы?

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

<?php 
class User implements UserInterface() 
{ 
    function getName() { 
     return $this->name; 
    } 

    function setName($name) { 
     $this->name = $name; 
    } 

    function addPermission(Permission $permission) { 
     $this->permissions[] = $permission; 
    } 
} 

interface UserInterface() 
{ 
    function getName(); 

    function setName($name); 

    function addPermission(Permission $permission); 
} 
+0

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

+0

Если кто-то сказал вам, что объекты Doctrine должны реализовывать интерфейсы, вы спрашивали их почему? ':-)' – halfer

+0

Я просил, и я не мог спокойно понять рассуждения. Надеюсь на разъяснения. – Roeland

ответ

3

я ответить на этот вопрос в рамках только объекты базы данных.

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

  1. При передаче объектов на сторонний код.
    Как и в случае с UserInterface, некоторый сторонний код ожидает, что он сможет собирать данные об определенном объекте. Имя пользователя и адрес электронной почты, как и в случае с Symfony.

  2. При распространении кода в качестве стороннего участника.
    Примером может служить RoleInterface. Например, ваш пакет может управлять объектами FOSUserBundle, но конечным пользователям может не понравиться ваша реализация или даже не хотите, чтобы они хранились в базе данных. Использование интерфейса позволяет нам повторно реализовать существующий код, не нарушая его. (Ваш пакет должен проверять интерфейсы, а не классы).

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

  4. Тестирование
    Гораздо проще создавать макетные объекты, когда требуется только реализация интерфейса.

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

+0

Вы бы порекомендовали иметь все сеттеры и геттеры в интерфейсе, если я иду по этому маршруту? – Roeland

+0

@Roeland Лично я бы добавил только соответствующих геттеров, но это действительно зависит от цели сущности. Если это журнал сообщений, например, вы можете ожидать, что у него есть метод setMessage. Точно так же, как с данными формы, не доверяйте разработчику давать правильные данные. – Twifty

+1

@Roeland - Нет смысла в основном повторять ваши методы доктрины в интерфейсе. Большая трата времени. Интерфейс должен сосредоточиться на том, что на самом деле делает объект. Это контракт.Пока потребитель ваших объектов будет следовать контракту, вы можете сделать любые изменения, которые вы хотите, не оказывая влияния на них. Многие приложения - это простые дела CRUD. Интерфейсы не имеют большого значения для этих приложений. – Cerad

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