Logik in einem Teil der Immobilie. Gute Praxis?
Beim databinding meiner xaml-Code, um einige Daten, die ich oft benutzen Sie die "get" - Teil einer Eigenschaft zu tun, eine gewisse Logik. Wie geben Sie die Summe der Summen von einer Liste oder überprüfen, ob etwas positiv ist.
Beispiel:
public List<SomeClass> ListOfSomeClass{get;set;}
public double SumOfSomeClass
{
get
{
return ListOfSomeClass.Sum(s => s.Totals);
}
}
public bool SumPositive
{
get
{
if(SumOfSomeClass >= 0)
return true;
else
return false;
}
}
Diese Weise kann ich binden SumPositive und SumOfSomeClass. Dies ist als gute Praxis zu empfehlen? Auch wenn es mal komplexer als dieses? Oder wäre es besser, eine Methode aufrufen und die Rückgabe ist das Ergebnis? Was über Anrufe an eine andere Klasse oder auch eine Datenbank?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigenschaft Getter erwartet schnell und idempotent (d.h. es werden keine destruktiven Aktionen sollen aufgeführt werden). Obwohl es völlig in Ordnung, Durchlaufen Sie eine in-memory-Sammlung von Objekten, die würde ich nicht empfehlen tun, jede Art von schwerem heben entweder bekommen oder set Teile. Und apropos Durchlaufen, würde ich noch cache das Ergebnis zu speichern ein paar Millisekunden.
Ja, es sei denn, es ist eine operation, die möglicherweise Auswirkungen auf die Leistung. In diesem Fall sollten Sie eine Methode verwenden, anstatt (wie es intuitiver ist, um den end-Benutzer, die eine Methode mag langsam sein, in der Erwägung, dass eine Immobilie schnell)
Ich sagen ja, aber versuchen, zu speichern auf eine private variable de Ergebnisse ListOfSomeClass.Summe(s => en.Summen). Speziell, wenn Sie es verwenden, mehr als einmal.
Sehe ich keine direkte Frage (es sei denn, die Liste ist ziemlich umfangreich), aber ich würde persönlich benutze die
myInstance.SomeList.Sum()
Methode, wenn möglich (.net >= 2.0).Für grundlegende Berechnungen aus der Felder oder andere Eigenschaften, die in der Sammlung wäre es akzeptabel, das zu tun, innerhalb der Get-Eigenschaft. Wie alle anderen sagte true Logik sollte nie getan werden in der getter.
Bitte ändern, dass getter dieser:
Sind Sie bereits mit einem booleschen Ausdruck, keine Notwendigkeit, explizit true oder false zurück
Mit komplexer Logik in Getter/setter ist nicht eine gute Praxis. Ich empfehle, sich zu bewegen, komplexe Logik, um verschiedene Methoden (wie GetSumOfXYZ()) und verwenden Sie memoization in Eigenschaftenaccessoren.
Können Sie vermeiden, komplexe Eigenschaften, die durch die Nutzung ObjectDataProvider - es ermöglicht Ihnen zu definieren, die Methode zu ziehen einige Daten.
Ich mag deine Namenskonventionen und ich Stimme vollkommen mit Inhalten wie dein Beispiel in der Eigenschaft Getter, wenn Sie die Bereitstellung einer API verwendet werden, mit Bindung.
Ich bin nicht einverstanden mit dem Punkt, den andere gemacht haben, über das verschieben von code in eine Methode, nur weil es rechnerisch schwer - das ist keine Unterscheidung, die ich je machen noch habe ich gehört, anderen Menschen zu suggerieren, dass es eine Methode bietet, die langsamer als eine Eigenschaft.
Ich glaube, dass die Eigenschaften-Seite-Effekt-freie auf das Objekt, auf dem Sie aufgerufen werden. Es ist erheblich schwieriger zu garantieren, haben Sie keine Auswirkungen auf die breitere Umgebung - sogar eine relativ triviale Eigenschaft ziehen Sie Daten in den Speicher oder zumindest ändern Sie den Prozessor-cache oder vm Staat.
Hängt... wenn dies auf einer domain Wesen ist, dann wäre ich nicht in der Bevorzugung mit komplexer Logik in getter-und vor allem nicht mit einem setter. Mit einer Methode, die (für mich) Signale für einen Verbraucher, der die Entität, der eine operation durchgeführt wird, während ein getter-Signale eine einfache Entnahme.
Nun, wenn diese Logik in eine ViewModel -, dann denke ich, dass der getter-Aspekt ein wenig mehr verzeihbar /erwartet.
Ich denke, dass es eine Ebene der Logik, dass erwartet wird, Getter und Setter, da Sie gerade eine Art von gewundenen Weg zu erklären, Ihre Mitglieder öffentlich.
Wäre ich vorsichtig darum, die Logik in der Getter einer property. Je teurer es ist, desto gefährlicher ist es. Andere Entwickler erwarten eine get-Methode einen Wert zurückgeben, sofort gerade, wie sich ein Wert aus einer member-Variablen. Ich habe gesehen, eine Menge von Fällen, in denen ein Entwickler mit einer Eigenschaft für jede iteration einer Schleife, denken Sie einfach nur wieder einen Wert, während die Eigenschaft ist eigentlich eine Menge Arbeit. Dies kann eine größere Verlangsamung Ihres Codes.