Skip to content

Instantly share code, notes, and snippets.

@mivvka
Forked from UnQuaiz/README.md
Last active September 26, 2021 23:45
Show Gist options
  • Save mivvka/91dd1dc4211180ba4ee62bd17b0a9b4c to your computer and use it in GitHub Desktop.
Save mivvka/91dd1dc4211180ba4ee62bd17b0a9b4c to your computer and use it in GitHub Desktop.
StringHandler

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

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

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

<?php //Доработанный вариант больше SOLID & OOP
//Применен паттерн "Composite", но надо еще доработать обработку исключений.
interface ParserInterface
{
public function parse(string $string);
}
class StringHandler
{
private array $parserEngines = [];
private function getParser(string $format): ParserInterface
{
return $this->parserEngines[$format];
}
public function addParser(string $format,ParserInterface $parser){
$this->parserEngines[$format] = $parser;
}
public function parse(string $format, string $string)
{
return $this->getParser($format)->parse($string);
}
}
class YamlParser implements ParserInterface
{
public function parse(string $string)
{
echo __CLASS__." - ".$string."\n";
}
}
class XXmlParser implements ParserInterface
{
public function parse(string $string)
{
echo __CLASS__." - ".$string;
}
}
class CsvParser implements ParserInterface
{
public function parse(string $string)
{
echo __CLASS__." - ".$string."\n";
}
}
//Использование нового метода класса
$StrHndlr = new StringHandler();
$StrHndlr->addParser('csv',new CsvParser());
$StrHndlr->addParser('xml',new XXmlParser());
$StrHndlr->addParser('yml',new YamlParser());
$StrHndlr->parse('yml','works');
//$StrHndlr->parse('yl','works'); // Это надо доработать/обработать и предусмотреть
<?php
interface ParseInterface
{
public function parse(string $string);
}
class StringHandler
{
public function parse(ParseInterface $parseObject, string $string)
{
return $parseObject->parse($string);
}
}
class XmlParser implements ParseInterface
{
public function parse(string $string)
{
//.....
}
}
class CsvParser implements ParseInterface
{
public function parse(string $string)
{
//.....
}
}
<?php
interface ParserInterface
{
public function parse(string $string);
}
interface ParserBuilder
{
public function getParser(string $format): ParserInterface;
}
class StringHandler
{
private ParserBilder $PrsBilder;
public function setParserBilder(ParserBuilder $PrsBldr)
{
$this->PrsBilder = $PrsBldr;
}
public function parse(string $format, string $string) : String
{
return $PrsBilder->getParser($format)->parse($string);
}
}
class PBilder implements ParserBuilder
{
private ParserInterface $parserEngine;
public function getParser(): ParserInterface
{
return $this->parserEngines;
}
public function setParser(ParserInterface $parser)
{
$this->parserEngines = $parser;
}
}
class YamlParser implements ParserInterface
{
public function parse(string $string)
{
echo __CLASS__." - ".$string."\n";
}
}
class XXmlParser implements ParserInterface
{
public function parse(string $string)
{
echo __CLASS__." - ".$string;
}
}
class CsvParser implements ParserInterface
{
public function parse(string $string)
{
echo __CLASS__." - ".$string."\n";
}
}
//Использование нового метода класса
$PB = new PBilder()
$PB->setParser(new YamlParser())
$StrHndlr = new StringHandler();
$StrHndlr -> setParserBilder($PB);
//$StrHndlr->addParser('csv',new CsvParser());
//$StrHndlr->addParser('xml',new XXmlParser());
//$StrHndlr->addParser('yml',new YamlParser());
$StrHndlr->parse('yml','works');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment