如何在使用其他方法后正确处理成功和错误

时间:2014-03-23 19:42:33

标签: php oop exception single-responsibility-principle

我无法提出解决方案来处理在整个应用程序中一致的成功或失败(错误),到目前为止,我一直坚持从3种可能的解决方案中做出决定。(我对OOP相对较新)

例如,如果我想使用CURL登录远程api,我可以创建一个类似于以下方法的类。

class Api
{
    var $curl;
    var $user;
    var $pass;
    var $buffer;

    function __construct($user,$pass)
    {
        $this->curl = new curl();
        $this->user = $user;
        $this->pass = $pass;
    }

    functon login()
    {
        $url = 'http://example.com/login/';
        $postfields = array($user => $this->user, $pass => $this-pass);

        $this->buffer = $this->curl->post($url,$postfields);
    }

}

在使用login()之后,我们有一些可能的结果,成功登录,糟糕的登录(来自api的信息,例如用户/传递不正确),页面加载失败(服务器不可用)或可能是CURL错误。(更多问题可能但列出足够)

一种基本方法是创建另一种方法loginSuccessful()

loginSuccessful()
{
    if(strstr($this->buffer,'Welcome user: "zzzz"'))
        return true;

    if(strstr($this->buffer,'Incorrect user or pass'))
        return false;

    if(strstr($this->buffer,'server unavailable'))
        return false;

    if(curl_error($this->curl->ch))
        return false;

    else
        return false;
}

我可以在发布数据后在login()方法中调用它。

    functon login()
    {
        $url = 'http://example.com/login/';
        $postfields = array($user => $this->user, $pass => $this-pass);

        $this->curl->post($url,$postfields);

        if(loginSuccessul())
            return true;
        else
            false;
    }

这种方式当然是太基本的,并没有提供有关错误的大量信息,为了改善这一点,如果成功则返回true,如果不成功则返回错误消息(而不是false)。

loginSuccessful()
{
    if(strstr($this->buffer,'Welcome user: "zzzz"'))
        return true;

    if(strstr($this->buffer,'Incorrect user or pass'))
        return 'Incorrect user or pass';

    if(strstr($this->buffer,'server unavailable'))
        return 'server down';

    if(curl_error($this->curl->ch))
        return curl_error($this->curl->ch);

    else
        return 'some other error';
}

我们使用它和以前一样,但是对于返回不同的类型感觉不对。(有时是布尔值,有时是字符串)

另一种可能的方法是保持第一种方法中的true / false样式,但是构建另一种方法,例如loginError(),我们再次使用login()放置

    functon login()
    {
        ...
        ....
        if(loginSuccessul())
            return true;
        else
            return loginError();
    }

现在这给了我们一些详细的错误信息,但即使这种方法感觉也不对,因为总的来说我将很多文本信息与逻辑混合在一起,似乎我打破了一些 SOLID 原则。

可能问题在于班级结构和我的方法,我所做的一切都是不正确的,因为我在一个糟糕的结构/思维模式中工作。

提前感谢任何想法。

1 个答案:

答案 0 :(得分:0)

为了做到这一点:你想要一个能够返回一些内容的登录功能,这样你知道一切都很好,加上一些额外的东西,以确定在功能失败时什么不起作用?

我知道有两种方法可以实现这个目标:

  1. 返回bool(true / false是否有效)并在您的类中提供一个额外的错误字符串,该字符串不会被返回并且可以单独设置。有关详细信息,请参阅MSDN中的GetLastError。您可以在PHP脚本中实现类似的功能。

  2. 例外情况( - > PHP: Exception - Manual

    if(strstr($this->buffer,'server unavailable')) throw new Exception("some wild     exception occured, feed me with some data and catch me later");
    
  3. 就我个人而言,我建议您使用例外,因为它们通常比手动构建错误代码和错误字符串更好/更容易维护并且耗时更少。