避免使用幻数而不创建依赖关系

时间:2013-02-12 13:46:17

标签: php dependency-injection enums tightly-coupled-code

我正在为我正在处理的API创建一个错误管理器。这个想法是它提供了一个可以从API返回的错误代码存储,确保以相同的方式处理不同调用中的相同错误(例如,请求中缺少所需的值)。

我的初步方法是:

$this->_errorManager->setError(ErrorCodes::REQUIRED_FIELD);

但是,这会在我想要设置错误的任何地方创建对错误代码类的依赖。

替代方案是:

$this->_errorManager->setError(100);

但现在我的代码中间有一个数字,但没有任何意义。

虽然我可以想到这个特定问题的解决方案,但是在其他情况下我会想要使用'枚举'而我想不出一个没有紧密结合类的解决方案。

有没有更好的方法可以采取这种方法或采取不同的方法来消除幻数?或者是我必须接受并根据具体情况考虑的紧密耦合?

2 个答案:

答案 0 :(得分:4)

这是理想的耦合。虽然最好让应用程序及其错误管理器松散耦合,但没有理由将应用程序及其错误代码分开,它们属于

<强>依赖关系:

+-----------------------+
|Application error codes|<------------+
+-----------------------+             |
           ^                          |
           |                          |
+----------+----------+               |
|Application component|               |
+----------+----------+               |
           |                          |
           v                          |
+-----------------------+     +-------+-----+
|Error handler interface|<|---+Error handler|
+-----------------------+     +-------------+

答案 1 :(得分:1)

您可以使用“预处理器”宏和makefile清除这些障碍的部分。预处理器宏来自m4

假设你维护一个像这样的错误代码文件。

   define(`ERR_REQUIRED_FIELD',`100')dnl

然后你可以用英文错误“常量”编写你的PHP代码。

$this->_errorManager->setError(ERR_REQUIRED_FIELD);

在makefile中包含一行,通过m4运行这两个文件。管理它的方法不止一种。 (为简洁起见,我省略了makefile,只是通过m4运行我的测试文件。)

$ m4 test.php.m4 > test.php
$ cat test.php
$this->_errorManager->setError(100);

引入依赖关系; php文件将全部依赖于错误代码的文件。但它是一个简单的依赖,可以通过makefile轻松管理。在实践中,我可能会构建一个看起来像这样的错误代码文件。 。

ERR_DISK_FULL
ERR_REQUIRED_FIELD
ERR_MISSING_ARG

并使用文字工具和make

  • 构建m4宏定义,或
  • 构建ErrorCodes模块的定义。

数值等于行号;这可以保证您永远不会有重复的错误代码。