2009-08-12 12 views
4

In meinem BL (eine öffentliche API sein), ich bin mit ICollection als die Rückgabetypen in meinen Find-Methoden, wie:Frage zum Rückgabetyp mit Sammlungen

public static ICollection<Customer> FindCustomers() 
{ 
    Collection<Customer> customers = DAL.GetCustomers(); 

    return customers; 
} 

Beachten Sie die Verwendung von ICollection statt Sammlung <>.

Jetzt in meinem GUI, ich brauche die Ergebnisse zurück an Sammlung zu werfen, wie:

Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers(); 

Das ist, weil ich eine Sammlung <> spezifische Methoden auf meine zurückgegebene Liste verwenden müssen, was ich nicht tun kann, mit ICollection <>.

Ist dies die korrekte Verwendung? Oder sollte ich einfach den Rückgabetyp von Collection <> stattdessen zu ICollection <> ändern, um dieses Casting zu vermeiden?

Zweitens habe ich IEnumerable nicht verwendet, weil es allgemeiner als ICollection ist und nicht einmal einfache Eigenschaften wie Count hat. Und ich sehe keinen Sinn darin, die Rückgabetypen hier zu verallgemeinern. Fehle ich etwas Wichtiges?

Antwort

2

Der ganze Sinn der Verwendung von ICollection ist allgemeiner zu sein und mehr Informationen zu verstecken, was eine gute Sache ist.

Aber wenn Sie es zurück konvertieren müssen, ist es sinnlos geworden und Sie könnten stattdessen die funktionellere Collection <> stattdessen zurückgeben.

0

Die Idee der Rückgabe ICollection ist so, dass Sie haben weniger Kopplung auf Ihre Methode. Wenn Sie später eine Liste erstellen möchten, anstatt eine Sammlung, können Sie dies tun, ohne den Client-Code usw. zu verletzen.

Wenn Sie mit dieser nur eine Sammlung zu bekommen (und nicht eine ICollection), als IMHO Sie Sammlung ändern könnte, wissen Sie eine weniger flexible Methode haben. Aber trotzdem, YAGNI.

Darüber hinaus, wenn Sie sich Gedanken über Design machen, würde ich vorschlagen, diese statische, um improve the testability Ihres Codes.

0

Das liegt wahrscheinlich daran, dass Collection IList implementiert, mit einigen zusätzlichen Methoden, die ICollection nicht hat, ist IList genug für Sie. Welche Methoden fehlen Ihnen?

0

Wenn Sie von Ihren Benutzern Methoden der Sammlung <> verwenden müssen, sollten Sie wahrscheinlich Collection <> lieber als ICollection zurückgeben.

Vielleicht haben Gebrauch separate Funktion, die auf die Assembly intern ist, die den Typ, den Sie für Ihre GUI benötigen zurückgibt:

internal static ICollection<Customer> FindCustomers() 
{ 
    Collection<Customer> customers = DAL.GetCustomers(); 

    return customers; 
} 
2

Der einzige Grund, warum Sie wollen würde ICollection zurückzukehren ist für lose Kopplung und Vererbung purpouses. Wenn es nur eine Version Ihrer Methode gibt (deren Statik vorhanden ist), wird Ihnen immer der Rückgabetyp (Collection) bekannt sein, und es muss keine ICollection erstellt werden. Wenn Sie jedoch in einer Familie von Klassen verwenden, könnte es eine virtuelle oder abstrakte Methode geben, die ICollection zurückgibt, und dann kann in den Unterklassenimplementierungen eine Collection oder FunkyCollection oder ein Objekt zurückgegeben werden, das die Schnittstelle implementiert Viel mehr Flexibilität, dass Sie nur eine Sammlung zurückgeben können.Aber für Ihre Zwecke sollten Sie prolly einfach den Rückgabetyp Sammlung und nicht ICollection machen, weil es eine statische Methode ist, die nicht überschrieben wird. Außerdem verursacht es weniger Verwirrung für den Benutzer, weil sie nicht casten müssen.

0

Alle anderen haben bereits so große Antworten gegeben, aber ich wollte nur klarstellen, dass nein, ich glaube nicht, was Sie tun, ist ideal. Der Grund dafür ist, dass, wenn jemand später kommt und Ihre BL ändert/umstrukturiert/neu implementiert, um eine andere Art von ICollection (gemäß der API) zurückzugeben, die nicht wirklich eine Collection ist, erhalten Sie Laufzeitfehler in Ihrer GUI.

Sie könnten jedoch immer noch wählen, eine ICollection aus Ihrer BL zurückgeben: Dann, wenn Sie wirklich eine Collection (wahrscheinlich, für eine oder mehrere seiner bequemen Erweiterungsmethoden, ich vermute?), Dann könnten Sie Erstellen Sie eine neue Sammlung und kopieren Sie den Inhalt von einem zum anderen. Auf diese Weise riskieren Sie keinen Laufzeitfehler. Obwohl es letztlich (wie jemand anderes bereits gefragt hat) hängt davon ab, welche Methode (n) Sie in der Collection suchen ... Vielleicht gibt es einen besseren Weg, um zu tun, was Sie wollen.

Viel Glück!
-f!