对依赖于其他方法结果的方法进行正确设计


Correct design for methods that rely on the results of other methods

我正在开发一个对象来与API接口。对 API 的某些调用需要身份验证,而其他调用则不需要。就最佳实践而言,应该

一)身份验证方法返回令牌。该方法在调用需要身份验证的 api 调用/方法之前从控制器调用,令牌作为参数传入。

class api {
    public function auth() {
        .....
        return $token;
    }
    public function getInfo($token) {
        .....
    }

b)身份验证方法使用令牌设置类的属性,您必须记住在调用需要身份验证的方法之前调用该方法

class api {
    private $token;
    public function auth() {
        .....
        $this->token = $token;
    }
    public function getInfo() {
        $token = $this->token;
        .....
    }

c)需要对身份验证方法本身进行身份验证调用的方法

class api {
    private $token;
    public function auth() {
        .....
        return $token;
    }
    public function getInfo() {
        $token = $this->auth();
        .....
    }

我想上面可以有一个缓存的身份验证作为属性,以保存对身份验证 api 调用的不必要调用。

还是其他方式?只是寻找哪个是此类对象的最佳实践以及原因。提前感谢!

"

c"是要走的路。

没有其他对象需要知道哪个方法需要身份验证,哪个不需要。

事实上...您的 auth() 方法甚至不应该是公开的,并且凭据"user, pass"应该通过 API 类中的构造函数传递。

参见:http://en.wikipedia.org/wiki/Separation_of_concerns

从长期可维护性的角度来看,在三个可等待的选项中,选项 A 是更好的一个。这是因为您应该测试所有public方法。 直接传递值,而不是对公共方法进行内部调用,使得为该特定类编写单元测试变得更加容易。

也就是说,身份验证通常是它自己的东西,而不是类的一部分,类也会做其他事情,如本文所述。您示例中的方法让我怀疑您违反了 SRP。

更新

现在我想到了,有一个类,其中一个公共方法将另一个公共方法作为依赖项,可能被视为与 SRP 冲突相关的代码异味。