#php
#php
Вопрос:
У меня есть два контроллера
login.php
auth.php
оба выполняют проверки, связанные с безопасностью (убедитесь, что пользователь не входил в систему слишком много раз). они оба вызывают следующие функции:
isThrottled()
я хочу переместить эти функции проверки в признак, чтобы я мог разделить их между этими двумя контроллерами выше.
Лучший способ поделиться функциями для использования черты? или просто поместить их в родительский контроллер? они оба имеют одного и того же родителя.
Ответ №1:
Я думаю, что вы можете разумно использовать либо в этой ситуации, хотя я лично предпочел бы иметь (возможно, абстрактный) родительский класс, в котором классы login.php и auth.php расширяться.
Черты, для меня, предназначены для того, где вам нужен набор функций, которые вы можете использовать и повторно использовать в нескольких классах, которые не обязательно связаны. Я бы сказал, что такие функции, как str_replace() и strstr(), являются методами глобального признака, который является PHP «объектом». Вам нужны эти функции независимо от того, что вы делаете, потому что они являются полезными инструментами в вашей сумке с инструментами.
Методы, унаследованные от родителя, более сфокусированы, они обеспечивают повторное использование в строго определенной области. Это функции, которые вам, возможно, не понадобятся в классе, который не выполняет определенную группу задач, для решения которых он предназначен.
Вы бы не сделали ничего плохого, используя признак, но если вы зададите себе вопрос «буду ли я использовать isThrottled() вне конкретной функциональности модели авторизации пользователя», и ответ «нет», то это, вероятно, слишком абстрактно! С точки зрения удобства обслуживания и контекста, которые вы можете предоставить будущим разработчикам (или будущим вам) Я бы не стал жертвовать наличием этой функции в середине кода, с которым она связана.
Ответ №2:
Это полностью зависит от проекта, вашего стиля кода и, конечно, от того, какая инфраструктура уже существует.
Лично я склоняюсь к использованию либо черт, либо интерфейса, очевидно, что интерфейс используется, когда я чувствую, что другие элементы могут быть добавлены или изменены, и мне нужно будет обеспечить (принудительно) общую функциональность во всех областях моего приложения без строгих ограничений на то, как работает функция, иличто это дает.
При этом черта используется, когда я хочу уменьшить дублирование кода, например, в вашем экземпляре. Однако это будет зависеть от того, будет ли метод иметь одинаковое поведение, входные и возвращаемые значения во всех классах, которые вы будете использовать.
Честно говоря, никогда не бывает, чтобы решение 1 было правильным, а одно неправильным, однако в этой конкретной ситуации я бы использовал черту.
Надеюсь, это поможет 🙂