Marko Apfel - Afghanistan/Belgium/Germany

Management, Architecture, Programming, QA, Coach, GIS, EAI

  Home  |   Contact  |   Syndication    |   Login
  187 Posts | 2 Stories | 201 Comments | 4 Trackbacks

News



Twitter | LinkedIn | Xing

Archives

BizTalk

C#

Enterprise Library

SAP

SQL Server

Technologie

Motivation

Schon im Whitepaper „Auszeichnung von COM-Kategorien an .NET-Klassen mittels Attributen und deren Verwendung für Setup-Builds“ [1] habe ich deutlich gemacht warum das Verwenden von COM-Registrierungsfunktionen ein suboptimales Programmierpattern ist. Knackpunkt sind die Verstöße gegen SOC (separation of concerns) [2] und SRP (single responsibility principle) [3].

Für Prototyping oder kleine Demoprojekte möchte man vielleicht aber bewusst diese Verstöße in Kauf nehmen. Nichtsdestotrotz sollte der Programmcode aber auch dann so sauber wie möglich sein.

Das kleine aber feine Visual Studio Add-In VsCommands [4] hilft dabei.

VsCommands

Während eines Clean Code Developer Camp [5] haben mich Ralf Westphal und Stefan Lieser auf dieses Werkzeug aufmerksam gemacht. Mit ihm ist es effizient möglich partielle Klassen ähnlich des Verhaltens vom Visual-Studio Designer zu organisieren, d.h. unter der Hauptdatei werden weitere dazugehörige partielle Klassen aggregiert.

Damit liegt eine kleine Optimierung für ArcObjects-Programmierer auf der Hand:
Separieren der COM-Belange in eine partielle Klasse.

Umsetzung

Als Beispiel habe ich aus den ESRI ArcGIS Desktop .NET Samples die Klasse AddressInspector aus dem gleichnamigen C#-Projekt gewählt.

Nachdem die partiellen Klassen angelegt wurden, lassen sie sich mit dem Kommando Group Items von VsCommand aggregieren. (siehe Abb. 1 - Partielle Klassen gruppieren).

Abb. 1: Partielle Klassen gruppieren

Entstanden sind schlankere gruppierte (siehe Abb2. - Gruppierte partielle Klassen) Teilklassen welche es uns erlauben das Augenmerk auf das Wesentliche zu legen.

Abb. 2 Gruppierte partielle Klassen

Ausblick

Das Separieren der COM-Belange ist nur ein Einsatzzweck.

Weitere interessante sind das Zerlegen von Unittest-Fixtures in die einzelnen Test-Aspekte wie es Stefan Lieser unter [6] praktiziert oder das Strukturieren des Code nach Abstraktionsebenen [7] was der Erfüllung des SLA-Patterns (single level of abstraction) [8] hilfreich ist.

Tipps und Tricks

Leider habe ich noch kein Tool gefunden, welches ein Refactoring „Move to new partial class“ anbietet.

Aktuell ist der effizienteste Workflow wohl folgender:

  1. Anlegen einer neuen Klasse
    Als Namen wähle ich den Namen der zu erzeugenden Datei ergänzt um die Suffixe <Separierungs-Facette> und cs. Im Beispiel also AddressInspector.ComConcerns.cs.
    Visual Studio legt daraufhin zumindest schon mal die Datei unter dem richtigen Namen an.
  2. Nun ist noch ein wenig Handarbeit notwendig um die Klassendefinition anzupassen (gegebenenfalls die Zugriffsmodizierer setzen und Schlüsselwort partial angeben).
  3. ReSharper bietet nun das Refactoring „Move declaration(s) to another type part“ an (siehe Abb. 3 - ReSharper Refactoring)
    Man achte übrigens auf den Plural von declaration! - es lassen sich tatsächlich in einem Rutsch alle benötigten Elemente verschieben.

Abb. 3 : ReSharper Refactoring


Abgrenzung zu Regionen

Regionen (#region) mögen auf den ersten Blick eine feine Sache sein – aber unter uns: warum müssen im Code der IDE Darstellungshinweise gegeben werden? Zumindest die trivialen Gruppierungen nach Zugriffsmodifizierern (public, internal, privat, ..) und Schnittstellen-Elemente (Methoden, Properties, Fields, ..) sollte eine moderne IDE eigenständig aufbauen können.

Regionen konsequent aufzusetzen und aktuell zu halten kostet viel Zeit und etliche andere Editoren können mit ihrer Semantik nicht einmal umgehen. Darüber hinaus werden Regionen gerne verwendet um umfangreiche Klassen zu strukturieren – dann ist aber der Umfang und meist fehlende Fokus das eigentliche Wurzelproblem.

Sie werden daher in der Entwicklergemeinde zunehmend als Geschwätz und Code smell angesehen [9] – und diese Ansicht teile ich voll und ganz.

Links

[1] Whitepaper "Auszeichnung von COM-Kategorien an .NET-Klassen mittels Attributen und deren Verwendung für Setup-Builds"
http://support.esri.de/index_23060.HTML

[2] Separation of concerns
http://en.wikipedia.org/wiki/Separation_of_concerns

[3] Single responsibility principle
http://en.wikipedia.org/wiki/Single_responsibility_principle

[4] VsCommands
http://mokosh.co.uk/vscommands/

[5] Clean Code Developer (CCD)
http://clean-code-developer.de/

[6] Stefan Liesers Blog
http://www.lieser-online.de/blog/?p=235

[7] Ralf Westphals Blog: Partial Classes helfen dem Single Level of Abstraction Prinzip
http://ralfw.blogspot.com/2009/07/partial-classes-helfen-dem-single-level.html

[8] Single level of abstraction
http://clean-code-developer.de/wiki/CcdOrangerGrad#Onelevelofabstraction
http://www.markhneedham.com/blog/2009/06/12/coding-single-level-of-abstraction-principle/

[9] The Problem With Code Folding
http://www.codinghorror.com/blog/2008/07/the-problem-with-code-folding.html

posted on Monday, July 12, 2010 3:16 PM