2009-08-27 12 views
0

In OOP ist es besser, Klassenattribute innerhalb von Klassenfunktionen zu verwenden oder Parameter an sie zu übergeben.Parameter vs. Attribute (Klassenvariablen)?

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 
    } 
} 

Was ist der bessere Weg zu gehen?

Antwort

0

Einige Klärung der Terminologie zuerst:

Was Sie Klasse Funktionen sind mehr nennen richtigMethoden aufgerufen. Eine Methode ist eine Funktion für eine Objektinstanz. Zusätzlich können Klassen Methoden haben.Diese heißen Klassenmethoden oder statische Methoden. Wenn Sie den Begriff Klassenfunktion verwenden, verwirren Sie damit die Bedeutung.

Die angesiedelt, ist es nicht schlechter oder besser der beiden Ansätze. Sie würden beide verwenden, abhängig vom Kontext. Parameter haben einen kleineren Umfang und verursachen somit weniger Kopplung. Wenn alles andere gleich ist, würde ich sagen, dass Parameter dem Setzen einer Objekteigenschaft vorzuziehen sind.

Das heißt, gibt es in der Regel andere Faktoren, welche holen bestimmen kann. Sie können sich ein Objekt als einen Bereich für verwandte Variablen vorstellen. Wenn eine Variable zu diesem Bereich gehört, wäre es sinnvoll, sie einer Eigenschaft zuzuordnen.

0

Klassenattribute sollen den Zustand einer Instanz der als Objekt bekannten Klasse beschreiben. Daher können die Attribute von jeder Funktion der Klasse verwendet werden, um ihren Zustand zu ändern. Funktionsparameter hingegen haben möglicherweise nichts mit dem aktuellen Zustand des Objekts zu tun, können aber verwendet werden, um ihren Zustand zu ändern.

Beispiel: Ein Benutzerobjekt könnte ein Benutzername-Attribut, ein Kennwort-Attribut und ein authentifiziertes Attribut erwarten. Dieses Benutzerobjekt hat auch eine Funktion namens authenticate, die einen Parameter verwendet, der eine Authentifizierungsmethode beschreibt. Der Parameter wird verwendet, um den Status des Benutzerobjekts zu ändern, würde aber nicht als Attribut davon gehalten.

0

Das hängt ganz davon ab, ob Sie die Daten erneut verwenden und wie Sie die Klasse verwenden.

Wenn Sie viele einzelne Instanzen der Klasse erstellen und jedes Objekt einen eindeutigen Benutzer darstellt, ist es sinnvoll, die Daten in einer Membervariablen zu persistieren. Wenn Sie die Klasse als DAO (Datenzugriffsobjekt) mit vielen einmaligen Operationen verwenden, ist es wahrscheinlich nicht sinnvoll, die Daten zu persistieren. Aber selbst in einem DAO kann es in Abhängigkeit von seiner inneren Funktionsweise sinnvoll sein, die Daten zumindest temporär in einer Membervariablen zu speichern, wenn viele Funktionen in einem einzigen Aufruf involviert sind (wie beforeQuery und afterQuery Callbacks oder dergleichen).

Es gibt keinen besseren Weg, der passt.

1

Zwischen Ihren Lösungen ist zuerst besser, aber Sie müssen die Namen der Funktionen ändern. 'get' sollte nur verwendet werden, wenn die Funktion etwas zurückgibt.

Der Grund, warum es besser ist, ist, dass es keine Nebenwirkungen verwendet, Nebenwirkungen immer schlecht, wie sie für Benutzer der Klasse unsichtbar sind, aber Klassenverhalten ändern. Sie sollten also versuchen, sie zu minimieren oder sie so zu machen, wie sie es im ersten Fall sind, wenn sie nicht wirklich "Seite" sind.

Aber in diesem speziellen Fall Get_Existing_User und Add_User statische Funktionen sein sollen, dass neues User Objekt zurückgeben, wird es manchmal als statischer Konstruktor aufgerufen. Der Grund, warum es viel besser ist, dass es klar macht, was diese Funktionen tun, sie erhalten etwas als Parameter (user_id des vorhandenen Benutzers oder first_name, last_name und andere Attribute für einen neuen Benutzer) und erstellen ein Objekt, das den Benutzer darstellt. Alle Datenbankmanipulationen werden versteckt. Das Objekt selbst sollte Eigenschaften für Namen und andere Attribute haben und sogar die Methode Save(), um die Änderungen zurück zu schieben. Aber die Hauptidee besteht darin, dass Sie immer mit konstruierten Objekten arbeiten, Objekte, die bereits einen Kontext haben und mit etwas in der realen Welt verknüpft sind (dh Benutzer in der Datenbank), nicht eine leere Shell, die ausgefüllt wird.

0

Es ist wichtig, dass Sie die Methode wählen, die am besten zu Ihrer Situation passt. Ignoriert, dass nicht so hilfreich Vorschlag, den ich Sie ermutigen, auf einige wichtige Grundsätze in Objektorientiertes Design

  1. Coupling
  2. Cohesion

Ein starkes Verständnis für diese Themen einen guten Blick zu nehmen, helfen Ihnen Beurteilen Sie Ihre Situation und Ihren Code, um die Ziele des Projekts zu erreichen. Wenn Ihr Projekt wächst, werden Sie wahrscheinlich Methoden verwenden, die über optionale Parameter verfügen, um mit Ihren Objekten zu interagieren, um eine hohe Kohäsion und lockere Kopplung zu erreichen. Dann verwenden Sie Methoden und Parameter wie ein Experte.