两个交互类的OOP设计方法

时间:2009-07-23 13:43:06

标签: php design-patterns oop

与嵌套类相比,将类链接在一起(或者更确切地说,使用一个类的结果生成另一个类)的相对优点/缺点是什么?

我正在尝试重构我的用户/身份验证系统,我想知道是否;

  • myAuthClass应该充当实用程序,如果登录成功,只需创建一个新的myUserClass对象
  • 或者myAuthClass是否应该在内部创建myUserClass(即$ this-> user = new myUserClass)
  • 或者甚至myUserClass应该在必要时(即当用户尝试登录时)调用myAuthClass并根据需要更新其内部结构(新电子邮件,收藏夹,购物车等)。

你可以告诉我有点OOP n00b。我似乎能够为每种方法提供一个案例,所以我有兴趣听取其他人关于各种方法的+ ves / -ves的信息。

干杯。

3 个答案:

答案 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方法,则无需更改用户,反之亦然。

这两种方法都有其他小优点,但这种可维护性是这里的主要优势