【发布时间】:2014-05-01 00:35:48
【问题描述】:
我无法想出一个解决方案来处理整个应用程序中一致的成功或失败(错误),到目前为止,我一直无法从 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';
}
我们和以前一样使用它,但是返回不同的类型感觉有些不对劲。(有时是布尔值,有时是字符串)
另一种可能的方法是保持第一种方法中的真/假样式,但构建另一个方法,如 loginError(),我们再次将其与 login() 一起放置
functon login()
{
...
....
if(loginSuccessul())
return true;
else
return loginError();
}
这现在给了我们一些详细的错误信息,但即使是这种方法也感觉不对,因为总的来说我将大量的文本信息与逻辑混合在一起,也似乎我违反了一些 SOLID 原则。
可能问题出在班级结构和我的方法上,我所做的一切都是不正确的,因为我的工作结构/心态不好。
提前感谢您的任何想法。
【问题讨论】:
标签: php oop exception single-responsibility-principle