У меня есть класс, выполняющий какую-то операцию, скажем, разбор, и это будет публичный репозиторий.Поскольку конструктор имеет некоторую сложность и не важен для конечного пользователя, я хотел спрятать его за фасадом.
// 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 в приведенном выше коде).
Есть ли в этом отношении устоявшаяся практика?