Laut FXCop sollte List in einem API-Objektmodell nicht verfügbar sein. Warum wird dies als schlechte Praxis angesehen?Warum wird es als schlecht angesehen, die Liste <T> freizulegen?
Antwort
Ich stimme Elch-im-Dschungel hier zu: List<T>
ist ein unbeschränktes, aufgeblähtes Objekt, das viel "Gepäck" darin hat.
Zum Glück ist die Lösung einfach: expose IList<T>
stattdessen.
Es stellt eine Barebone-Schnittstelle, die die meisten alle List<T>
‚s Methoden hat (mit Ausnahme von Dingen wie AddRange()
), und es ist nicht auf den spezifischen List<T>
Typ beschränken, die Ihre API Verbraucher können ihre eigenen verwenden Implementierer von IList<T>
.
Für noch mehr Flexibilität sollten Sie erwägen, einige Sammlungen gegebenenfalls IEnumerable<T>
auszusetzen.
Was würden Sie für einen Web-Service empfehlen (wo eine Methode keine Schnittstelle zurückgeben/aufnehmen kann)? – kpollock
kpollock - leider SOAP Web-Dienste * wird * jede IList
Nur weil Sie IList
Ich glaube, Sie wollen nicht Ihre Kunden neue Elemente in Ihrer Rückkehr hinzufügen. Eine API sollte klar und vollständig sein und wenn sie ein Array zurückgibt, sollte sie die genaue Datenstruktur zurückgeben. Ich glaube nicht, dass es etwas mit T pro sagen zu tun, sondern eher eine Liste <> anstelle eines Arrays Rückkehr [] direkt
-1. Insbesondere sollte [Eigenschaften keine Arrays zurückgeben] (http://msdn.microsoft.com/en-us/library/0fss9skc%28v=VS.100%29.aspx). Während Methoden in allgemeinen Sammlungen, aufzählbaren Sequenzen und Schnittstellen für C# idiomatischer sind. – TrueWill
Es sind die zwei Hauptgründe:
- Liste <T> ist ein eher aufgeblähter Typ mit vielen Mitgliedern, die in vielen Szenarien nicht relevant sind (ist für öffentliche Objektmodelle zu "beschäftigt").
- Die Klasse ist nicht abgedichtet, aber nicht speziell erweitert werden entworfen (Sie keine Mitglieder außer Kraft setzen können)
Genau richtig.Hier ist ein Link zu Krzysztof Cwalina zum Thema: http://blogs.msdn.com/kcwalina/archive/2005/09/26/474010.aspx –
Es ist nur eine schlechte Praxis in Betracht gezogen, wenn Sie eine API schreiben, die von Tausenden oder Millionen von Entwicklern verwendet werden.
Das .NET-Framework-Design-Richtlinien sind für Microsofts öffentlichen APIs gemeint.
Wenn Sie eine API haben, die nicht von vielen Personen verwendet wird, sollten Sie die Warnung ignorieren.
Sie wissen schon ... ich war einfach nur da falsch ... Ich aktualisiere meine Antwort. –
Nun ... dann werde ich meinen Kommentar entfernen, der nicht mehr relevant ist. :) –
Obwohl es stimmt, dass einige der FxCop-Regeln Framework-Design-Richtlinien sind und für einige Projekte möglicherweise nicht geeignet sind, können sogar Bibliotheken, die für kleine Teams entwickelt wurden, davon profitieren, sie zu befolgen. Haben Sie jemals 5 Entwicklern gesagt, dass sie ihre Projekte ändern müssen, weil Sie eine bahnbrechende Änderung an einer Bibliothek vornehmen müssen (sagen wir, um Änderungen zu beobachten, wie @Kaagle erwähnt)? Haben Entwickler in Ihrem Team jemals etwas getan, was Sie nicht erwartet haben, wie zum Beispiel den Inhalt einer Listeneigenschaft, die Sie nur lesen möchten? – TrueWill
Ein Grund dafür ist, weil Liste nicht etwas ist, können Sie simulieren. Selbst in weniger populären Bibliotheken habe ich Wiederholungen gesehen, die aufgrund dieser Empfehlung ein List-Objekt als IList verfügbar machten, und in späteren Versionen entschieden, die Daten überhaupt nicht in einer Liste zu speichern (vielleicht in einer Datenbank). Da es sich um eine IList handelte, war es keine bahnbrechende Änderung, die Implementierung unter den Clients zu ändern und trotzdem alle zu arbeiten.
Einer der Gründe ist, dass der Benutzer in der Lage sein wird, die Liste zu ändern, und der Besitzer der Liste nicht darüber Bescheid weiß, während er in einigen Fällen einige Dinge nach dem Hinzufügen/Entfernen von Elementen aus der Liste tun muss. Auch wenn es jetzt nicht benötigt wird, kann es in Zukunft zur Anforderung werden. Also ist es besser, dem Besitzer der Klasse die AddXXX/RemoveXXX-Methode hinzuzufügen und die Liste und IEnumerable oder (was meiner Meinung nach besser ist) als eine IList verfügbar zu machen und ObservableCollection von WindowsBase zu verwenden.
Enthüllung 'List
fragte ich die Frage am 23. Dezember 2008. Die Frage, die Sie am 30. Dezember 2008 gebucht verbunden war ich würde sagen, dass ich kam zuerst. –