Entwicklertagebuch: MyLife.NET #2 – Der Kern des Ganzen
Nachdem wir im ersten Artikel dieser Serie das wieso, weshalb und warum geklärt haben beschäftigt sich der zweite Teil mit buchstäblich dem Kern des Ganzen: Mit dem Teilprojekt MyLife.Core, welches alle benötigten und geteilten Models, Funktionen und Services enthält.
Für alle, denen diese Artikelreihe noch unbekannt ist – das habt ihr bislang verpasst, könnt euch aber natürlich nachträglich einlesen:
- Entwicklertagebuch MyLife #1: Wieso, weshalb, warum
- (Aktuell) Entwicklertagebuch MyLife #2: Der Kern des Ganzen
Seien wir realistisch: Es ist kein Hexenwerk
Als Nerd, Software-Engineer und Maker tendiert man dazu, Dinge erst einmal größer und komplexer zu planen, als man es anfangs oder gar zu Ende überhaupt benötigt. Ich bin hier mit Sicherheit keine Ausnahme. Aus diesem Grund dauerte es etwas zu erkennen, dass das, was ich vorhabe, mit MyLife.NET (GitHub), nahezu mit einfachsten Bordmitteln von .NET und Visual Studio umsetzbar ist.
Für mich ist es bei diesem Projekt wichtig, einen Start zu haben, der übersichtlich ist und schnell Ergebnisse liefert, da für uns alle Freizeit zu einem kostbaren Gut wurde. Aus diesem Grund werden nicht nur bei MyLife.Core, sondern generell in der Solution bewährte Bibliotheken eingesetzt – ganz anders als mein sonstiges Mindset, alles selbst zu schreiben, um möglichst viel zu lernen. Dieses Mal will ich es wirklich durchziehen, meinen Fokus auf das Ergebnis und nicht so stark auf die Reise zu setzen – mal sehen, ob dies gelingt.
Klassische Models mit JSON-Annotationen
Da MyLife mein erstes ernstgemeintes Projekt im .NET-Ökosystem seit langem ist, setze ich vorerst auf bewährte Techniken. So basiert die Datenstruktur der Domain-Transfer-Objects (DTO), also der Objekte, die schlussendlich die Datenstruktur beinhalten, auf C#-Klassen mit Annotationen aus der allseits bekannten und verwendeten NewtonSoft.Json-Bibliothek.
Vorerst findet keinerlei Validierung auf dieser Ebene statt. Für einen einfachen Start ist die JsonProperty-Annotation die einzige sich auf das resultierende JSON-File auswirkende Verwendung der Bibliothek. In Zukunft können, aber müssen nicht, mehr Funktionen aus dieser Abhängigkeit Verwendung finden – so oder so ist es schön zu wissen, dass es, wenn man es bräuchte, erprobt und stabil als Feature vorhanden ist. Ein Hoch auf das erwachsene .NET-Ökosystem, wo es in meinen Augen doch mehr Stabilität in der Welt der Abhängigkeiten gibt als in anderen Sprachen und Systemen.
Alternative: record structs
Im modernen C# gibt es das Feature der “Record Classes” (Microsoft Learn) beziehungsweise Record Structs, welche ganz ähnlich zu Kotlin data classes aufgesetzt werden und eine Menge an etwaigen Boilerplate-Code aus althergebrachten Klassen-basierender Schreibweisen stark reduziert.
Zum Zeitpunkt, als ich mit MyLife.Core anfing, fehlte mir das tiefere Verständnis dieser Sprachfunktionalitäten, und mit Hinblick auf bearbeitbare Models in Zukunft ließ ich vorerst die Verwendung von Records fallen.
Beispielsdaten sind Gold
Mit den SampleGenerator.cs schlage ich etliche Fliegen mit einer Klappe. Einerseits beschreibt es _mein_ Leben, so muss ich die Struktur nicht doppelt aufbauen, andererseits kann ich hierherauf aufbauend Funktionalitäten als auch ganze kommende Subprojekte wie Blazor und Co von Anfang an mit Daten befüllen und vorzeigen – als auch, wie der Name es sagt, als Mock-Daten während der Erstellung von Oberflächen einsetzen.
Kluge Menschen würden solche festen Datensätze auch zur Validierung von erstellten Testabläufen einsetzen. Dennoch versuche ich MyLife.NET so zu bauen, dass man mit einfachster Änderung von Parametern das eigene Leben von anderen Menschen hineinfließen lassen kann.
Die Konsole als Lebensgenerator
Im gleichen Kontext wie die Models basiert auch der Generator, welcher auf den Models des Chores aufsetzt, auf einer simplen Konsolen-Anwendung mit verstreuten Console.Write und Console.Read aufrufen.
Natürlich könnte man hier auch eine Oberfläche bauen, oder gar alles im Web machen – aber für was? Für eine simple Umwandlung des Datensatzes in eine JSON-Datei auf der Platte des Rechners muss man nicht einmal um die Welt reisen, um dann doch beim Rewe nebenan einzukaufen.
Wieso nicht in MyLife.Core?
Diese Oberfläche zum Export des Lebens ist nicht plattformunabhängig, außerdem ist die Erstellung einer JSON-Struktur als Datei kein Usecase, was allgewärtig gebraucht wird.
Für mich als Anfänger bzw. für einen, der gerne offenen Quelltext herunterlädt und starten möchte, ist es immer gut, dass es ein Hauptprojekt gibt – also ohne Suffix im Namen -, welches ich immer starten kann und mir eine gewisse Funktionalität der Anwendung aufzeigt. Aus diesem Grund liegt die Konsolenanwendung auch nicht in einem MyLife.Exporter, sondern wie erwähnt auf oberste ebene im MyLife-Projekt.
Wie geht es weiter?
Nachdem wir jetzt eine JSON-Datei dank MyLife.Core erzeugen und dank dem Exporter auch speichern können, wird der nächste Schritt in Richtung Blazor Web Assembly gehen, um die Daten auch für uns Menschen besser erfassbar darzustellen. Da ich mich mit Blazor als auch der ganzen Geschichte rund um Webentwicklung null auskenne, wird es wohl keine perfekte Lösung werden, dies greift den ersten Abschnitt jedoch wieder auf. Es muss nicht perfekt sein, für den Start will ich euch zeigen, dass es überhaupt geht und über die kommenden Wochenenden stetig verbessern.
Falls ihr euch beteiligen wollt, weil ihr mir zeigen wollt, wie etwas richtig oder einfacher geht oder ihr euch zum ersten Mal an einer noch übersichtlichen .NET-Solution beteiligen wollt, seid ihr herzlich eingeladen auf GitHub vorbeizusehen, das Repository zu forken, Issues mit Problemen oder Hinweisen zu eröffnen oder einfach zu stöbern.
Thema:
- Entwicklung
Über den Autor
Tobias Scholze
Bayrischer Open Source- und Community-Enthusiast, Verfechter des neuen Microsoft und Wandler zwischen den Betriebssystemwelten. #communityrocks Von Herzen ein Nerd mit der festen Überzeugung, dass man gemeinsam und durch den Einsatz von moderner IT die Welt für jeden ein Stückchen besser machen kann.