9

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

我最初的方法是:

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

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

替代方案是:

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

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

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

有没有更好的方法来做到这一点,或者我可以采取不同的方法来删除幻数?还是我必须根据具体情况接受和考虑紧密耦合?

4

2 回答 2

4

这是所需的耦合。虽然让应用程序和它的错误管理器松散耦合是个好主意,但没有理由将应用程序和它的错误代码分开,它们属于一起

依赖项:

+-----------------------+
|Application error codes|<------------+
+-----------------------+             |
           ^                          |
           |                          |
+----------+----------+               |
|Application component|               |
+----------+----------+               |
           |                          |
           v                          |
+-----------------------+     +-------+-----+
|Error handler interface|<|---+Error handler|
+-----------------------+     +-------------+
于 2013-02-12T13:56:59.300 回答
1

您可以使用“预处理器”宏和生成文件来清除其中一些障碍。预处理器宏来自m4

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

   define(`ERR_REQUIRED_FIELD',`100')dnl

然后,您可以编写带有英文错误“constant”的 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 模块构建定义。

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

于 2013-02-12T15:35:08.080 回答