Я хочу проанализировать несколько форматов файлов.Мне интересно, правильно ли ООП "рисковать", чтобы создать объект даром.
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
*/
}
}
Спасибо
РЕДАКТИРОВАТЬ
У меня были очень хорошие ответы.Таким образом, объект может проверить свою действительность.Во всяком случае, мой код был не-ООП из-за процедурного способа, которым я выбираю парсер (определение формата).Чтобы улучшить это, лучше использовать фабричный шаблон, подобный этому (код PHP):
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");