Werden Verschachtelungstypen (z. B. aufgezählte Typen oder Strukturen in einer Klasse), wie im Titel erwähnt, als schlechte Praxis angesehen oder nicht? Wenn Sie Code Analysis in Visual Studio ausführen, wird die folgende Meldung zurückgegeben, die impliziert, dass dies der Fall ist:
Warnung 34 CA1034: Microsoft.Design: Verschachteln Sie den Typ 'ClassName.StructueName' nicht. Alternativ können Sie die Zugänglichkeit so ändern, dass sie von außen nicht sichtbar ist.
Wenn ich jedoch der Empfehlung der Codeanalyse folge, stelle ich fest, dass in der Anwendung häufig viele Strukturen und Aufzählungstypen herumschwirren, die möglicherweise nur für eine einzelne Klasse gelten oder nur für diese Klasse verwendet werden. Wäre es als solches angemessen, den Typ Sünde in diesem Fall zu verschachteln, oder gibt es einen besseren Weg, dies zu tun?
quelle
Antworten:
Verschachtelte Typen sind nicht schlecht. Die Warnung, die Sie erhalten, bedeutet nicht, dass Sie niemals einen verschachtelten Typ haben. Es zeigt lediglich an, dass Ihr verschachtelter Typ einen geeigneten Zugriffsmodifikator und Code-Speicherort verwenden sollte.
Wenn der verschachtelte Typ wirklich nur innerhalb der enthaltenden Klasse verwendet wird (dh es handelt sich um einen internen Datencontainer oder eine Statusanzeige), setzen Sie den Zugriffsmodifikator auf privat.
Wenn der verschachtelte Typ Teil einer oder mehrerer Methodensignaturen ist, ist er tatsächlich nicht lokal für die enthaltende Klasse. Es stellt eine Nachricht dar, die an oder von Instanzen der enthaltenden Klasse übergeben wird. In diesem Fall ist es wahrscheinlich besser, den verschachtelten Typ aus der enthaltenen Klasse zu verschieben und ihm einen Open-Access-Modifikator wie "intern" oder "öffentlich" zuzuweisen.
Kurz gesagt, die Warnung scheint zu empfehlen, lokale Typen privat zu machen, und freigegebene Typen sollten eigenständig sein.
quelle
Wenn es nur von dieser Klasse verwendet wird, sollte es privat gemacht werden, und genau das schlägt die Nachricht vor.
quelle
Die Warnung zu Verschachtelungstypen war einer der ersten "Vorschläge", die ich vor einiger Zeit erhalten habe, nachdem ich die Codeanalyse aktiviert hatte. Es war auch der Grund, warum ich es ausgeschaltet habe.
Einige Vorschläge sind wirklich fremd, als ob sie von einem anderen Planeten stammen.
Ich füge Aufzählungen in Klassen ein, um die Dinge logisch zusammenzuhalten.
Stellen Sie sich das so vor: Wenn Verschachtelungstypen in allen Fällen absolut böse gewesen wären, warum hätten die Sprachdesigner sie überhaupt implementiert? Weil es in vielen Fällen nützlich ist und in dieser Hinsicht die Warnung lediglich darauf hinweist, dass etwas in Ihrem Code möglicherweise nicht optimal ist. Ob dies zutrifft oder nicht, liegt bei Ihnen.
quelle
Nein
Ein gutes Beispiel in C # ist IEnumerable, bei dem andere Klassen nicht die genaue zurückgegebene Klasse kennen müssen, sondern nur, dass es sich um einen IEnumerator handelt. Daher ist es sinnvoll, es zu einer verschachtelten Klasse zu machen, da sonst möglicherweise viele kleine Klassen in Intellisense herumschweben, das IEnumerator implementiert
quelle
GetEnumerator()
. aus diesem GrundList<T>.GetEnumerator()
zurückList<T>.Enumerator()
. Wenn es eine Möglichkeit gewesen wäre, den Compiler zu bitten, eine andere benannte Methode zu verwenden, wäre es möglicherweise besser gewesen, diese Methode zu haben, z. B.ForEachGetEnumerator()
returnList<T>.Enumerator
undGetEnumerator()
returnIEnumerator<T>
, aber dafür gibt es keinen Mechanismus.