Класс управления зависимостями, как вам реализация? Набросал класс управления зависимостями в приложении/**
* Class DependencyManager
*/
class DependencyManager {
/**
* @var array of dependencies
*/
public $dependencies;
/**
* DependencyManager constructor
*/
public function __construct() {
$this->dependencies = [
[
'class' => 'SomeClass',
'dependencies' => [
'DependentedClass', 'SecondDependentedClass'
]
]
];
}
/**
* @param $class
* @return null OR Dependencies of class
*/
public function checkDependencies($class) {
$dependenciesByClass = null;
foreach( $this->dependencies as $data ) {
if($data['class'] === $class) {
$dependenciesByClass = $data['dependencies'];
break;
}
}
return $dependenciesByClass;
}
}/**
* Class DependentedClass
*/
class DependentedClass {
public $variable = 'this text placed in DependentedClass ';
}/**
* Class SecondDependentedClass
*/
class SecondDependentedClass {
public $moreVariable = 'this text placed in SecondDependentedClass';
}/**
* Class SomeClass
* class for example
* It is dependent on other classes
*/
class SomeClass {
public $varInDependentedClass;
public $varInSecondDependentedClass;
public function __construct(DependentedClass $dependentedClass, SecondDependentedClass $secondDependentedClass) {
$this->varInDependentedClass = $dependentedClass->variable;
$this->varInSecondDependentedClass = $secondDependentedClass->moreVariable;
}
}/**
* Class Loader
* This class creates an instance of any class
*/
class Loader {
public $className;
public $dependencyManager;
/**
* Loader constructor.
* @param DependencyManager $dependencyManager
*/
public function __construct(DependencyManager $dependencyManager) {
$this->dependencyManager = $dependencyManager;
}
/**
* @return null|object
* this method loads classes
*/
public function loadClass() {
$dependencies = null;
$arrayObjects = null;
$reflection = null;
$instance = null;
$this->className = 'SomeClass';
if( !is_null($this->className) ) {
$dependencies = $this->dependencyManager->checkDependencies($this->className);
if( !is_null($dependencies) ) {
for($i = 0; $i className );
$instance = $reflection->newInstanceArgs($arrayObjects);
} else {
$instance = new $this->className;
}
}
return $instance;
}
}Usage:$loader = new Loader( new DependencyManager() );
var_dump( $loader->loadClass() );
/*
* var_dump() results:
* object(SomeClass)#6
* (2) {
* ["varInDependentedClass"] => string(43) "this text placed in DependentedClass"
* ["varInSecondDependentedClass"] => string(42) "this text placed in SecondDependentedClass"
* }
*/
Очень удобная вещь, теперь можно по частям тестировать приложение.НО
Что меня смущает:
1. То что нужно вручную собирать массив зависимостей ( метод DependencyManager::__construct() );
2. Что возможно я что то упустил либо нагородил, например формирование массива объектов-зависимостей ( метод Loader::loadClass() )UPDATE
Еще пришла идея в классы с зависимостями передавать в аргументах интерфейсы, а не объекты. Прошу заметить что это не полностью рабочий вариант, и прошу дать совет по основной идее работы класса, а не по пропущенным проверкам и тд. Многие моменты максимально облегчены для быстрого понимания

21 Авг 2019 в 07:04
157 +1
0
Ответы
1

Идея создания класса DependencyManager для управления зависимостями в приложении хороша. Однако есть несколько моментов, которые можно улучшить:

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

В методе Loader::loadClass() можно использовать Dependency Injection, чтобы инжектировать зависимости в класс SomeClass без необходимости создавать объекты зависимых классов вручную. Также стоит добавить проверку на наличие конструктора в классе SomeClass перед созданием объекта.

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

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

Можно рассмотреть возможность использования сторонних библиотек или фреймворков для управления зависимостями, таких как Composer или Symfony DI Container, чтобы упростить и улучшить работу с зависимостями.

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

20 Апр в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 706 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир