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

#php

#php

Вопрос:

У меня есть два контроллера

 login.php
auth.php
  

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

 isThrottled()
  

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

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

Ответ №1:

Я думаю, что вы можете разумно использовать либо в этой ситуации, хотя я лично предпочел бы иметь (возможно, абстрактный) родительский класс, в котором классы login.php и auth.php расширяться.

Черты, для меня, предназначены для того, где вам нужен набор функций, которые вы можете использовать и повторно использовать в нескольких классах, которые не обязательно связаны. Я бы сказал, что такие функции, как str_replace() и strstr(), являются методами глобального признака, который является PHP «объектом». Вам нужны эти функции независимо от того, что вы делаете, потому что они являются полезными инструментами в вашей сумке с инструментами.

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

Вы бы не сделали ничего плохого, используя признак, но если вы зададите себе вопрос «буду ли я использовать isThrottled() вне конкретной функциональности модели авторизации пользователя», и ответ «нет», то это, вероятно, слишком абстрактно! С точки зрения удобства обслуживания и контекста, которые вы можете предоставить будущим разработчикам (или будущим вам) Я бы не стал жертвовать наличием этой функции в середине кода, с которым она связана.

Ответ №2:

Это полностью зависит от проекта, вашего стиля кода и, конечно, от того, какая инфраструктура уже существует.

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

При этом черта используется, когда я хочу уменьшить дублирование кода, например, в вашем экземпляре. Однако это будет зависеть от того, будет ли метод иметь одинаковое поведение, входные и возвращаемые значения во всех классах, которые вы будете использовать.

Честно говоря, никогда не бывает, чтобы решение 1 было правильным, а одно неправильным, однако в этой конкретной ситуации я бы использовал черту.

Надеюсь, это поможет 🙂