Multitasking mit Visual Studio 2013 MyWork

In Visual Studio / TFS hat sich die letzten Versionen kontinuierlich die Integration von WorkItems und Code verbessert. Eines der neuen Features ist z.B. MyWork. Dieses automatisiert das Update von Workitems und erlaub das parallelisieren von Arbeitsaufgaben. Um das Feature zu zeigen muss man sich erst mal WorkItems zuordnen. Dies geschieht am einfachsten über das Taskboard indem man direkt die Kachel editiert oder mit Personenfilter die Aufgaben zu der Person zieht.   Wem der Umgang mit dem neuen Taskboard noch fremd ist, dem empfehle ich den Artikel Work in sprints. Hier werden kurz und knapp die wichtigsten Funktionen dargestellt. Wichtig … Continue reading Multitasking mit Visual Studio 2013 MyWork

Dependency Inversion Principle (DIP) und Dependency Injection (DI) in c# / .net

Das Dependency Inversion Principle (DIP) und Dependency Injection (DI) sind die wichtigsten Grundlagen für einen modularen, test- und erweiterbaren Aufbau einer Software. Sie bilden damit einen fundamentalen Baustein der agilen Softwareentwicklung. Ich weiß: es gibt bereits tausende von Büchern und Artikel über dieses Thema. Trotzdem sehe ich immer wieder, dass es nicht wirklich verstanden und in der Praxis – besonders in kleinen und mittleren Projekte – komplett ignoriert wird. Deshalb möchte ich noch einmal einen einfachen Einstieg in das Thema für .net-Entwickler starten. Das DIP besagt: A. HIGH LEVEL MODULES SHOULD NOT DEPEND UPON LOW LEVEL MODULES. BOTH SHOULD DEPEND … Continue reading Dependency Inversion Principle (DIP) und Dependency Injection (DI) in c# / .net

Codegenerierung aus Modeling Projects – Part 3

In Part 1 und Part 2 der Serie habe ich schon die Generierung von Code aus Visual Studio Modeling Projects und die Anpassung der T4-Templates beschrieben. In diesem Teil geht es um die Erstellung eines eigenen “Profiles” mit neuen Stereotypen. Ein eigenes Profile muss als Visual Studio Extension (.vsix) erstellt werden. Dazu ist das Visual Studio SDK nötig. Ist dieses installiert, dann kann über den Dialog “Neues Projekt” eine neues “Visual Studio Package” erstellt werden. Die Angaben in Wizzard sind eigentlich selbsterklärend. Da das Paket nur als Container benötigt wird, können fast alle Optionen deaktiviert werde. Dem Projekt muss man … Continue reading Codegenerierung aus Modeling Projects – Part 3

Codegenerierung aus Modeling Projects – Part 2

In Part 1 der Serie habe die Grundlagen der Generierung von Code in Class-Diagrammen in Modeling Projects beschrieben. In diesem Teil geht es um die Verwendung von unterschiedlichen T4-Templates und deren Anpassung. Die Auswahl der T4-Templates erfolgt über die Eigenschaft “Text Template Bindings”. Hier werden bei der ersten Generierung Standardtemplates für Class, Enum, Interface und Struct hinterlegt. Die Templates haben folgende Eigenschaften: Titel Beschreibung Name Name des Templates Overwrite Gibt an ob die Zieldateien überschrieben werden. ProjectPath Name des VS-Zielprojektes. Ist das Projekt nicht vorhanden, dann wird es erstellt. Hier sollte man immer das Projekt ändern, da der Standard <name_model_project>Lib.csproj … Continue reading Codegenerierung aus Modeling Projects – Part 2

Codegenerierung aus Modeling Projects – Part 1

Visual Studio unterstützt die Generierung von Code aus einem Modeling Project heraus. Dabei kommen t4 Templates zum Einsatz. Diese können auch erweitert und angepasst werden. Hier eine kleine Anleitung, wie man sinnvoll Code aus einem Model generieren kann. In Teil 1 ist die Standardfunktionalität beschrieben. In Teil 2 werde ich die Anpassung von den T4-Templates beschreiben. In Teil 3 werde ich schließlich ein eigenes Profil mit eigenen Stereotypen erstellen und die Codegenerierung “customizen”. Beginnen Sie zunächst mit einem Package. Dem Package können folgende Eigenschaften zugewiesen werden: Der Name des Paketes entspricht dem C#-Namensraum und optional einem Ordner im Zielprojekt. Über … Continue reading Codegenerierung aus Modeling Projects – Part 1

Fluent Assertions

