将依赖项隐藏在外观背后时,正确的命名约定是什么?

时间:2018-09-26 13:35:36

标签: php naming-conventions

我有一个类来执行一些操作,例如解析,它将成为一个公共存储库。因为构造函数有些复杂,并且对于最终用户而言并不重要,所以我想将其隐藏在立面后面。

// 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)。

在这方面是否有完善的做法?

1 个答案:

答案 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()
        );
    }
}