Skip to content

Instantly share code, notes, and snippets.

@kabrikosov
Forked from UnQuaiz/README.md
Last active September 23, 2021 03:39
Show Gist options
  • Save kabrikosov/91aa7a2505f52c0c02e57f39362c946c to your computer and use it in GitHub Desktop.
Save kabrikosov/91aa7a2505f52c0c02e57f39362c946c to your computer and use it in GitHub Desktop.
StringHandler

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

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

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

Нарушались принципы:

S - single responsibility - parseString должен просто парсить строку, а он выбирал парсер в зависимости от типа. Это не должно быть его ответственностью. Еще и бросает исключение, если парсер не найден.

D - dependency inversion - parseString зависит от конкретного типа файла, а должен зависеть от абстракции.

<?php
class StringHandler
{
public function parseString(string $format, string $string)
{
$parser = ParserFactory::getParser($format);
return $parser->parse($string);
}
}
interface Parser
{
public function parse(string $string);
}
class XmlParser implements Parser
{
public function parse(string $string)
{
return "xml parser: $string";
}
}
class CsvParser implements Parser
{
public function parse(string $string)
{
return "csv parser: $string";
}
}
class ParserFactory
{
public static function getParser(string $format): Parser
{
//..... тут должен создаваться парсер в зависимости от формата, например:
$className = ucfirst($fileFormat) . "Parser";
if (class_exists($className)) {
return new $className();
} else throw new ParserNotFoundException();
}
}
//пример использования
$string = "строка";
$handler = new StringHandler();
print $handler->parseString("csv", $string);
print "\n";
print $handler->parseString("xml", $string);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment