Frage

Abgesehen von unmissverständlicher Deutlichkeit, warum sollten wir stick zu:
car.getSpeed() und car.setSpeed(55)
wenn diese verwendet werden könnten, sowie :car.speed() und car.speed(55)

Ich weiß, dass get() und set() sind nützlich, um alle änderungen an den Daten-Mitglied überschaubar, indem Sie alles an einem Ort.

Auch, natürlich, ich verstehe, dass car.speed() und car.speed(55) sind die gleichen Funktion, die macht das falsch, aber dann in PHP und auch im Zend-Framework, das gleiche Aktion verwendet wird, für GET -, POST -, postbacks.
In VB und C# gibt es "Eigenschaften", und von vielen, viel zu den Ekel von Puristen, die ich gehört habe, und es gibt Dinge in Ruby wie 5.times und .each, .to_i etc.
Und Sie haben-operator überladen, mehrfache Vererbung, virtuelle Funktionen in C++ bei bestimmten Kombinationen von denen fahren konnte jemand Nüsse.

Ich meine zu sagen, dass es so viele Paradigmen und Weise, in der Dinge getan werden, dass es scheint seltsam, dass niemand versucht hat, die bestimmte Kombination, die ich erwähnt habe.

Als für mich, mein Grund ist, dass es kurz und Reiniger zu Lesen die code.
Bin ich falsch, etwas falsch, das ist nur seltsam und so nicht verwendet wird, oder was sonst?

Wenn ich immer noch entscheiden, zu bleiben, korrigieren, die ich verwenden könnte car.speed() und car.setSpeed(55).
Ist das falsch, in irgendeiner Weise (einfach weglassen von "get" )?

Vielen Dank für alle Erklärungen.

War es hilfreich?

Lösung

Wenn ich car.speed () genannt wird, könnte ich glaube ich das Auto auf Geschwindigkeit sage, mit anderen Worten die Geschwindigkeit zu erhöhen und die Geschwindigkeitsbegrenzung zu brechen. Es ist nicht ganz klar ein Getter.

Einige Sprachen erlauben Sie const Objekte zu erklären, und Sie dann zu beschränken, nur den Aufruf von Funktionen, die die Daten des Objekts nicht ändern. So ist es notwendig, separate Funktionen für die Modifikation haben und Leseoperationen. Während Sie Überlastungen auf paramaters nutzen könnten zwei Funktionen haben, denke ich, wäre es verwirrend sein.

Auch wenn Sie sagen, dass es klarer zu lesen ist, kann ich behaupten, dass ich einen Blick in der Zukunft zu tun, um zu verstehen, wie es zu lesen:

car.speed()

las ich „Auto Geschwindigkeit ...“ und dann sehe ich es gibt keine Zahl, so ich revidieren und denke „Auto Geschwindigkeit bekommen“.

car.getSpeed()

Ich lese "für dieses Auto, bekommen Geschwindigkeit"

car.setSpeed(55)

Ich las "für dieses Auto, eingestellte Geschwindigkeit auf 55"

Es scheint, dass Sie im Grunde andere Merkmale der Sprache zitieren als verwirrend, und dann verwendet werden, dass als eine Verteidigung für die Herstellung von Getter / Setter mehr verwirrend? Es mag fast Töne werden zugeben, dass, was Sie vorgeschlagen haben, ist mehr verwirrend. Diese Funktionen sind manchmal verwirrend, weil, wie Mehrzweck sie sind. Manchmal können Abstraktionen mehr verwirrend, aber am Ende dienen sie oft dazu, mehr wiederverwendbar sein. Ich denke, wenn Sie sich für Geschwindigkeit () und Geschwindigkeit (55), würden Sie wollen zeigen, argumentieren wollten, wie die neuen Möglichkeiten für den Programmierer ermöglichen kann.

Auf der anderen Seite, macht C # etwas wie das, was Sie beschreiben, da Eigenschaften verhalten sich anders als ein Getter oder Setter je nach Kontext in dem, was sie verwendet werden:

Console.WriteLine(car.Speed); //getter

car.Speed = 55 //setter

Aber während es eine einzige Eigenschaft ist, gibt es zwei separate Abschnitte des Codes für die Umsetzung der immer und Einstellung, und es ist klar, dass dies ein Getter / Setter und nicht eine Funktion Geschwindigkeit, weil sie das () Objekte weglassen . So car.speed () ist eindeutig eine Funktion, und car.speed ist eindeutig eine Eigenschaft Getter.

Andere Tipps

IMHO die C # Art von Eigenschaften als syntaktischer Zucker mit für get und set-Methoden ist die ausdrucksvoll.

Ich ziehe aktive Objekte, die encapsulate Operationen statt Getter und Setter, so dass Sie ein semantisch reichen Objekte erhalten.

Zum Beispiel, obwohl ein ADT eher als ein Business-Objekt, auch die vector in C ++ hat Funktionen gepaart:

