Ich habe immer Probleme herauszufinden, ob ich eine bestimmte Methode benennen soll, die mit getSomething
versus beginnt findSomething
.
Das Problem besteht darin, Hilfsprogramme für schlecht gestaltete APIs zu erstellen . Dies tritt normalerweise auf, wenn Daten von einem Objekt abgerufen werden, für das das Objekt als Parameter erforderlich ist. Hier ist ein einfaches Beispiel:
public String getRevision(Item item) {
service.load(item, "revision");
// there is usually more work to do before getting the data..
try {
return item.get_revision();
}
catch(NotLoadedException exception) {
log.error("Property named 'property_name' was not loaded", exception);
}
return null;
}
Wie und warum sollte man entscheiden, ob diese Methode als getRevision()
oder benannt wird findRevision()
?
Antworten:
Ich benutze,
Get
wenn ich weiß, dass die Abrufzeit sehr kurz sein wird (wie bei einer Suche von einer Hash-Tabelle oder einem Btree).Find
impliziert einen Suchprozess oder einen Berechnungsalgorithmus , dessen Ausführung eine "längere" Zeitdauer erfordert (für einen beliebigen Wert von länger).quelle
find
einen Hash-Tabellen-Algorithmus verwenden würden?get
undfind
würde je nach Verwendungszweck zutreffen.Ich würde sagen, das
find
könnte scheitern,get
sollte aber nicht.quelle
find
NULL zurückgegebenget
werden kann, während NULL niemals zurückgegeben wird, aber möglicherweise ausgelöst (oder bestätigt) wird, stimme ich zu.find()
zurückkommtOptional<>
? In diesem Fallfind
ist auchnull
sicher.Um ein Gespräch zu zitieren, das ich oft mit meinen Kindern habe:
Die gleiche Idee gilt:
Verwenden Sie "get" für eine Methode, die eine billig verfügbare Information zurückgibt (und möglicherweise inline oder anderweitig optimiert werden kann), oder für eine Information, die nur diesem Objekt gehört.
Verwenden Sie "find" für eine Methode, mit der Informationen abgerufen werden können, oder verwenden Sie andere Objekte, um sie zu finden.
quelle
Suchen bedeutet, dass das Ergebnis nicht angezeigt wird, z. B. wenn eine Datenbankabfrage mit einigen Parametern ausgeführt wird, die sich zwischen den Aufrufen ändern können. Get hingegen impliziert, dass die Ergebnisse der Methode im Voraus bekannt sind oder sich nicht ändern, sobald bekannt ist, dass der Aufruf keine Parameter enthält.
Also würde ich zum Beispiel Customer findCustomerById (long customerId) und Customer getCustomer () verwenden.
quelle
Ich wende folgendes Muster an:
Foo GetFoo()
kann nicht null zurückgeben und die Komplexität ist O (log (n)) oder wenigerbool TryGetFoo(out Foo)
kann null zurückgeben und die Komplexität ist 0 (log (n)) oder wenigerFoo FindFoo()
kann nicht null zurückgeben und die Komplexität ist größer als O (log (n))bool TryFindFoo(out Foo)
kann null zurückgeben und die Komplexität ist größer als O (log (n))Auf diese Weise ist der Code ziemlich klar in Bezug auf die Absicht und die Komplexität, die Sie erwarten können.
In der Regel sind die Getter für den direkten Listen- oder Wörterbuch- / Satzzugriff vorgesehen.
Die Finder sind tiefe Suche, vollständiger Scan der Liste, etc ...
In deinem Fall:
quelle
try
, kurz und präziseget
ist auf jeden Fall angebracht - in der Tat wird oft angenommen, dass man das zuerst finden muss, um etwas zu bekommen. Wenn Sie sich nicht sicher sind, verwenden Sieget
.Ich würde
find
für Methoden wiefindMinimum()
oder verwendenfindOptimal()
, dh, wenn es einen speziellen Algorithmus gibt, der den Rückgabewert berechnet und nicht einfach eine Anforderung an die Datenbank, das Dateisystem, den Remote-Server usw. sendet, um einige Daten zu empfangen.quelle
find
als Präfix in den Beispielen verwenden, die Sie zur Verfügung gestellt haben. Für Rechenaufgaben, wie in Ihrem Beispiel, würde ichcalculate
oder verwendencompute
.Verwenden Sie keine find oder get Präfixe. Dies ist eine Verletzung des UniformAccessPrinciple von Bertrand Meyer. Warum nicht eine Methode wie die folgende erstellen:
quelle
Ich werde im Allgemeinen verwenden
Get
, um ein Objekt / einen WertFind
abzurufen und um dessen Position abzurufen (z. B. in einem Array).zum Beispiel:
quelle
Für mich
find
bedeutet dies, dass möglicherweise mehr als ein Ergebnis vorliegt.get
impliziert nur eine.quelle
getCat
vsfindCat
vsgetCats
vsfindCats
. Dasfind..
Symbol repräsentiert immer noch einzelne Objekte, die zurückgegeben werden. Meiner Meinung nach sollte der Plural zum Substantiv hinzugefügt werden.