Frage

(Abgesehen von der Frage, sollte man sich überhaupt hat.)

Ich habe immer bevorzugt nur Funktion Überlastung Sie beide den gleichen Namen zu geben, für die Getter und Setter.

int rate() { return _rate; }      
void rate(int value) { _rate = value; }

// instead of     
int getRate() { return _rate; }      
void setRate(int value) { _rate = value; }

// mainly because it allows me to write the much cleaner     
total( period() * rate() );    
// instead of      
setTotal( getPeriod() * getRate() );

Natürlich bin ich richtig, aber ich fragte mich, ob die Bibliothek Autoren einen guten Grund gehabt?

War es hilfreich?

Lösung

Ich würde es vorziehen, die get / set-Versionen, weil es klar, ist das, was vor sich geht. Wenn ich Rate sehe () und die Geschwindigkeit (10), wie kann ich wissen, dass Rate (10) nicht nur 10 in der Berechnung mit dem Kurs zurückzukehren? Ich weiß nicht, also jetzt muss ich starten Sie die Suche, um herauszufinden, was los ist. Eine einzelne Funktionsnamen sollte eine Sache, die nicht zwei gegensätzliche Dinge.

Auch, wie andere haben darauf hingewiesen, einige bevorzugen die ‚get‘ und lassen Sie die ‚Set‘, d.h.

wegzulassen
int Rate( );
void SetRate( int value );

Dieses Übereinkommen ist ziemlich klar, wie gut, würde ich kein Problem, dass das Lesen hat.

Andere Tipps

Ich habe immer bevorzugt die ‚get‘ auf meine Getter wegzulassen, wie Sie tun, mit rate() statt getRate(). Aber für die Setter Überlastung scheint nicht wie eine sehr gute Idee zu mir, da der Name rate nicht ersichtlich, dass das Objekt mutiert wird. Bedenken Sie:

total(period() * rate()); // awesome, very clear

rate(20); // Looks like it computes a rate, using '20'...but for what?  And why ignore the return value?

Wie wäre es int rate(); und void setRate(int value);? Dies hat den Grund nicht mit zwei Funktionen mit dem gleichen Namen unterschiedliche Dinge zu tun, und ermöglicht noch period() * rate().

Vor ein paar Jahren hätte ich völlig zugestimmt. In jüngster Zeit begannen Zweifel seinen Weg zu machen, denn das ist unter der Adresse eines Getter oder Setter mehrdeutig macht. Mit Tools wie tr1 :: bind, das ist wirklich ärgerlich.

Zum Beispiel:

struct A
{
   void Foo(int);
   int Foo()const;
};

std::vector<A> v = ....;
std::vector<int> foos;
// Extract Foo
std::transform(
   v.begin(), v.end(), 
   std::back_inserter(foos), 
   //Ambiguous
   // std::tr1::bind(&A::Foo)
   //must write this instead. Yuck!
   std::tr1::bind(static_cast<int(Foo::*)()>(&A::Foo));
);

Abgesehen von der Frage, sollten Sie sie überhaupt haben; -)

Ich gehe voran und erwähnen sollte dies ein Community Wiki Frage sein.

Als ich C begann das Lernen ++ Ich suchte nach Styleguides und Google war gut für einige Punkte:

  • Methoden in Großbuchstaben (es ist nur schöneres).
  • Getter klar und lowecase (rate).
  • Setter explizit und Klein (setRate).

prägnant zu sein, ist wichtig, aber nicht auf Kosten der unvollständig oder irreführend sein. Aus diesem Grund ziehe ich getFoo () und setFoo (), um Foo () und Foo (int foo).

Es gibt mehrere Ebenen zu „bekommen“ und „Einstellung“

  • Ich benutze Get und Set für "schnelle" Operationen.
  • Wenn etwas längere Zeit ausführen nehmen, dann wird es oft ein Calc, da diese Namen bedeuten, dass einige Arbeit zu tun hat das Ergebnis abgerufen werden.
  • Bei längeren Operationen, die Sie in Präfixe wie Laden / Speichern zu erhalten beginnen, Query / Store, Lesen / Schreiben, Suchen / Finden etc.