size_type capacity() const // how many elements space is reserved for in the vector  
void reserve(size_type n)  // ensure space is reserved for at least n elements 

und

void push_back ( const T& ) // inserts an element at the end
size_type size () const     // the number of elements in the vector

Wenn Sie ein Auto fahren, können Sie das Gaspedal eingestellt, Kupplung, Bremsen und Gangwahl, aber Sie die Geschwindigkeit nicht eingestellt. Sie können die Geschwindigkeit aus dem Tacho lesen. Es ist relativ selten sowohl einen Setter und Getter auf ein Objekt mit Verhalten zu wollen.

FYI, Objective-C verwendet car.speed() und car.setSpeed(55) (außer in einer anderen Syntax, [car speed] und [car setSpeed:55].

Es ist alles über Konvention.

Es gibt keine richtige Antwort, es ist eine Frage des Stils, und letztlich ist es egal. Verbringen Sie Ihr Gehirn Zyklen anderswo.

FWIW Ich ziehe die class.noun () für den Getter und class.verb () für den Setter. Manchmal wird das Verb nur setNoun (), aber auch andere Zeiten nicht. Es hängt von dem Substantiv. Zum Beispiel:

my_vector.size() 

gibt die Größe und

my_vector.resize(some_size) 

ändert die Größe.

Der groovy Ansatz Eigenschaften ist ganz ausgezeichnet IMHO, http://groovy.codehaus.org/Groovy + Beans

Die endgültige Benchmarks des Codes soll dies:

  1. funktioniert es richtig?
  2. Ist es einfach zu beheben, wenn es bricht?
  3. Ist es einfach, neue Features in der Zukunft hinzufügen?
  4. Ist es einfach für jemand anderen zu kommen und fix / verbessern das?

Wenn diese 4 Punkte abgedeckt sind, kann ich mir nicht vorstellen, warum jemand ein Problem mit ihm haben würde. Die meisten der „Best Practices“ sind in der Regel darauf ausgerichtet, diese vier Punkte zu erreichen.

Verwenden Sie je nachdem, was Stil für Sie arbeitet, nur konsequent sein darüber, und Sie sollten in Ordnung sein.

Das ist nur eine Frage der Konvention. In Smalltalk ist es so, wie Sie vorschlagen, getan, und ich erinnere mich nicht, jemals jemand darüber hören beschweren. Immer die Geschwindigkeit des Fahrzeugs car speed ist, und die Fahrzeuggeschwindigkeit auf 55 Einstellung ist car speed:55.

Wenn ich eine Vermutung wagen, würde ich den Grund sagen, diese Art, weil die beiden Linien nicht verfangen ist nach unten der objektorientierten Programmierung zu uns gekommen ist: C ++ und Objective-C. In C ++ (noch so früh in seiner Geschichte) werden Methoden sehr eng mit C-Funktionen verwendet und C-Funktionen werden üblicherweise entlang der Linien von setWhatever() benannt und haben nicht für eine unterschiedliche Anzahl von Argumenten zu überlasten, so dass die allgemeine Art der Namensgebung war gehalten. Objective-C wurde von NeXT weitgehend erhalten (die von Apple später) und NeXT in ihre APIs zu Gunsten Ausführlichkeit gepflegt und vor allem zwischen den verschiedenen Arten von Verfahren zu unterscheiden - wenn du etwas tust, sondern nur eine Eigenschaft Zugriff auf NeXT ein Verb wollte um es klar zu stellen. So dass sie die Konvention in Cocoa, die die De-facto-Standard-Bibliothek für Objective-C sind in diesen Tagen.

Es ist Konvention Java hat eine Konvention von Getter und Setter C # hat Eigenschaften, Python hat die öffentlichen Bereiche und JavaScript-Frameworks sind in der Regel Feld () zu verwenden, zu erhalten und Feld (Wert) zu Satz

Abgesehen von unmissverständlicher Deutlichkeit, warum sollten wir stick zu:Auto.getSpeed() und Auto.setSpeed(55) wenn diese verwendet werden könnten, sowie :Auto.Geschwindigkeit() und Auto.Geschwindigkeit(55)

Da es in allen Sprachen, die ich erlebt habe, car.speed() und car.speed(55) sind die gleichen in Bezug auf die syntax.Nur Blick auf Sie, wie, dass, Sie beide könnten einen Wert zurück, der ist nicht wahr für die zweite, wenn es bedeutete, eine setter.

Was ist, wenn Sie beabsichtigen, den Setter zu nennen, aber in dem Argument setzen vergessen? Der Code ist gültig, so dass der Compiler nicht beschwert, und es nicht sofort Laufzeitfehler werfen; es ist ein stiller Fehler.

. () Bedeutet, es ist ein Verb. nein () bedeutet, dass es ein Substantiv.

   car.Speed = 50;
   x = car.Speed
   car.Speed.set(30)
   car.setProperty("Speed",30)

und

   car.Speed()

bedeutet Befehlsgeschwindigkeitsgrenze zu überschreiten.

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