여러 파일 형식을 구문 분석하고 싶습니다. 그것은 OOP가 "위험을 무릅 쓰고"객체를 만들지 않을지 궁금합니다.개체가 자기를 거부하는 것이 맞습니까?
class ParserFactory
{
private fn;
public function ParserFactory(fn)
{
this->fn = fn;
}
public function getParser()
{
a = new FormatAParser(this->fn);
if (a->isValid())
{
return(a);
}
b = new FormatBParser(this->fn);
// ... and so on...
}
}
class FormatAParser
{
/*
The object is telling us if is able to continue to work...
**CLEAN OR DIRTY DESIGN ?**
*/
public function isValid()
{
header = SomeConversionAndReadingStuff();
if (header != "formatA")
{
return(false)
}
return(true);
}
public function parse()
{
/*
Do the parsing, using the conversion stuff done in isValid
*/
}
}
감사
편집
나는 아주 좋은 대답을했다. 따라서 객체가 자신의 유효성을 검사하는 것은 괜찮습니다. 어쨌든 내 코드는 파서 (형식 감지)를 선택하는 절차 방식 때문에 un-OOP이었습니다.
class Parser
{
protected $raw;
public function setRaw($raw)
{
$this->raw = $raw;
}
}
class ParserA extends Parser
{
public function __construct()
{
echo "ParserA constructor\n";
}
public function isValid()
{
if ($this->raw == "A")
{
return(true);
}
return(false);
}
}
class ParserB extends Parser
{
public function __construct()
{
echo "ParserB constructor\n";
}
public function isValid()
{
if ($this->raw == "B")
{
return(true);
}
return(false);
}
}
class ParserFactory
{
static private $parserClasses = array();
public static function registerParser($parserClassName)
{
self::$parserClasses[] = $parserClassName;
}
public static function getParser($raw)
{
foreach(self::$parserClasses as $parserClass)
{
$parser = new $parserClass();
$parser->setRaw($raw);
if ($parser->isValid())
{
return($parser);
}
}
}
}
ParserFactory::registerParser("ParserA");
ParserFactory::registerParser("ParserB");
ParserFactory::getParser("B");
Jaydel에게 내 대답보기 : 나는 그것이 변환 작업을 한 번 수행하는 것보다 두 번 수행하는 것이 좋습니다. – Antoine
Tim Barrass와 결합 된 설명 : 대단히 감사합니다! 공장 패턴 – Antoine
+1에 대한 몇 가지 내용을 추가하기 위해 질문을 업데이트합니다. 이는 책임을 분리하는 더 좋은 일을하는 것처럼 보입니다. – TrueWill