Frage

Ich bin zur Codierung eines einfache Data Access Layer, und ich frage mich, welche Art ich zu den anderen Schichten aussetzen soll.

Ich werde die Daten als List <>, um intern zu implementieren, aber ich etwas erinnere mich etwa nicht den Listentyp an die Verbraucher ausgesetzt wird, wenn nicht benötigt.

public List<User> GetAllUsers() // non C# users: that means List of User :)

Wissen Sie, warum (Google nicht helfen)? Was Sie in der Regel für diese Art von Sachen aussetzen? IList? IEnumerable?

War es hilfreich?

Lösung

In der Regel ist es am besten, die am wenigsten leistungsfähige Schnittstelle zu machen, die der Benutzer kann mit noch sinnvoll arbeiten. Wenn der Benutzer nur einige zählbaren Daten benötigt, kehrt IEnumerable<User>. Wenn das nicht genug ist, weil der Benutzer die Liste muss in der Lage zu ändern (Achtung! Oft sollte nicht der Fall sein), eine IList<User> zurück.

/ EDIT:

Joel fragt eine gültige Frage in seinem Kommentar: Warum in der Tat das am wenigsten leistungsfähige Schnittstelle aussetzen, anstatt den Anwender maximale Leistung zu gewähren? (Paraphrasiert)

Die Idee dahinter ist, dass das Verfahren die Daten der Rückkehr der Benutzer seinen Inhalt ändern erwarten könnte: Eine andere Methode der Klasse noch die Liste erwarten nicht leer zu sein, nachdem ein Hinweis auf sie zurückgeführt wurde. Stellen Sie sich vor den Benutzern alle Daten aus der Liste entfernt. Die andere Methode muss nun eine zusätzliche Überprüfung, dass ele nicht notwendig gewesen wäre.

Noch wichtiger ist, dies macht Teile der internen Implementierung durch den Rückgabetyp. Wenn ich die Umsetzung zu ändern, in der Zukunft brauche, so dass es nicht mehr verwendet einen IList Behälter, habe ich ein Problem: Ich muß entweder die Methode Vertrag ändern, eine Build-breaking Änderung einzuführen. Oder muss ich die Daten in eine Liste Container kopieren.

Als Beispiel vorstellen, dass eine effiziente Implementierung ein Wörterbuch verwendet, und gibt nur die Values Sammlung, die nicht IList nicht implementiert.

Andere Tipps

Auf jeden Fall ein ISomething. Mit Hilfe einer Schnittstelle Kopplung reduzieren und machen es einfacher Details Ihrer Daten Implementierung der Ebene ändern die Straße hinunter. Welche Schnittstelle von den Umständen abhängt. IList ist gut, aber manchmal können Sie ICollection Funktionalität benötigen oder wollen Werte angeben, die Readonly sind.

Sie sollten genau überlegen, bevor IEnumerable zurück. Wenn die zugrunde liegende Code „Ausbeute“ unter Verwendung des IEnumerable zu erzeugen, oder LINQ verwenden, dann werden Sie verwendet offen alle Ressourcen halten am Ende.

Sie sollten die IEnumerable in ein anderes IEnumerable kopieren, bevor es zurückkehrt. Durch die Verwendung von IList Sie dies eine Voraussetzung machen, damit niemand versehentlich eine IEnumerable zurückgeben kann.

Auf der anderen Seite, eine IList Rückkehr bedeutet, an den Anrufer, dass sie die zurückgegebene Liste ändern können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top