(vor)lesbarer Quelltext

Gedanken zur "Empathic Code" Idee von Johannes Hofmeister

Freitag 14 Juni 2013 at 9:00 pm. Stichwörter: , ,

Johannes Hofmeister hat in der dot Net pro (Ausgabe 4/2012) einen Artikel veröffentlicht, in dem er auf die Relevanz guter Bezeichner hinweist. Ende Mai 2013 hat er das Thema auch auf dem Treffen der .net User Group Rhein/Ruhr in Ratingen vorgestellt.

Besonders beschäftigt hat mich die Aussage zu den lesbaren, bzw. vorlesbaren Bezeichnern am Beispiel der Interfaces. Dieses Beispiel hat mich beeindruckt, weil er das große "I" vor dem Interfacebezeichner mit in den "sprechenden Namen" einbezieht. Ein schönes Beispiel ist das Interface "IObserver", welches normalerweise jene Klassen implementieren, die andere Objekte beobachten. Die beobachteten Klassen implementieren dann häufig das Interface "IObservable".

Der Vorschlag von Johannes ist nun, diese Interface Bezeichner "lesbarer" zu machen. Aus "IObserver" macht er "Iobserve", was man als "I observe" (ich beobachte) lesen kann. Und aus "IObservable" könnte man "Inotify" machen. Das würde als "I notify" gelesen (Ich benachrichtige). Kombiniert man dies mit generischen Klassen, kann folgender Quelltext dabei heraus kommen:

public class Trainer : Iobserve<Player>{}

public class Player : Inotify<Trainer>{}

Dadurch erhöht sich die Lesbarkeit wirklich.

Allerdings wollten mir zu einigen Interfaces keine passenen "I<verb>" Kombinationen einfallen. Daher habe ich mir die Interfaces genauer angeschaut und dabei zwei unterschiedliche Interface Arten erkannt.

Und diese zweite Art von Interfaces hat mir das Finden eines passenden Bezeichners zunächst schwer gemacht. Aber nur, bis ich mal mit der "normalen" Sprache an das Problem herangegangen bin.

Wenn ein Objekt eine bestimmte Eigenschaft haben soll, z.Bsp. eine GUID, dann sagt man, das Objekt hat eine GUID. Warum sollte man das dann nicht auch so im Programmcode schreiben?

Also:

public class person : IhaveGUID {}

Das sieht doch wirklich gut aus. Es ist leicht zu lesen und man muss kaum zwischen Quelltext und realer Sprache übersetzen.

In einem aktuellen Projekt habe ich dieses Schema auch auf abstrakte Klassen ausgeweitet und vor die abstrakten Klassen ein kleines "a" als Prefix gepackt. Da kam dan folgende Syntax heraus:

public abstract class aElement { ... }

public class Helium : aElement { ... }

Das sieht zwar etwas ungewöhnlich aus, aber es ist doch sehr angenehm zu lesen.

Viele  Grüße,

Christof