So / Set Erhalten Sie können eine nützliche Bedeutung zugeschrieben werden, und ein Teil einer größeren, konsistente Namensgebung Strategie sein.

Während Ed Kommentar wahr ist, muß ich tatsächliche Eigenschaften über den Setter / Getter Antipattern bevorzugen. Wenn 1/3 der Methoden in Ihren Domain-Graphen sind Dummy-Methoden, die von Eclipse erzeugt wurden, gibt es etwas falsch.

Ohne erstklassige Eigenschaften, aber ich glaube, die Antipattern am meisten Sinn macht.

Darüber hinaus macht es die Code-Vervollständigung einfacher.

obj.set (control shift space) für Setter
obj.get (control shift space) für Getter

Ich persönlich denke, Getter und paarweise gefunden Setter ein Codegeruch sind von „visual“ Sprachen übertragen und ihre „Eigenschaften“. In einer „guten“ Klasse, sind die Datenelemente oder write nur lesbar, aber nicht lesen / schreiben.

Ich denke, die häufigste Ursache von Getter und Setter ist das Objektmodell nicht tief genug tragen. In Ihrem Beispiel, warum wird die gesamte Wesen der Zeit und die Rate weitergegeben? Sind sie nicht Mitglieder der Klasse? Sie sollten also nur den Zeitraum einstellen und die Geschwindigkeit, und Sie sollten nur insgesamt bekommen.

Es gibt wahrscheinlich Ausnahmen, aber ich hasse es, in einer Klasse zu suchen und zu finden „getX / setX, getY / Sethos, etc. etc.“ Es scheint gerade nicht genügend Gedanken war die Klasse setzen in, wie verwendet werden soll und nicht der Autor machte die Klasse EASY an die Daten kommen, damit er nicht überlegen müssen, wie die Klasse verwendet werden soll.

Natürlich bin ich richtig.

Ein weiteres Problem, sonst niemand erwähnt hat, ist der Fall der Funktion Überlastung. Nehmen Sie diese (gekünstelt und unvollständig) Beispiel:

class Employee {
    virtual int salary() { return salary_; }
    virtual void salary(int newSalary) { salary_ = newSalary; }
};

class Contractor : public Employee {
    virtual void salary(int newSalary) {
        validateSalaryCap(newSalary);
        Employee::salary(newSalary);
    }
    using Employee::salary; // Most developers will forget this
};

Ohne diese Klausel using Nutzer von Contractor kann nicht das Gehalt abfragen wegen der Überlastung. Ich habe vor kurzem -Woverloaded-virtual auf die Warnung Satz eines Projektes arbeite ich an hinzugefügt, und siehe da, das zeigte sich ganz über dem Platz.

ich Durchsetzung der Konvention, in dem ein Verfahren immer ein Verb und eine Klasse sein sollte sollte immer ein Substantiv (außer functors, aus offensichtlichen Gründen). In diesem Fall wird ein get / set-Präfix muss auf Konsistenz verwendet werden. Das heißt, ich stimme auch ganz mit Ed Swangren. Diese fasst mir als diejenigen Präfixe ein Kinderspiel mit.

Ich ziehe die Get- und Set-Etiketten zu vermeiden, wird die Information nicht für den Compiler benötigt für die meisten dieser einfachen Eigenschaften ist es Arbeit zu tun.

Sie können Probleme haben:

class Stuff {
  void widget( int something ); // 'special' setter
  const Widget& widget( int somethingelse ) const; // getter
}
Stuff a; 
a.widget(1); // compiler won't know which widget you mean, not enough info

Wenn Ihr Getter einfach rate() ist, würde der Compiler beschweren, dass es eine Neudefinition des anderen rate Symbol, sofern Sie Ihr Feld so ein guter aussagekräftigen Namen gab. In diesem Fall müssen Sie etwas albern wie der Name Ihres Mitglied _rate oder einem ähnlichen Ansatz tun. Ich persönlich hasse es zu sehen / diese Unterstrichen eingeben, so sind in der Regel mit dem getRate() Ansatz gehen.

Das ist natürlich subjektiv und dies geschieht nur meine persönliche Präferenz sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top