gpt4 book ai didi

oop - 一个对象拒绝它自己是正确的吗?

转载 作者:行者123 更新时间:2023-12-04 19:21:47 24 4
gpt4 key购买 nike

我想解析多种文件格式。我想知道“冒险”创建对象是否是正确的 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
*/
}
}

谢谢

编辑
我有很好的答案。所以,对象检查自己的有效性是可以的。无论如何,由于我选择解析器(格式检测)的过程方式,我的代码是非 OOP 的。为了改善这一点,最好使用像这样的工厂模式(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");

最佳答案

一个比较常见的设计是

public function getParser()
{
if (FormatAParser::IsRecognizedHeader(this->fn)
{
return new FormatAParser(this->fn);
}
if (FormatBParser::IsRecognizedHeader(this->fn)
{
return new FormatBParser(this->fn);
}
}

这使用类而不是对象方法来检查 header 。一个明显的变化是将不同的解析器收集在一个列表中,而不是像这样手动循环它们。这需要能够将类(而不是对象)添加到列表中。

关于oop - 一个对象拒绝它自己是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com