Hi,
ich arbeite mal wieder an nem Projekt bei dem mir aufgefallen ist, dass ein relativ nützlicher Tipp hier meines Wissens nach noch nie gefallen ist: Method Chaining.
An dieser Stelle würde ich gerne mal Wikipedia zitieren:
Heißt: Alle Operationen einer Klasse können aneinandergehängt (-> "gechained") werden.
Nehmen wir als Beispiel eine Klasse
1. Normale Klasse "User"
Sieht gut aus. Eine Instanz dieser Funktion kann erzeugt werden und nachdem die entsprechenden Eigenschaften gesetzt sind können Informationen angezeigt werden.
Trotzdem ist es doch ziemlich wenig Information auf ziemlich vielen Zeilen, die alle mit
2. Chainable Klasse "User"
Die Funktionen sind nun chainable, was im Endcode eine starke Vereinfachung zur Folge hat:
Es gibt ebenfalls die Möglichkeit, die normale Userklasse als internen Datenspeicher für die Chainables zu verwenden, was den Code für die Chainable-Klasse nochmal vereinfachen würde. Bei diesem kleinen Beispiel wirkt das Prinzip erstmal nicht sehr gut, es kann bei größeren Projekten aber extrem nützlich werden.
Wers auf die Spitze treiben will, muss nicht mal eine Variable für die Instanz erstellen, sondern kann direkt mit
3. Instanzierung als Teil der Chain
@'SplittyDev' hat noch nen schönen Beitrag zu dem Thema. Hat man eine Klasse mit der man arbeitet ist es möglicherweise schöner, die Instanzierung als Teil der Chain vorzunehmen. Für diesen Fall hat er ne schöne Klasse namens IGrabbable bereitgestellt:
Lässt man andere Klassen davon erben, kann man
Das scheint im ersten Moment unnötig, macht bei längeren Chains aber Sinn.
Beispielprojekt befindet sich im Anhang.
Habe dort auch gerade noch eine dritte Klasse reingehauen, bei der mit einer normalen Userklasse als Speicher für die Daten gearbeitet wird und mit der
man auch Werte abrufen kann.
Grüße
ich arbeite mal wieder an nem Projekt bei dem mir aufgefallen ist, dass ein relativ nützlicher Tipp hier meines Wissens nach noch nie gefallen ist: Method Chaining.
An dieser Stelle würde ich gerne mal Wikipedia zitieren:
Fluent Interfaces [...] sind ein Konzept für Programmierschnittstellen in der Software-Entwicklung, bei dessen Befolgung man beinahe in Form von Sätzen natürlicher Sprache programmieren kann.
Heißt: Alle Operationen einer Klasse können aneinandergehängt (-> "gechained") werden.
Nehmen wir als Beispiel eine Klasse
User
. Ein User hat Name, Wohnort und Alter. Dazu implementiere ich hier noch eine Funktion, die alles kombiniert.1. Normale Klasse "User"
C#-Quellcode
Sieht gut aus. Eine Instanz dieser Funktion kann erzeugt werden und nachdem die entsprechenden Eigenschaften gesetzt sind können Informationen angezeigt werden.
Trotzdem ist es doch ziemlich wenig Information auf ziemlich vielen Zeilen, die alle mit
User.
beginnen. Und hier kommen wir wieder zum Wikipedia-Artikel, der Method Chaining als "Programmieren in Sätzen" beschreibt. Was wäre, wenn man einfach direkt mit dem Objekt weiterarbeiten könnte, nachdem man die Property gesetzt hat? Keine schlechte Idee. Aber mit Propertys ist das so leider nicht machbar. Also implementieren wir unsere Propertys als Funktionen mit Rückgabetyp der eigenen Klasse und geben dann this
zurück.2. Chainable Klasse "User"
C#-Quellcode
- public class ChainUser
- {
- private string _name;
- public ChainUser Name(string name)
- {
- this._name = name;
- return this;
- }
- private string _residence;
- public ChainUser Residence(string residence)
- {
- this._residence = residence;
- return this;
- }
- private int _age;
- public ChainUser Age(int age)
- {
- this._age = age;
- return this;
- }
- public ChainUser GetInformation()
- {
- Console.WriteLine(String.Format("{0} is {1} years old and currently living in {2}.", this._name, this._age.ToString(), this._residence));
- return this;
- }
- }
Die Funktionen sind nun chainable, was im Endcode eine starke Vereinfachung zur Folge hat:
Es gibt ebenfalls die Möglichkeit, die normale Userklasse als internen Datenspeicher für die Chainables zu verwenden, was den Code für die Chainable-Klasse nochmal vereinfachen würde. Bei diesem kleinen Beispiel wirkt das Prinzip erstmal nicht sehr gut, es kann bei größeren Projekten aber extrem nützlich werden.
Wers auf die Spitze treiben will, muss nicht mal eine Variable für die Instanz erstellen, sondern kann direkt mit
new ClassName().Chain1().Chain2()
beginnen.3. Instanzierung als Teil der Chain
@'SplittyDev' hat noch nen schönen Beitrag zu dem Thema. Hat man eine Klasse mit der man arbeitet ist es möglicherweise schöner, die Instanzierung als Teil der Chain vorzunehmen. Für diesen Fall hat er ne schöne Klasse namens IGrabbable bereitgestellt:
Lässt man andere Klassen davon erben, kann man
.GrabNew()
an den Anfang setzen und erhält damit eine Chain, die so aufgebaut ist:Das scheint im ersten Moment unnötig, macht bei längeren Chains aber Sinn.
Beispielprojekt befindet sich im Anhang.
Habe dort auch gerade noch eine dritte Klasse reingehauen, bei der mit einer normalen Userklasse als Speicher für die Daten gearbeitet wird und mit der
man auch Werte abrufen kann.
Grüße
"Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero
Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Nikx“ ()