Ich bin verwirrt über die Auswahl von Namen für meine Funktionen in Python . Manchmal sind in Python integrierte Funktionen unerlässlich, z. B.: print
Funktion und Zeichenfolgenmethode find
. Manchmal sind sie nicht so wie: Der len
Name ist nicht zwingend wie calculate_len
zum Beispiel und type
ist es auch nicht find_type
.
Ich kann verstehen, dass print
ein Wert zurückgegeben wird, den wir nicht verwenden (dh None
) und etwas tut (dh es wird eine Zeichenfolge auf dem Bildschirm angezeigt), daher ist sein Name unbedingt erforderlich.
Aber len
gibt einen Wert , dass wir verwenden und tut etwas (dh die Berechnung , wie viele Elemente gibt es in einer Sequenz oder einer Abbildung.) Und sein Name ist nicht zwingend notwendig . Andererseits gibt die find
Zeichenfolgenmethode (as len
) einen Wert zurück, den wir verwenden, und führt etwas aus. Der Name ist unbedingt erforderlich .
Was diese Frage gestellt hat, ist, dass ich ein Skript, das Zeichenfolgen mit Caesar-Chiffre verschlüsselt und entschlüsselt, überprüft habe. Der Rezensent sagte, dass:
Nur ein Bauchgefühl: Funktionen machen Sachen. Ein guter Name für eine Funktion ist daher ein Muss: Ich würde
rotate_letter
stattdessen verwendenrotated_letter
.
rotated_letter
Gibt eine Zeichenfolge mit einem Buchstaben zurück, die einen Buchstaben darstellt, der um eine Zahl gedreht wurde. Ich weiß nicht, was besser ist, ich habe es verwendet, rotated_letter
da es einen Wert zurückgibt, wie eine randint
Funktion im Zufallsmodul , ist es nicht generate_randint
.
Wie soll ich in diesem Fall eine Funktion benennen, die einen zu verwendenden Wert zurückgibt? Soll ich den Namen machen Imperativ oder einfach nur ein Substantiv . In anderen Fällen ist es offensichtlich, wie es geht, wie z. B. boolesche Funktionen , wie is_even
und is_palindrome
wir machen es einfach wie eine Ja / Nein-Frage , und auch Funktionen, die nur nicht verwendete Werte (dh None
) ausführen und zurückgeben , wie z. B. eine print
Listenmethode sort
.
quelle
len
wird beispielsweise besser als "Länge von" betrachtet - Sie erhalten eine Beschreibung des Arguments auf Metaebene.Antworten:
Verwenden Sie Verben, wo dies sinnvoll ist, Substantive, wenn sie kürzer und eindeutig sind
Meistens sollten Funktionen (imperative) Verben und Klassen sein, Variablen und Parameter sollten Substantive sein. Attribute sollten auch Substantive sein, einschließlich solcher, die mit erstellt wurden
@property
. Dies gilt insbesondere für Funktionen mit Nebenwirkungen. [1] Wenn eine Funktion etwas zurückgibt, sollten Sie bewerten, ob das Verb etwas hinzufügt oder nur "Rauschen" ist:make_list(foo)
vslist(foo)
.: Das Substantiv ist leichter zu lesen als das Verb. Auchlist
ist eigentlich eine Klasse, und Klassen sollten Substantive sein.open(foo)
vsfile(foo)
.: Das Verb ist leichter zu lesen als das Substantiv, und es ist sinnvoller, einem Verb "Optionen" zu geben als einem Substantiv. Daher wurde das Substantiv in Python 3 entfernt. Diesopen()
bleibt der einzige "Standard" [2] um Dateiobjekte in Python 3 zu erstellen.foo.get_bar()
vs.foo.bar()
vs.foo.bar
(nimm anfoo
undbar
sind beide Substantive): Die erste Option ist richtig, weil das "get" nichts hinzufügt, was wir noch nicht wussten. Die zweite ist dann angebracht , wenn ein immerbar
aus einerfoo
potenziell teure Operation und / oder trägt Nebenwirkungen (Sie auch interessieren könnten ,Bar(foo)
wennBar
eine Klasse). Der dritte ist angemessen, wenn dies ein billiger Vorgang ohne Nebenwirkungen ist und alternative Implementierungen ihn wahrscheinlich nicht teuer machen .xs.sort()
vs.sorted(xs)
wenn Siexs
eine Liste: Die erste ist zwingend notwendig: Sortieren Sie die Liste. Es ändert die Liste an Ort und Stelle und gibt nichts zurück. Die zweite ist deklarativ: Eine Liste, die sortiert ist und genau das zurückgibt. Beide sind Verben.[1]: Normalerweise schließen sich die Rückgabe eines Werts und Nebenwirkungen gegenseitig aus, es sei denn, Sie haben einen zwingenden Entwurfsgrund, diese zu kombinieren. Eine Funktion mit Nebenwirkungen sollte also wahrscheinlich nichts zurückgeben, und daher wäre es wenig sinnvoll, sie zu einem Substantiv zu machen.
[2]: Das
io
Modul enthält einige Operationen auf mäßig niedrigerer Ebene, mit denen Dateipufferung, automatische En- / Decodierung von Text usw. hinzugefügt oder entfernt werden können. Dies sind meistens Substantive, da es sich um objektorientierte Klassen handelt. Die meisten Benutzer müssen nicht direkt mit diesen Dingen spielen.open()
wählt stattdessen eine geeignete Klasse aus und instanziiert sie automatisch.quelle
foo.get_bar()
vs.` foo.bar ()` vs.foo.bar
" der Unterschied zwischen dem zweiten und dem dritten ?rotated_letter
Imperativ zu machen und ihn deklarativ zu halten, oder?letter
durch den Kontext impliziert wird.list
ist eine Klasserotated_letter
sieht nicht nach einer Methode aus. Es sieht aus wie eine Immobilie. Was bedeutet, dass die erste Idee ist:Erwarten
letter
, einen Wert vom Typ string zu enthalten, keine Funktion. Von dort aus haben Sie entweder einen anderen Namen gewählt, z.oder Sie verwenden stattdessen eine Eigenschaft:
len
undtype
werden so benannt, weil jeder andere Name lang zu tippen wäre. Sie werden häufig verwendet und haben einen besonderen Status der Python-Kernfunktionen, den jeder Python-Programmierer ohnehin erlernen wird, wodurch ihre Namen viel irrelevanter sind als die Namen von Bibliotheken von Drittanbietern.len
Dies ist insbesondere ein gutes Beispiel dafür, was Sie in Ihrem Code nicht tun sollten : Es wird erwartet, dass Sie vollständige Namen wielength
(es sei denn, die Kurzform ist sehr beliebt, wie z. B.max
) und ein Verb wie zcompute_length
. Oder es könnte eine Eigenschaft sein:len([1, 5, 6])
wird[1, 5, 6].length
. In C # wird beispielsweise die spätere Form verwendet :new [] { ... }.Length
.Beachten Sie, dass es auch historische Gründe geben kann für
len
: andere Sprachen, wie z. B. C #, bevorzugtCount
, was normalerweise eine Methode ist (obwohl das Verhalten durch .NET Framework leider inkonsistent ist).Count
ist ein Verb, so intuitiv, dass Sie dazu neigen, es als Methode aufzurufen.Werte zurückgeben oder eine Aktion ausführen
Von einer Funktion wird immer erwartet, dass sie eine Aktion ausführt. Wenn es kaum einen Wert zurückgibt, sollte es eine Eigenschaft sein. Sie haben einen Hinweis, dass die Funktion in eine Eigenschaft umgewandelt werden sollte, wenn:
Die Funktion enthält kaum eine
return ...
Anweisung,Der Name der Funktion, der Ihnen natürlich in den Sinn kommt
get_something
, lautet wie inproduct.get_price()
.Wenn Sie eine Funktion haben, kann dies einer von vier Typen sein:
Es kann rein sein, dh einen Wert zurückgeben, ohne die Umgebung zu beeinträchtigen. Beispiel :
road.measure_distance()
.Es kann die Umwelt beeinträchtigen, ohne etwas zurückzugeben. Beispiel :
product_database.remove_record(1234)
.Dies kann sich auf die Umgebung auswirken und einen Wert zurückgeben. Beispiel:
value.increment()
verwendet wievalue++
.Es kann nichts tun und nichts zurückgeben. Beispiel :
time.sleep(1)
.Es gibt nur wenige Fälle, in denen der Name einen starken Hinweis auf den Typ der Funktion geben könnte, aber in vielen Fällen können Sie den Typ kaum anhand seines Namens erkennen.
quelle
getSomething
undsetSomething
die üblichen Namen anstelle von Eigenschaften verwendet werden.