AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Generics und Enums

Ein Thema von bernau · begonnen am 9. Sep 2015 · letzter Beitrag vom 14. Sep 2015
Antwort Antwort
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Generics und Enums

  Alt 12. Sep 2015, 06:16
Wie jedes andere Element passen Enums nicht überall - aber in keinem der verlinkten Beispiele sehe ich ein Argument, warum Enums pe es schlecht sein sollen. Ich sehe nur Beispiele, in denen Enums nicht das Mittel der Wahl sind.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

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
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Generics und Enums

  Alt 12. Sep 2015, 08:04
Das heißt, Du baust für jeden Enum-Wert eine eigene Klasse?
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.312 Beiträge
 
Delphi 12 Athens
 
#4

AW: Generics und Enums

  Alt 12. Sep 2015, 11:19
Ein Beitrag (meiner) behauptet, das die Verwendung von Enums ein Indiz für unsauberen Code sind. Ein Indiz. Mehr nicht.
Zitat:
Unter einem Indiz (von lat.: indicare „anzeigen“) wird ein Hinweis verstanden, der für sich allein oder in einer Gesamtheit mit anderen Indizien den Rückschluss auf das Vorliegen einer Tatsache zulässt.
Also erst mal mit einer Behauptung schlecht machen, ohne Konkrete Beispiele zu geben.

Genau so könnte man sagen "Die Verwendung von Delphi ist ein Indiz für unsauberen Code".


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.
Was ja in meinem oberen Beispiel gemacht wurde. Alle Logiken stehen in der Nähe von der Deklaration der Enums.

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';
  ...
Wenn du nur Konstanten nimmst, dann hast du keinerlei Möglichkeit zu erfahren, wenn eine neue Konstante zugefügt wurde. Enums kann ich iterieren und eine Exception auslösen.

Übrigens

Delphi-Quellcode:
Const
  Gender_Male='M';
  Gender_Female='F';
  Gender_Unknown='N';
  Gender_Bisexual = 'B';
  HairColor_Blond = 'B';
  HairColor_Black = 'L';
  HairColor_Grey = 'G';
Was hier zusammen gehört, weist du natürlich (als Mensch)

Bei Enums weis der Compiler sofort was zusammen gehört.


Ach ja, hier ein haarsträubendes Beispiel:

Delphi-Quellcode:
Const
  Gender_Male='M';
  Gender_Female='F';
  Gender_Unknown='N';
  Gender_Bisexual = 'I';
  ...
Erkenne den Fehler.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz