Использовать ли Dependency Injection (или Service Locator?) Или что-то еще при написании PHP-функции, которая обрабатывает вывод другой функции?

У меня есть две функции: myFunctionA() и myFunctionB() .

myFunctionA() возвращает Object который включает ключ Page_Type который имеет строковое значение.

myFunctionB() обрабатывает несколько записей в Object возвращаемых myFunctionA() , включая Page_Type и его строковое значение.

Позже myFunctionA() обновляется, поэтому он больше не возвращает объект, включающий ключ Page_Type а вместо этого ключ Page_Types который имеет значение массива.

Из-за этого myFunctionB() теперь также нужно будет обновить - он больше не будет обрабатывать Page_Type который является строкой, а будет Page_Types который является массивом.

Если я правильно понимаю (а могу и не понимать), выше приведен пример запроса на зависимость, и его интенсивного рефакторинга можно избежать (я думаю) путем развертывания шаблона внедрения зависимостей (или, возможно, даже шаблона локатора служб ?) вместо.

Но, несмотря на прочтение этой темы, я все еще не уверен относительно того, как Dependency Injection может работать в функциях PHP или Javascript (большая часть объяснения посвящена языкам программирования, таким как C++ и концепциям ООП, таким как Classes , тогда как я имею дело со сторонними функциями в PHP и JavaScript).

Есть ли способ структурировать мой код так, чтобы обновление myFunctionA() (любым существенным образом) не потребовало от меня обновления myFunctionB()всех других функций, вызывающих myFunctionA() - например, myFunctionC() , myFunctionD() , myFunctionE() и т. д.)?

А что, если myFunctionH() требует myFunctionG() требует myFunctionF() которая требует myFunctionA() ? Я не хочу находиться в положении, когда обновление myFunctionA() теперь означает, что все три функции ( F , G и H ) должны быть обновлены.

Всего 2 ответа


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

Выясните, что является логическим выводом для myFunctionA (), закодируйте этот контракт в объект и преобразуйте данные, которые у вас есть, в этот формат. Таким образом, даже если способ извлечения данных в myFunctionA () изменится, вам нужно будет обновить только это преобразование.

Пока вы придерживаетесь этого контракта (который может быть представлен через пользовательский объект), myFunctionB () и других методов, которые ожидают получения данных в соответствии с контрактом, вам больше не придется изменять эти методы.

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


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


Есть идеи?

10000