Angenommen, ich habe eine Klasse Event
wie folgt:
class Event {
private var attendees: [Person] = []
// Case 1
//*******
// Should I use a func…
func countOfAttendees() -> Int {
return attendees.count
}
// …or a var
var countOfAttendees: Int {
return attendees.count
}
// Case 2
//*******
// Should I use a func…
func countOfPaidAttendees() -> Int {
return attendees.filter({$0.hasPaid}).count
}
// …or a var
var countOfPaidAttendees: Int {
return attendees.filter({$0.hasPaid}).count
}
}
Ist es empfehlenswert, Funktionen oder berechnete Eigenschaften in den beiden oben angegebenen Fällen zu verwenden?
functions
swift-language
Ashley Mills
quelle
quelle
Antworten:
Befolgen Sie das Prinzip des einheitlichen Zugangs ,
Für mich bedeutet dies, dass ich keine Funktionen schreibe, die keine Argumente annehmen und einen Wert zurückgeben. Ich verwende immer berechnete Eigenschaften. Auf diese Weise kann ich, wenn ich mich später entscheide, die berechnete Eigenschaft in eine gespeicherte Eigenschaft umzuwandeln, ohne die Notwendigkeit haben zu müssen, die Parens überall in meiner App zu entfernen, und ohne eine separate "Getter" -Methode, die nur den Wert einer gespeicherten zurückgibt Eigentum, das meiner Meinung nach ziemlich verschwenderisch scheint.
Und wenn ich eine gespeicherte Eigenschaft in eine berechnete ändere, muss ich keine Parens am Ende hinzufügen, und zwar überall dort, wo sie in der App verwendet wird.
quelle
Ich würde sagen, das hängt von der Komplexität der Berechnung und der Nutzungshäufigkeit ab.
O(1)
/ handelt*
, verwenden Sie die berechnete Eigenschaft.O(N)+
/ istrare-use
, dann benutze function.O(N)+
/ istfrequent-use
, überlegen Sie, ob Sie sich in Zukunft für die Verwendung von Caching oder anderen "intelligenten" Techniken entscheiden könnten, um die Komplexität zu kompensieren. Wenn "Ja", dann verwenden Sie Eigenschaft. Wenn "Nein-Nein-Nein, es ist nur schwer", dann verwenden Sie Funktion .quelle
Ich habe kürzlich angefangen, Kotlin zu lernen und sie haben eine großartige Heuristik darüber, wann sie berechnete Eigenschaften verwenden sollen:
- https://kotlinlang.org/docs/reference/coding-conventions.html
quelle
In Swift haben Funktionen ohne Parameter und berechnete Eigenschaften fast die gleichen Funktionen (es kann einen Unterschied geben, dass eine Funktion ohne Parameter auch ein Abschluss ist, eine berechnete Eigenschaft jedoch nicht).
Der Unterschied ist semantisch. Wenn Ihr Code eine Aktion ausführt und beispielsweise eine Beschreibung des Ergebnisses dieser Aktion zurückgibt, würde ich eine Funktion verwenden. Wenn Ihr Code eine Eigenschaft berechnet, dies jedoch aus Sicht des Benutzers eine gespeicherte Eigenschaft sein könnte oder möglicherweise eine gespeicherte Eigenschaft, bei der zuerst ein zwischengespeicherter Wert aktualisiert werden muss, würde ich eine berechnete Eigenschaft verwenden.
Ein großer Unterschied: Was passiert, wenn Sie die Funktion oder die berechnete Eigenschaft zweimal aufrufen? Für eine berechnete Eigenschaft erwarte ich, dass x = Eigenschaft; y = Eigenschaft hat genau das gleiche Verhalten wie x = Eigenschaft; y = x, außer es läuft ein bisschen langsamer. Bei Funktionen wäre ich nicht überrascht, wenn das Verhalten anders wäre.
quelle
Verwenden Sie
countOfAttendees
undcountOfPaidAttendees()
.Eine berechnete Variable gibt bei jedem Zugriff einen berechneten Wert zurück. Das heißt, es wird kein Wert gespeichert. Intern wird es als Funktion implementiert.
Was ist der Unterschied zu einer Funktion?
Sie sollten eine Variable verwenden, wenn
Irrelevante Gründe, eine Variable einer Funktion vorzuziehen
Ressourcen
Ab WWDC 2014 - 204 Was ist neu in Cocoa ?> 24:40 Wann wird eine @ -Eigenschaft verwendet?
Aus Swift Style von Erica Sadun > Berechnete Eigenschaften vs. Methoden
Aus Kotlin-Kodierungskonventionen> Funktionen vs. Eigenschaften . Siehe Daniels Antwort oben .
Andere Ressourcen ohne relevante Informationen:
quelle
Ich würde eine verwenden
func
. Objektorientierte Programmierung funktioniert einwandfrei ohne berechnete Eigenschaften. Da Sie einen Wert zurückerhalten, der berechnet / gefiltert wurde, argumentieren einige möglicherweise, dass sich eine berechnete Eigenschaft richtig anfühlt. Aber hier ist meine Beschwerde, wenn Sie das tun, dann wird die Lesbarkeit beeinträchtigt, weil sie sich wie ein Wert anfühlt.In diesem Zusammenhang wäre es nicht sinnvoll, den berechneten Wert zuzuweisen (und zum Glück hilft uns die IDE dabei, dies zu vermeiden). Was passiert jedoch, wenn ich versuche, etwas zuzuweisen, das berechnet wurde, aber wie ein Wert aussieht?
Während der Verwendung von func weiß der Anrufer, dass Sie sich nicht direkt mit einem Wert befassen:
Ich denke, wenn es sich um ein Verhaltensobjekt handelt, sollte es so aussehen, als würde es sich verhalten, anstatt wie eine Datenstruktur auszusehen. Wenn Ihr Objekt dumm ist und kein Verhalten aufweist, warum sollten Sie dann versuchen, es einzukapseln? In diesem Fall können die Teilnehmer auch öffentlich sein
quelle