Вопрос
Каков наилучший способ справиться с "служебными" функциями в ООП-фреймворке PHP?Прямо сейчас у нас просто есть файл с несколькими функциями, которые необходимы во всей системе.(Например, a distribute()
функция, которая принимает значение и массив и возвращает массив со значением, распределенным в тех же пропорциях и теми же ключами, что и входной массив.)
Я всегда чувствовал себя "грязным", используя это, потому что оно вообще не объектно-ориентировано.Лучше ли перемещать их в различные классы в качестве статических методов, или это просто семантический обходной путь?Или просто в фреймворке будет уровень, на котором некоторые вещи будут выходить за рамки структуры ООП?
Решение
Я всегда был более прагматичен в подобных вопросах.
Если вы хотите перейти на полноценный ООП, вам, очевидно, следует поместить это в классы.Однако эти классы будут только контейнерными классами, потому что на самом деле они не представляют объекты какого-либо вида.
Также:использование классов потребует от вас либо наличия экземпляра этого класса, либо использования шаблона singleton, либо объявления каждой функции статической.Первый работает медленнее (ладно, может быть, не настолько сильно, но в большом фреймворке подобные вещи тоже становятся большими - особенно в интерпретируемых языках, таких как PHP), в то время как второй и третий просто бесполезны и являются оболочкой ООП для набора функций (особенно третьего подхода).
Редактировать:Не стесняйтесь доказать, что я неправ.Я мог бы быть таким.Я не слишком опытен и всегда видел это именно так, но я могу ошибаться.
Другие советы
Я склонен делать Util()
класс, который содержит только статические методы, не имеет атрибутов и не наследуется от.По сути, он действует как "пространство имен" для набора служебных функций.Я позволю этому классу увеличиваться в размерах, но иногда буду разделять методы на их собственные классы, если будет ясно, что эти методы предназначены только для работы с определенными типами данных или если будет ясно, что группа связанных методов должна быть сгруппирована в класс вместе, возможно, с некоторыми атрибутами.
Я думаю, что совершенно нормально отклоняться от чисто ООП-практик до тех пор, пока код, который отклоняется, хорошо организован и не создает архитектурных недостатков в вашей системе, которые затрудняют ее понимание и обслуживание.
Я всегда думаю о служебных функциях как о расширениях стандартных функций php.Они не являются объектно-ориентированными, потому что на самом деле вы не получаете никакой выгоды от того, что делаете их OO.