2009-08-27 17 views
0

OOPでは、クラス関数内でクラス属性を使用する方が良いか、それともパラメータを渡す方が良いでしょうか。パラメータ対属性(クラス変数)?

class User{ 
    private $user = array(); 

    public function Get_Existing_User($user_id){ 
    //SQL selects user info for existing user 
    $this->user = mysqli_fetch_assoc(); 
    } 

    public function Set_User($user_data){ 
    $this->user = (array) $user_data; 
    } 

    public function Add_User(){ 
    //insert everything from $this->user into database 
    } 

    public function Get_User(){ 
    return $this->user; 
    } 
} 

VS

class User{ 

    public function Get_Existing_User($user_id){ 
    //SQL selects user info for existing user 
    $user = mysqli_fetch_assoc(); 
    return $user; 
    } 

    public function Add_User($user_data){ 
    //insert everything from $user_data into database 
    } 
} 

行くにいただきましたより良い方法はありますか?

答えて

0

用語のいくつかの明確化:あなたはクラス関数呼び出す何

は、より適切な方法と呼ばれています。メソッドはオブジェクトインスタンスの関数です。さらに、クラスにはメソッドがあるかもしれません。これらは、クラスメソッドまたはスタティックメソッドと呼ばれます。用語をクラス機能と使用すると、意味が混乱することになります。

それは解決しましたが、2つのアプローチのどちらかが悪くなくても良いです。コンテキストに応じて、両方を使用します。パラメータのスコープが狭いため、結合が少なくなります。 他のすべてが同じであれば、オブジェクトプロパティを設定するよりもパラメータを優先すると言えます。

これは、通常、選択する他の要素があります。オブジェクトは、関連する変数のスコープと考えることができます。変数がそのスコープに属している場合、それをプロパティに割り当てることは意味があります。

0

クラス属性は、オブジェクトとして知られるクラスのインスタンスの状態を表すことが期待されます。このように、クラスの任意の関数が属性を使用して、その状態を変更することができます。一方、関数のパラメータは、オブジェクトの現在の状態とは何の関係もなく、その状態を変更するために使用できます。

たとえば、ユーザーオブジェクトには、ユーザー名属性、パスワード属性、および認証された属性が含まれている可能性があります。このユーザオブジェクトには、認証メソッドを記述するパラメータを取るauthenticateと呼ばれる関数もあります。このパラメータは、ユーザーオブジェクトの状態を変更するために使用されますが、ユーザーオブジェクトの属性として保持されることはありません。

0

これは、データを再利用する方法と、クラスをどのように使用しているかによってまったく異なります。

クラスの個々のインスタンスを多数作成し、各オブジェクトが一意のユーザーを表している場合は、データをメンバ変数に保持するのが理にかなっています。一度の操作でDAO(データアクセスオブジェクト)としてクラスを使用している場合、おそらくデータを永続化するのには意味がありません。しかし、たとえDAOであっても、1回の呼び出し(例えば、beforeQueryafterQueryコールバックなど)に多くの機能が含まれていると、少なくとも一時的にメンバ変数にデータを格納するのが理にかなっています。

これ以上の方法はありません。

1

解決策の間では、最初は優れていますが、機能の名前を変更する必要があります。 'get'は関数が何かを返すときにのみ使われるべきです。

これは、副作用を使用しないことです。副作用は常にクラスのユーザーには見えませんが、クラスの動作を変更するためです。だから、あなたはそれらを最小限にしようとするか、最初の場合と同じように明白にするべきです。

Get_Existing_UserAdd_Userは、新しいUserオブジェクトを返す静的関数である必要があります。静的コンストラクタと呼ばれることもあります。それがはるかに優れている理由は、その関数が何をしているのかを明確にし、パラメーターとして何かを取得し(新しいユーザーの既存のuser_idまたはfirst_name、last_nameなどの属性)、ユーザーを表すオブジェクトを作成するからです。すべてのデータベース操作が隠されます。オブジェクト自体には名前やその他の属性のプロパティがあり、Save()メソッドでも変更を元に戻す必要があります。しかし、主なアイデアは、常にあなたが行くように記入される空のシェルではなく、現実世界(つまり、データベースのユーザー)に何かにリンクされている構築オブジェクト、オブジェクトで動作することです。

最初
0

あなたの状況に最も適した方法を選択することが重要です。私は、オブジェクト指向設計

  1. Coupling
  2. Cohesion

これらのトピックの強い理解する上でいくつかの重要な原則をよく見てとることをお勧めそれほど有用ではない提案がお手伝いしますことを無視しますあなたの状況を評価し、プロジェクトの目標に合ったコードを作成します。プロジェクトが成長するにつれて、オプションのパラメータを持つメソッドを使用してオブジェクトとやりとりして、高い結束力と疎結合を達成したいと考えるでしょう。次に、エキスパートのようなメソッドとパラメーターを使用します。

関連する問題