Was mir bei NUnit besser gefällt als bei MSTest ist die Aussagekraft von den Assertions. “Assert.That(something, Is.EqualTo(anotherthing);” finde ich viel aussagekräftiger als “Assert.AreEqual(anotherthing, something). Besonders die generischen Variante “Assert.AreEqual<string>(expectedstring, actualstring)” finde ich auf den ersten Blick nicht leicht verständlich. Deshalb kam ich auf die Idee eine eigene Lösung mit einem Fluent-Interface für MSTest zu entwickeln. Allerdings hat eine kurze Suche bei Google ergeben, das es hier schon etliches auf dem Markt gibt. Näher angesehen habe ich mir bisher Fluent Assertions. Die Lösung steht auf GitHub zur Verfügung – kann aber bequem über NuGet installiert werden. Die Lösung funktioniert sowohl mit … Continue reading Fluent Assertions

Error Handling Part 4: Fehlerbehandlung auf Anwendungsebene

Dies ist der vierte Teil der Serie zum Exception Handling: Grundlagen der Fehlerbehandlung Eigene Ausnahamen werfen Guidelines nach David Abrahams Fehlerbehandlung auf Anwendungsebene In diesem Teil der Serie wollen wir das Error Handling einer Anwendung aus architektonischer Sicht betrachten. Der wichtigste Aspekt dabei ist sicherlich das Thema Sicherheit. Sicherheit Wenn ein Fehler im Betrieb auftritt, dann ist es nötig so viele Informationen wie möglich über diesen Fehler zu haben. Dies betrifft besonders den StackTrace. Dieser sollte bei der Fehlerbehandlung ja immer erhalten bleiben. Jetzt sind der StackTrace und andere ausführliche Informationen zu Fehlern natürlich auch eine Menge Informationen, die von … Continue reading Error Handling Part 4: Fehlerbehandlung auf Anwendungsebene

Argument Validation

Es ist gute Praxis alle Argumente zu validieren, bevor sie verwendet werden. Würde in diesem Beispiel das Argument nicht geprüft, dann würde eine DivideByZeroException geworfen werden (was zugegebenermaßen in diesem Beispiel auch nicht ganz sinn frei wäre – aber ich denke der Gedanke dahinter ist klar). Besonders bei Referenztypen ist es kritisch, da diese NULL sein können. Wird die Validierung vergessen, dann wird eine NullReferenceException geworfen. Deshalb gibt es in der Codeanalyse auch die Regel CA1062: Validate arguments of public methods. Würde eine Methode so aussehen: Würde man eine NullReferenceException bekommen, wenn das Objekt NULL wäre. Außerdem muss man aufpassen, … Continue reading Argument Validation

Error Handling Part 3: Guidelines nach David Abrahams

Dies ist der dritte Teil der Serie zum Thema Exception Handling: Grundlagen der Fehlerbehandlung Eigene Ausnahamen werfen Guidelines nach David Abrahams Fehlerbehandlung auf Anwendungsebene David Abrahams hat 3 Guidelines definiert, an die sich Entwickler von Klassenbibliotheken halten sollen: Die no-throw guarantee Die basic guarantee Die strong guarantee Es geht dabei um 3 Arten von Verträgen, die man als Autor einer Klasse den Konsumenten verspricht. No-Throw Guarantee Bei der “no-throw guarantee” muss sichergestellt werden, dass keine Exception die Kasse/Funktion verlässt. Dies bedeutet natürlich, dass beim Auftreten eines Fehlers in einer untergeordneten Komponente folgendes sichergestellt werden muss: Keine Exception verlässt die Funktion: … Continue reading Error Handling Part 3: Guidelines nach David Abrahams

Error Handling Part 1: Grundlagen bei der Fehlerbehandlung

In letzter Zeit wurde ich immer wieder gebeten etwas über Fehlerbehandlung zu schreiben. Da das Thema komplex und sehr umfangreich ist habe ich mich immer wieder darum gedrückt. Man sieht aber in der Praxis leider doch, dass es immer wieder Probleme damit gibt. Deshalb habe ich mich jetzt endlich aufgerafft das Thema anzugehen. Da das Thema zu Komplex für einen einzelnen Beitrag ist, werde ich das Ganze als Serie aufbauen: Grundlagen der Fehlerbehandlung Eigene Ausnahamen werfen Guidelines nach David Abrahams Fehlerbehandlung auf Anwendungsebene Beim Verwenden einer Try-Catch-Anweisung kann man wirklich viel falsch machen. Viel mehr als einem meistens bewusst ist. … Continue reading Error Handling Part 1: Grundlagen bei der Fehlerbehandlung