Skip to content

Instantly share code, notes, and snippets.

@zindmax
Forked from UnQuaiz/README.md
Last active September 20, 2021 16:32
Show Gist options
  • Save zindmax/e95ead8c0038355ca788f0e476d5a835 to your computer and use it in GitHub Desktop.
Save zindmax/e95ead8c0038355ca788f0e476d5a835 to your computer and use it in GitHub Desktop.
StringHandler

Имеется набор парсеров текстовых форматов: XmlParser и CsvParser. Сама реализация парсеров сейчас не имеет значения. Есть класс StringHandler - который имеет метод parseString(string $format, string $string)

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

Решение можно оформить в виде gist'а Сделайте форк и в нём измените код


В данном коде нарушаютется несколько принципов солид SOLID таких как

Single responsibility


Функция parseString отвечает не только за сам парсниг, но и за определение парсера

Open/Close


Даже если не брать во внимание нарушение Single responsibility, то при создании нового парсера нам бы пришлось модифицировать функцию parse и добавлять новый case

Dependency inversion


Функция parseString зависит не от абстрации, а от конкретного парсера

Решение


Добавить интерфейс, от которого будут наследваться парсеры и передать интерфейс в StringHandler

<?php
class ParserNotFoundException extends \Exception{
}
class StringHandler
{
/**
* @throws ParserNotFoundException
*/
public function parseString(string $format, string $string)
{
$parserPath = ucfirst($format) . "Parser";
if (class_exists($parserPath)) {
$parser = new $parserPath();
return $parser->parse($string);
}else{
throw new ParserNotFoundException("no such parser for [$format]");
}
}
}
class XmlParser
{
public function parse(string $string)
{
echo "xml" . " " . $string;
}
}
class CsvParser
{
public function parse(string $string)
{
echo "csv" . " " . $string;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment