2009-07-23 17 views
3

クラスのネスト化と比較して、クラスを結合する(あるいは、あるクラスの結果を使って別のクラスを生成する)ことの相対的な長所と短所は何ですか?2つの相互作用するクラスのOOP設計アプローチ

私はユーザー/認証システムを再構築しようとしていますか?

    ユーティリティとして、ログインが成功した場合、単純に新しいいるmyuserclassオブジェクトを作成し行動しなければならない
  • myAuthClass
  • またはmyAuthClassが内部でいるmyuserclassを作成するかどうか(すなわちます$ this->ユーザー=新しいいるmyuserclass)
  • 、または必要に応じてmyUserClassがmyAuthClassを呼び出すだけで(つまり、ユーザーがログインしようとしたとき)、必要に応じて内部構造(新しい電子メール、お気に入り、カートなど)を更新する必要があります。

私は少しOOP n00bだと分かります。具体的には、私はそれぞれの方法について事例を作ることができるように思われるので、私は様々なアプローチの+ ves/-vesに関する他の人の意見に興味があります。

乾杯。

答えて

1

3つの選択肢すべてが、抽象的なインターフェースではなく、具体的な実装に対してプログラムされているという点で、誤っています。このように、それらは直接結合されているため、再利用が制限されます。

IUserClassまたはIAuthClassを生成して、この抽象インターフェイスを具象クラスに実装し、次に認証クラスの実装でIUserClassを取得した場合や、ユーザークラスにIAuthClassは、認証されます。

これは、認証クラスが再利用され、異なるバージョンのUserClassが生成される可能性があるという点で最も柔軟性があります。ユーザークラスは、継承されている限り、複数の異なる認証メカニズムを使用できますIAuthClassから取得します。

ユーザークラスに(IAuthClassを実装する)認証オブジェクトを与える後者のアプローチは、ユーザークラスがあまり変更されない一方で、単一のアプリケーションであっても認証メカニズムが異なります。しかし、正確であるためにはどちらも具体的な実装に基づくべきではありません。

これは上から見ることができるので、判断の呼び出しです。

+0

非常に良い点、私の特定のプロジェクトに最も関連しています。 – Mathew

+0

外部依存関係が存在しない場合は、具体的な実装に対するプログラミングに問題はありません。つまり、クラスが同じパッケージ内でのみ使用されている場合(パッケージは非常に密着しています)、インターフェースを持たないという障害はありません。 –

1

まず、アダプタパターンを使用することをお勧めします。特定のタイプの認証を実装するクラスを作成するよりも、インターフェイス(パブリックメソッド)を定義する抽象クラスを用意する必要があります。たとえば、DBベース認証用のクラス/アダプタ、LADP認証用のクラス/アダプタなどを作成できます。

車輪を改造するのではなく、準備が整ったソリューションを使用することをお勧めします。私はZend_Authを使用しました。これはアダプタパターンを実装しています。 Zend_Authを使うことで、良いOOP実践、アダプタパターン、インタフェースと抽象クラスの使い方を理解することができます。

ここでは、私がZend_Authをイントラネットでどのように使用したかを見ることができます。

 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.' 
      ); 
     } 
    } 
+0

アダプターパターンとZendへの参照は+1。それは非常に有用なケーススタディを作るでしょう。 – Mathew

0

連鎖クラスの主な利点は、そう一方が他方に全く(またはたくさん以下)効果を有する修正、それらを互いに独立しを​​行っています。たとえば、Authentificationメソッドを変更したい場合は、ユーザーを変更する必要はなく、その逆も同様です。

他の小さな利点は、両方の方法のために出てきますが、将来の発展の可能性が高いOpenIDのスタイル認証システムが含まれるように、この保守性は、ここでの主な1

関連する問題