2010-05-25 5 views
5

Es folgt eine Frage bezüglich der Verwendung von Eigenschaften in der Klasse.Eigenschaft und Kapselung

Ich habe öffentliche Eigenschaften verwendet, anstatt Membervariablen öffentlich verfügbar zu machen. Die Mehrheit empfiehlt, dass dieser Ansatz die Kapselung unterstützt. Allerdings verstehe ich den Kapselungsvorteil nicht, indem ich ihn zu einer Eigenschaft mache.

Viele Menschen wissen nicht den wahren Grund für die Verwendung von Eigenschaften. Sie tun es nur als Teil des Kodierungsstandards.

Kann jemand klar erklären, wie eine Eigenschaft besser ist als die Variable public member und wie sie die Kapselung verbessert?

Antwort

6

Kapselung hilft, indem Aufrufklassen von Änderungen isoliert werden.

Stellen wir uns vor, Sie haben eine einfache Klasse, die einen Automotor modelliert (weil alle OO-Beispiele eine Autoanalogie beinhalten sollten :)). Sie können ein einfaches Feld wie diese:

private bool engineRunning; 

einfach dieses Feld öffentlich zu machen oder eine IsEngineRunning() Getter Bereitstellung scheint nicht anders zu sein.

Angenommen, Sie Ihre Klasse anspruchsvoller machen, Sie wollen das Feld entfernen und ersetzen Sie es mit:

private bool ignitionOn; 
private bool starterWasActivated; 

Nun, wenn Sie viele Klassen haben das alte engineRunning Feld Zugriff Sie müssen sie gehen und ändern alle (schlechte Zeiten).

Wenn stattdessen hatte Sie begann mit:

public bool IsEngineRunning() 
{ 
    return this.engineRunning; 
} 

könnten Sie jetzt ändern, um es:

public bool IsEngineRunning() 
{ 
    return ignitionOn && starterWasActivated; 
} 

und die Schnittstelle der Klasse bleibt die gleiche (gute Zeiten).

+0

ich, dass diese Änderung, dass die Kunden geändert werden, bedeutet nicht darauf hinweisen möchte darauf muss. Es bedeutet nur, dass Sie die Eigenschaft motoRunning auf die gleiche Weise und mit der gleichen Semantik wie zuvor verfügbar machen müssen. Der einzige Unterschied besteht darin, dass bei jeder Aktualisierung der Eigenschaften "Zündung" und "Starter" auch die Eigenschaft "motorRunning" aktualisiert werden muss. Je nachdem, was häufiger gelesen/aktualisiert wird, kann dies positive oder negative Auswirkungen auf die Leistung haben. –

1

Einige Gedanken:

  • Sie können die interne Darstellung der Daten ändern, ohne Aufruf Klassen zu beeinflussen.

    z. (vor)

    public boolean isActive() { 
        return this.is_active; 
    } 
    

    (nach)

    public boolean isActive() { 
        return this.is_active && this.approved && this.beforeDeadline; 
    } 
    

    Dies ist besonders wichtig, wenn Ihr Code von anderen verwendet wird (das heißt der Code ist 3rd-Party). Bis zu einem gewissen Grad muss Ihre Schnittstelle/API stabil bleiben. Kleine Änderungen sollten den Code von anderem Code, der es verwendet, nicht beeinflussen.

  • Sie können komplexere Operationen ausführen. Betrachten Sie eine Variable is_active. Wenn Sie den Wert dieser Variablen ändern, wirkt sich dies möglicherweise auch auf andere Eigenschaften des Objekts aus. Wenn Sie den Zugriff in einer Methode kapseln, können Sie dies innerhalb dieser Methode erledigen, und der Aufrufer muss sich nicht darum kümmern.

    z.

    public void setActive(boolean active) { 
        this.is_active = active; 
        this.startTimeout(); 
        this.updateOtherInformation(); 
    } 
    

    Es erzwingt daher eine bestimmte Reihe von Aktionen. Sie nicht haben sich auf die Tatsache verlassen, dass der Aufrufer diese Aktionen ordnungsgemäß ausführt. Ihr Objekt wird immer in einem korrekten Zustand sein.

2

Ich werde es kurz machen. Eigenschaften = Flexibilität

Eigenschaften sind nützlich für die Erstellung von Mitgliedern, die Sie nicht ständig in einer Klasse halten möchten oder die Aggregationen/Funktionen vorhandener Mitglieder sind.

Eg. Alter kann die Ausgabe auf birth basieren, können canSwim von hasLimbs erzeugt werden & & schwimmt

Machen Mitglieder als Eigenschaften kann hilfreich sein, wenn sie mit unerwarteten Veränderungen zu tun [hat jemand vorhersagen jemals alle Anträge des Klienten?] in Systemen mit einem vorhandene Datenbank.

Eg. isAllowed ist wahr, wenn der Benutzer über 18 Jahre alt ist und für die Leistung zwischengespeichert wird. Der Client möchte den Dienst in den USA ausführen, und Sie können false zurückgeben, wenn false chached ist, und das Alter nur dann überprüfen, wenn der Cache wahr ist.

4

Es ist besser, Eigenschaften anstelle von Elementvariablen verfügbar zu machen, da Sie damit alle Arten von Operationen ausführen können Überprüfen, ob der Wert der Elementvariablen gesetzt oder abgerufen wird.

annehmen u eine Membervariable haben:

private int id; 

und Sie haben ein öffentliches Eigentum:

public int ID 
{ 
    get 
    { 
     // do something before returning 
    } 
    set 
    { 
     // do some checking here may be limits or other kind of checking 
    } 
} 
Verwandte Themen