Thema: Delphi Generics und Enums

Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#14

AW: Generics und Enums

  Alt 12. Sep 2015, 07:39
Ich sehe auch keinen Beitrag, der Enums als 'per se schlecht' darstellt. Ich sehe nur Beiträge, die zeigen, das es auch anders geht. Ein Beitrag (meiner) behauptet, das die Verwendung von Enums ein Indiz für unsauberen Code sind. Ein Indiz. Mehr nicht.

Als Faustregel kann gelten: Wenn mit einem Enum (oder Konstanten) an mehreren Stellen im Code Logik ausgeführt wird (das können IF- oder CASE-Schleifen Anweisungen sein), sollte eine Zusammenfassung der verstreuten Logik und die Verwendung einer Fabrik in Betracht gezogen werden.

Wir haben z.B. eine alte Datenbank, bei der qualitative Merkmale ('Lookup') mit Buchstabencodes, Nummern usw. kodiert werden. Grauenvoll, aber ok. In Delphi (zumindest den alten Dialekten) würde ich dafür Konstanten nehmen, also z.B.
Delphi-Quellcode:
Const
  Gender_Male='M';
  Gender_Female='F';
  Gender_Unknown='N';
  Gender_Bisexual = 'B';
  ...
In C#, mit dem wir arbeiten, kann ich auch Enums verwenden. Wir haben vereinbart, die Repräsentation in der Datenbank über ein Attribut zu spezifizieren:
Code:
public enum GenderType {
  [Representation("M")]
  Male,

  [Representation("F")]
  Female,
...
}
Der Code war so vorgegeben. Wir hätten das anders gelöst, können aber mit dem Pattern 'Enums und RepresentationAttribute' leben.

Was wir aber nirgends haben, ist ein Switch- bzw. Case-Statement über das Geschlecht. Wir haben eine 'Gender' Klasse, die die Eigenschaften des spezifischen Geschlechts kapselt. Beim Einlesen einer Person aus der DB wird im ORM die Spalte 'Gender' sofort auf die Genderklasse gemappt, sodaß die Person als 'Gender' kein Enum hat, sondern eben die Klasse. Die Klasse sieht in etwa so aus
Code:
public class Gender {
  public static Gender Male = new Gender (...)
  public static Gender Female = new Gender (...)

  private Gender (...)
...
}
D.h. ich kann keine Instanz von 'Gender' erzeugen, sondern nur die statischen Klassenkonstanten verwenden. Syntaktisch ist das identisch mit einem Enum, nur kann ich kein Switch aufspannen, was wir genauso wollen. Beim Einlesen der Spalte 'Gender' bekomme ich zunächst einen GenderType (also Enum) und anschließend über eine Fabrikmethode eine der statischen Instanzen. Somit kann ich auf Gleichheit prüfen, wenn ich das muss.

D.h. die Enums dienen in diesem Projekt eigentlich nur der Dokumentation und dem Mapping zwischen einer Kodierung (DB-Spalte 'M','F','N' etc.) und einer Semantik ('Gender.Male').

NB: Da unser Geschlecht 'Gender' wie ein Enum aussieht, aber eine Klasse ist, kann ich nun natürlich auch Generics damit definieren. Womit der Kreis zur Eingangsfrage wieder geschlossen ist.
  Mit Zitat antworten Zitat