2012-06-05 4 views
6

Ich realisiere dies wahrscheinlich nicht beantwortet, aber ich bin auf der Suche nach gibt es eine Art von Anleitung darüber, ob private Mitglieder direkt oder öffentliche Accessoren innerhalb der Klassenmethoden zu verwenden.Methoden mit privaten Mitgliedern oder öffentlichen Accessoren

Betrachten wir zum Beispiel den folgenden Code (in Java, aber es wäre sehr ähnlich aussehen in C++):

public class Matrix { 

    // Private Members 
    private int[][] e; 
    private int numRows; 
    private int numCols; 

    // Accessors 
    public int rows(){ return this.numRows; } 
    public int cols(){ return this.numCols; } 

    // Class Methods 
    // ... 
    public void printDimensions() 
    { 
     // [A] Using private members 
     System.out.format("Matrix[%d*%d]\n", this.numRows, this.numCols); 


     // [B] Using accessors 
     System.out.format("Matrix[%d*%d]\n", this.rows(), this.cols()); 
    } 

Die printDimensions() Funktion zwei Möglichkeiten veranschaulicht die gleichen Informationen zu erhalten, [A] mit privaten Mitglieder (this.numRows, this.numCols) oder [B] über Zugriffsmodule (this.rows(), this.cols()).

Auf der einen Seite bevorzugen Sie möglicherweise die Verwendung der Accessoren, da Sie den Wert der privaten Membervariablen nicht versehentlich ändern können. Auf der anderen Seite ziehen Sie es möglicherweise vor, direkt auf die privaten Mitglieder zuzugreifen, in der Hoffnung, dass dadurch der unnötige Funktionsaufruf entfernt wird.

Ich denke, meine Frage ist, ist entweder der De-facto-Standard oder bevorzugt?

+0

Code ist Java, nicht C++, Entfernen des Tags. Auf jeden Fall ist die Frage wahrscheinlich mehr * sprachenunabhängig * als Java oder C++ ... –

+1

Dieser wird religiös. Ich glaube nicht, dass es einen Standard gibt. Ich würde jedoch "dies" so oft wie möglich aufgeben. –

+0

Ich stimme zu, dass es sprachunabhängig scheint, weshalb ich ursprünglich C++ einschloss, um den Umfang der Frage nicht auf Java zu beschränken. – jedwards

Antwort

6

Es ist ein Stil Anruf. Ich ziehe es vor, Accessoren zu verwenden, da IMHO der Funktionsaufruf-Overhead klein genug ist, dass es in den meisten Fällen keine Rolle spielt und diese Verwendung die Datenabstraktion bewahrt. Wenn ich später die Art ändern möchte, wie die Daten gespeichert werden, muss ich nur die Accessoren ändern, anstatt nach allen Stellen zu suchen, an denen ich die Variablen berührt habe.

Ich fühle mich nicht stark darüber, und ich würde diese "Regel" brechen, wenn ich dachte, ich hätte einen guten Grund dazu.

+0

Ein anderes Beispiel ist, wenn Sie die Klasse thread sicher machen und auf 'rows' zugreifen müssen in gewisser Weise (z. B. mit einem Schloss). – assylias

+0

@assylias, das wird nicht helfen, wenn Sie mehr als eine Variable aus dem Schloss zugreifen möchten. – finnw

1

Ich habe andere Objekte, einschließlich Unterklassen des Objekts, verwenden die Accessoren, aber das Objekt selbst verwenden die Felder. Auf diese Weise wird klar zwischen den Interna und der Schnittstelle mit dem Rest der Welt unterschieden. Den Inhalt der Klasse vor sich selbst zu verbergen, erscheint unnötig und möglicherweise verwirrend. Wenn etwas wirklich davon profitiert, wenn seine Implementierung von anderen Teilen des Objekts verborgen ist, dann zerlege es in ein separates Objekt.

2

IMHO, Accessoren sind eher eine Frage der Struktur und Datenverwaltung als Accessoren an sich. Manchmal müssen Sie einige Daten vorverarbeiten, bevor Sie sie zurückgeben. Denken Sie an diesem Beispiel:

public class Foo { 

    private List<Bar> bars = null; 

    //Methods and stuff 

    public List<Bar> getBars() { 
     if(bars == null) 
      bars = SomeClass.loadBars(); 
      // You can also use 
      // setBars(SomeClass.loadBars()); 
     return bars; 
    } 

} 

In diesem Fall wird Ihr Getter nicht nur Ihre Feld Einwickeln, sondern eine initialisierte Feld zurückkehren, wenn Sie es aufrufen. Die Verwendung der Accessoren innerhalb einer Klasse bietet die gleichen Vorteile, die Sie für Außenstehende von den speziellen Details eines Feldes abstrahieren, und Sie können es nach der Verarbeitung erhalten.

Andererseits, wenn Ihr Feld direkt zurückgegeben wird (zB ein String), spielt es keine Rolle, ob Sie ein get verwenden oder nicht, aber Sie möchten vielleicht einen get in einem Standard respektieren dein Code.

Am Ende läuft alles auf den Codierungsstil hinaus.