Vra

Ek is tans kodering 'n eenvoudige Data Access Layer, en ek het gewonder watter tipe sou ek bloot te stel aan die ander lae.

Ek gaan intern implementeer die data as 'n Lys <>, maar ek onthou lees iets oor die tipe Lys nie bloot te stel aan die verbruikers as dit nie nodig is.

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

Weet jy waarom (Google het nie gehelp nie)? Wat doen jy gewoonlik bloot vir daardie soort van dinge? IList? IEnumerable?

Was dit nuttig?

Oplossing

Gewoonlik is dit die beste om die minste kragtige koppelvlak wat die gebruiker kan nog sinvol met blootstel. As die gebruiker net moet 'n paar enumerable data, terugkeer IEnumerable<User>. As dit is nie genoeg nie omdat die gebruiker nodig het om in staat wees om die lys (aandag! Moet nie dikwels die geval is), terug te keer 'n IList<User>. Verander

/ EDIT:

Joel vra 'n geldige vraag in sy kommentaar: Hoekom inderdaad die minste kragtige koppelvlak bloot in plaas van die toekenning van die gebruiker maksimum krag? (Geparafraseer)

Die idee agter dit is dat die metode terugkeer van die data nie kan verwag dat die gebruiker om die inhoud daarvan te verander: Nog 'n metode van die klas kan nog verwag dat die lys van nie-leë wees nadat 'n verwysing na dit terugkom. Stel jou voor die gebruiker al die data verwyder uit die lys. Die ander metode moet nou 'n bykomende tjek wat ele onnodige kon gewees het nie.

Nog belangriker, dit ontbloot dele van die interne implementering deur die tipe terugkeer. As ek nodig het om die implementering in die toekoms te verander sodat dit nie meer gebruik van 'n IList houer, ek het 'n probleem: ek óf nodig het om die metode kontrak te verander, die bekendstelling van 'n gebou te breek verandering. Of ek moet die data in 'n lys houer kopieer.

As 'n voorbeeld, dink dat 'n doeltreffende implementering gebruik 'n woordeboek en net gee die Values versameling wat nie IList beteken implementeer.

Ander wenke

Beslis 'n ISomething. Met behulp van 'n koppelvlak sal koppeling te verminder en maak dit makliker om besonderhede van implementering jou data laag se op die pad te verander. Wat koppelvlak hang af van die omstandighede. IList is goed, maar soms jy kan ICollection funksies nodig het of wil om waardes wat ReadOnly is.

spesifiseer

Jy moet mooi dink voordat hy terugkeer IEnumerable. As die onderliggende kode is die gebruik van "opbrengs" om die IEnumerable genereer, of is die gebruik van LINQ, dan sal jy uiteindelik hou oop enige hulpbronne gebruik.

Jy moet die IEnumerable in 'n ander IEnumerable kopieer voordat hy terugkeer nie. Deur die gebruik van IList, dit 'n vereiste wat jy maak, sodat niemand per ongeluk 'n IEnumerable kan terugkeer.

Aan die ander kant, die terugkeer van 'n IList impliseer om die inbeller wat hulle die teruggekeer lys kan verander.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top