| 

.NET C# Java Javascript Exception

1
Ich habe eine Klasse, die meiner Anwendung verschiedene Enums zur Verfügung stellen soll (zwecks einfacherer Codierung). Nun muss zwischen Framework und Anwendung getrennt werden. Es sollen aber keine getrennten Namespaces sein, sondern der gleiche Enum soll alle Werte enthalten.

Kann ich etwas ähnliches wie "partial Enums" benutzen?

Beispiel:

Public Class CommonEnums

Enum Settings
Setting1
Setting2
Setting3
End Enum
End Class

+++++++++++++++++++++++++++++++++++++++

Partial Public Class CommonEnums

Enum Settings
Setting4
Setting5
Setting6
End Enum
End Class


Nachtrag:
Das das Framework auf den Enum aus der Anwendung zugriff, war obsoleter Code. In einem nachträglichen Codereview ergab sich, dass hier noch die Erstimplementierung drin war. Mittlerweile war schon ein genereller Weg gefunden worden. Leider hat der Entwickler den "alten" Code vergessen zu entfernen. Daher kam es beim Kompilieren zum Fehler.

Das Umstellen der Enums in Anwendungscode war jetzt aber möglich, nachdem wir den obsoleten Code entfernt hatten. Danke für die Antworten
News:
07.09.2013
MyKey0815 1,6k 2 9
3 Antworten
1
Was du da machen wilst, hört sich für mich irgendwie schräg an. Mein Bauchgefühl sagt mir daß dies "bad code smell" ist. Wenn Jens richtig vermutet, dass Framework und Anwendung in unterschiedlichen Assemblies liegen, gehe ich davon aus, dass ein Teil der Enum-Werte nur in der Anwendung und ein Teil nur im Framework verwendet werden soll. Abgesehen davon, dass es nicht möglich ist partielle Klassen über meherere Assemblies zu verteilen macht es in diesem Fall mehr Sinn zwei Enumerations zu definieren (alleine wegen der sauberen Trennung der Zuständigkeiten).

Ich verwende generell Namespaces, um meinen Code zu gliedern. Leider generiert VB ja nicht automatisch Namespaces wie C# (einer der Gründe, warum ich lieber in C# entwickle). Du kannst dir aber eigene File-Templates definieren, welche die Namespace-Anweisung enthalten. Ich benutze (unter Anderem) hierfür das AddIn ReSharper, weil es die Definition und Verwaltung von Templates (auch in Teams) stark vereinfacht.

Gruß
Klaus
08.09.2013
luedi 2,1k 1 9
Danke für deine Antwort. Leider scheint es echt nicht so zu gehen, wie ich dachte. Es soll eigentlich so sein, dass der Enum im Framework ist und weitere Einträge in der Anwendung zufinden sind. Das Framework braucht aber die Summe der beiden Listen
MyKey0815 08.09.2013
Da mehrere Anwendungen das selbe Framework nutzen, kann ich in der FW-Assembly keine Verlinkungen oder ähnliches auf die Anwendung machen (untere Ebene verlinkt auf höhere Ebene). Ich denk, wir müssen den Ansatz nochmal diskutieren/besprechen/ändern
MyKey0815 08.09.2013
1
Ich kann es gerade nicht ausprobieren, aber ich glaube nicht, dass es geht.
Aber so wie Du das machst, könnte das vermutlich auch nicht funktionieren.
Wenn keine Integerwerte angegeben sind, numeriert .NET die Enums von 0 aus durch.
In dem Fall würde ich annehmen, dass Setting1 und Setting4 identisch behandelt werden könnten.

Was ich nicht verstehe ist "Nun muss zwischen Framework und Anwendung getrennt werden".
Das klingt für mich, als wären dies zwei getrennte Assemblies. Du kannst eine Partielle Klasse aber nicht in 2 verschiedene Assemblies packen. Und weshalb Du die Klasse innerhalb einer Assembly teilen musst, erschliesst sich mir auf dem ersten Blick nicht.

Man mag darüber geteilter Meinung sein, aber ich habe mal gelesen dass man partielle Klassen nur dann benutzen sollte, wenn es technisch nicht anders geht. Das wäre z.B. bei durch T4-Template generierte Klassen so. Dort gibt es keine andere möglichkeit, da die generierte Klasse ja immer überschrieben wird.

Gute Nacht :)
08.09.2013
Jens Duczmal 2,6k 1 3 9
1
Der Vollständigkeit halber: der Effekt, den Du über die partielle Klasse erreichen willst, liefe letztlich auf eine Vererbung für Enums hinaus. Enums können in VB.NET (ebensowenig wie in C#) aber nicht von anderen Enums erben.

Bis zu einem gewissen Grade könntest Du diese Einschränkung umgehen durch ein Muster, das jeder etwas ältere Java-Programmierer kennt (vor Java 5 gab es dort nämlich gar keine enums). Die Lösung sähe dann in einer minimalen Version etwa so aus (für mich zur Vereinfachung in C#):

public class FWSetting
{
public static readonly FWSetting Setting1 = new FWSetting();
public static readonly FWSetting Setting2 = new FWSetting();
public static readonly FWSetting Setting3 = new FWSetting();

protected FWSetting() {}
}

public class AppSetting : FWSetting
{
public static readonly AppSetting Setting4 = new AppSetting();
public static readonly AppSetting Setting5 = new AppSetting();
public static readonly AppSetting Setting6 = new AppSetting();

protected AppSetting() { }
}


"Bis zu einem gewissen Grade", weil der Spaß aufhört, wenn Du einen solchen "Enum" in switch-Statements verwenden willst oder sonstwie ValueType-Eigenschaften oder const-Semantik brauchst.

Einen weiteren Ansatz findest Du in der Antwort zu einer verwandten Frage bei stackoverflow.

Soweit zur Machbarkeit. Aber wie die Kollegen hier auch möchte ich Dir raten, Dein Design nochmal zu überdenken. Da ist irgendetwas faul. Einen Enum verwendet man, wenn man zur Entwicklungszeit schon alle möglichen Werte kennt und benennen kann (woraus sich allein eigentlich schon ergibt, dass Vererbung von Enums keine gute Idee ist). Wenn Dein Framework, wie Du schreibst, neben den von ihm selbst definierten Werten auch die aus der Anwendung braucht, so ist diese Regel verletzt. Wie soll denn das Framework mit Setting4 umgehen? Diesen Wert kann es ja gar nicht kennen. Siehe dazu auch die Empfehlungen von Microsoft zur Verwendung von Enums in Frameworks.

Möglicherweise wäre eine statische Klasse mit einer Menge von Konstanten der passendere Ansatz für Dich?
08.09.2013
Matthias Hlawatsch 13,2k 4 9
Danke für deinen Beitrag. Um die Verwendung zu beschreibben müsste ich jetzt hier mehr Platz haben. Aber ich werde dass heute bei unserer Besprechung nochmal zum Thema machen.
MyKey0815 09.09.2013

Stelle deine .net-Frage jetzt!