我有一个类来执行一些操作,例如解析,它将成为一个公共存储库。因为构造函数有些复杂,并且对于最终用户而言并不重要,所以我想将其隐藏在立面后面。
// interface
interface ParserInterface {
function parse(string $input): Document;
}
// implementation
class ParserImplementation implements ParserInterface {
function __construct(
Normalizer $normalizer,
Tokenizer $tokenizer,
Interpreter $interpreter,
etc.
) {
$this->normalizer = $normalizer;
$this->tokenizer = $tokenizer;
$this->interpreter = $interpreter;
}
function parse(string $input): Document {
$normalizedInput = $this->normalizer->normalize($input);
$tokens = $this->tokenizer->tokenize($normalizedInput);
return $this->interpreter->interpret($tokens);
}
}
// facade
class ParserFacade implements ParserInterface {
private $parser;
function __construct() {
$this->parser = new ParserImplementation(
new Normalizer(),
new Tokenizer(),
etc.
);
}
function parse(string $input) {
return $this->parser->parse($input);
}
}
如您所见,那里还有一个接口。
现在,对于外部应用程序而言,是外观是解析器。对于共同依赖的代码,解析器是接口。对于我开发上述解决方案而言,真正的解析器是ParserImplementation,即它包含了整个解析逻辑。所以现在,我对正确的命名约定一无所知。
我更喜欢将接口命名为Parser,而将fasade命名为某种可以表达我意图的东西:CustomParser,因为整体是具有某种标准实现的事物的定制实现。但是然后我找不到命名内部类的模式(上面的代码中为ParserImplementation)。
在这方面是否有完善的做法?
答案 0 :(得分:0)
这是非常主观的,但是我通常所做的以及我最常看到的是这样的:
接口:ParserInterface
摘要:ParserAbstract
实现:解析器
外观:出于特定目的(CsvParser,XmlParser等)或类似DefaultParser或GenericParser的名称进行命名
如果是我,我可能会以抽象而不是立面的方式来处理。因此,我将把ParserImplementation类更改为抽象类,并使您的ParserFacade扩展该类,然后将其称为Parser。如果您想提供 that 类的简化实现,则可以采用外观路线,但是在这种情况下可能不需要这样做。
<?php
// interface
interface ParserInterface
{
function parse(string $input): Document;
}
// abstract
abstract class ParserAbstract implements ParserInterface
{
function __construct(
Normalizer $normalizer,
Tokenizer $tokenizer,
Interpreter $interpreter
)
{
$this->normalizer = $normalizer;
$this->tokenizer = $tokenizer;
$this->interpreter = $interpreter;
}
function parse(string $input): Document
{
$normalizedInput = $this->normalizer->normalize($input);
$tokens = $this->tokenizer->tokenize($normalizedInput);
return $this->interpreter->interpret($tokens);
}
}
// Concrete class
class Parser extends ParserAbstract
{
function __construct()
{
parent::__construct(
new Normalizer(),
new Tokenizer(),
new Interpreter()
);
}
}
// Concrete class
class XmlParser extends ParserAbstract
{
function __construct()
{
parent::__construct(
new NormalizerXml(),
new TokenizerXml(),
new Interpreter()
);
}
}