Я пытаюсь научиться Принципу инверсии зависимостей. В настоящее время мой код похож на этот кодРедукция экземпляра ручного объекта
class Example {
public function __construct($input, $output) {
$input_handler = new InputHandler($input);
$output_handler = new OutputHandler($output);
$input_handler->doStuff();
$output_handler->doOtherStuff();
}
}
$input = new Input();
$output = new Output();
$example = new Example($input, $output)
Однако, похоже, с использованием базовой инъекции зависимостей это должно быть больше похоже на это?
class Example {
public function __construct($input_handler, $output_handler) {
$input_handler->doStuff();
$output_handler->doOtherStuff();
}
}
$input = new Input();
$output = new Output();
$input_handler = new InputHandler($input);
$output_handler = new OutputHandler($output);
$example = new Example($input_handler, $output_handler)
Это все верно?
Я хочу, чтобы программист выбирал тип ввода/вывода для использования при запуске программы. Так что с инъекцией зависимостей (насколько я понимаю) это будет выглядеть так:
$input = new ConsoleInput();
$output = new FileOutput();
$input_handler = new ConsoleInputHandler($input);
$output_handler = new FileOutputHandler($output);
$example = new Example($input_handler, $output_handler);
$example->doStuffToOutput();
Однако, я бы предпочел, чтобы сделать жизнь программистов немного легче только необходимости проходить в типе ввода и вывода, а также не нужно беспокоиться о классах обработки их;
$input = new ConsoleInput();
$output = new FileOutput();
$example = new Example($input, $output);
$example->doStuffToOutput();
или даже
$example = new Example(new ConsoleInput(), new FileOutput());
$example->doStuffToOutput();
Как я могу добиться этого с помощью DIP и не до конца с моим первым блоком кода? Это хорошо?
Кажется, что в первом примере нельзя определить тип обработчика (ConsoleInputHandler/ConsoleOutputHandler/FileInputHandler/FileOutputHandler). Это проблема, которую вы пытаетесь решить? – TechWisdom