与嵌套类相比,将类链接在一起(或者更确切地说,使用一个类的结果生成另一个类)的相对优点/缺点是什么?
我正在尝试重构我的用户/身份验证系统,我想知道是否;
你可以告诉我有点OOP n00b。我似乎能够为每种方法提供一个案例,所以我有兴趣听取其他人关于各种方法的+ ves / -ves的信息。
干杯。
答案 0 :(得分:1)
从学术角度来看,所有3个选项都是错误的,因为它们是针对具体实现编程的,而不是针对抽象接口。因此,它们直接耦合在一起,这限制了重复使用 - 您可以重复使用它们,也可以根本不重复使用它们。
你可以生成IUserClass或IAuthClass并将这个抽象接口实现到一个具体的类中,然后我会考虑这样一种情况,即auth类实现在进行身份验证时需要IUserClass,或者给用户类一个IAuthClass的实现进行身份验证。
在每个场景中,这允许最灵活性,因为可以重用auth类并且可以生成不同版本的UserClass,或者用户类能够使用多种不同的身份验证机制,只要继承自IAuthClass。
后一种为用户类提供身份验证对象(实现IAuthClass)的方法将是我的首选,因为即使使用单个应用程序,身份验证机制也会有所不同,而用户类的更改会更少。但为了正确,两者都不应基于具体的实施。
然而,这可以被视为超越,所以这是一个判断。
答案 1 :(得分:1)
首先,我建议您使用适配器模式。您应该有一个定义接口(公共方法)的抽象类,而不是创建实现特定类型的身份验证的类。例如,您可以为数据库基本身份验证创建一个类/适配器,一个用于LADP身份验证......等等......
最好不要重新发明轮子,你应该使用现成的解决方案。我使用了Zend_Auth,它实现了适配器模式。通过使用Zend_Auth,您可以了解良好的OOP实践,适配器模式,接口和抽象类的使用,如果您愿意的话。
在这里,您可以看到我如何将Zend_Auth用于Intranet;
protected function Authentication() {
$strEmail = trim($this->txtEmail->Text);
$this->txtPassword->Text = trim($this->txtPassword->Text);
// do the process of authentication, AD and then DB
// Get a reference to the singleton instance of QAuth
$auth = QAuth::getInstance();
// Set up the authentication adapter
$authAdapter = new QAuth_Adapter_WebService(__LOGIN_WS_URL__,
$strEmail, $this->txtPassword->Text
);
// Attempt authentication, saving the result
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
$objUser = User::LoadByEmail($strEmail);
// if there is not a user's record create one
if(!$objUser) {
$this->User_Create($strEmail);
$objUser = User::LoadByEmail($strEmail);
}
$crypt = new Encryption();
$encr = $crypt->encrypt(__KEY__, $objUser->UserID);
$_SESSION['user_id'] = $encr;
setcookie('user_id', $_SESSION['user_id'], time()+(3600*24*365*20));
$this->Intranet1Integration($objUser->UserID);
QApplication::Redirect('http://'.__URL__.'/index.php');
}
else {
QApplication::DisplayAlert(
'Log on failed. You must provide a Company email and a correct password.'
);
}
}
答案 2 :(得分:0)
链接类的主要优点是使它们彼此独立,因此修改它对另一个没有(或很少)影响。例如,假设您要更改Authentification方法,则无需更改用户,反之亦然。
这两种方法都有其他小优点,但这种可维护性是这里的主要优势