Programiranje

Kako ne uporabljati vmesnikov v jeziku C #

Pri oblikovanju aplikacije boste pogosto morali uporabiti vmesnike in abstraktne razrede. Ta članek obravnava nekatere pogoste primere "zlorabe vmesnika" in strategije, s katerimi se jim lahko izognemo. Prav tako razpravlja o tem, kaj pomeni načelo, "program na vmesnik in ne na izvedbo."

Kaj so vmesniki?

Najprej spoznajmo vmesnike in zakaj so potrebni pri programiranju. Vmesnik je strogo pogodba; nima nobene izvedbe. Vmesnik vsebuje samo izjave članov. Lahko imate izjave metod, ne pa tudi definicij. Člani, prijavljeni v vmesniku, morajo biti implementirani v tipih (razredih in strukturah), ki razširjajo ali izvajajo vmesnik. Vmesnik ne sme vsebovati polj. Vmesnika ni mogoče serializirati, ker ne more imeti podatkovnih članov. Kot sem rekel, lahko vmesnik vsebuje samo deklaracije in ne definicije.

Izogibajte se spremembam vmesnikov

Razred ali struktura, ki razširja vmesnik, mora implementirati vse svoje člane. Če se izvedba spremeni, bo vaša koda še vedno delovala. Če pa se pogodba, torej vmesnik, spremeni, boste morali spremeniti izvedbe vseh vrst, ki razširjajo vmesnik. Z drugimi besedami, vsaka sprememba vmesnika bo vplivala na vse vrste, ki razširjajo vmesnik. Vrste, ki razširjajo vmesnik, se morajo držati pogodbe. Torej, vmesnike uporabljajte le, kadar jih le redko želite spremeniti. Prav tako je na splošno bolje ustvariti nov vmesnik, kot pa spremeniti obstoječega.

Program za vmesnik, ne za izvedbo

Morda ste tu in tam že slišali besede »program vmesniku in ne izvedbi«. Morda ste v svoji kodi uporabljali vmesnike, vendar ste še vedno programirali izvedbo. Poglejmo zdaj razliko med obema pristopoma.

Ko programirate vmesnik, namesto konkretne izvedbe uporabite najbolj splošno abstrakcijo (vmesnik ali abstraktni razred). Ker vmesniki zagotavljajo enotnost, programiranje vmesnika pomeni, da lahko s podobnimi predmeti ravnate na enak način. Pri tem ste ločeni od izvedbe - tj. Vaše izvedbe se lahko razlikujejo. To doda prilagodljivost tudi vašim modelom.

Naslednji delček kode prikazuje programiranje vmesnika. Razmislite o vmesniku z imenom IRepository, ki vsebuje izjavo nekaj metod. Razreda ProductRepository in CustomerRepository razširjata vmesnik IRepository in izvajata metode, deklarirane v vmesniku IRepository, kot je prikazano spodaj.

javni vmesnik IRepository

    {

// Nekaj ​​kode

    }

javni razred ProductRepository: IRepository

    {

// Nekaj ​​kode

    }

javni razred CustomerRepository: IRepository

    {

// Nekaj ​​kode

    }

Naslednjo kodo lahko uporabite za ustvarjanje primerka ProductRepository.

Repozitorij IRepository = new ProductRepository ();

Ideja je, da lahko tukaj uporabite kateri koli razred, ki izvaja vmesnik IRepository. Torej velja tudi naslednja izjava.

Repozitorij IRepository = new CustomerRepository ();

Ko programirate izvedbo, se ta enotnost izgubi. Namesto tega boste običajno imeli nekaj konstruktov, na primer stavke »if..else« ali »switch..case«, za nadzor vedenja v vaši kodi.

Izogibajte se pretirani uporabi vmesnikov

Povezovanje vsakega razreda z vmesnikom ni dobra praksa. Prekomerna uporaba vmesnikov na ta način ustvarja nepotrebno zapletenost, uvaja odvečnost kode, krši YAGNI in zmanjšuje berljivost in vzdrževanje osnove kode. Vmesniki se uporabljajo za združevanje objektov z enakim vedenjem. Če predmeti nimajo enakega vedenja, ta skupina ni potrebna. Primer prekomerne uporabe vmesnikov, če tega ne boste izvedli na več načinov.

Ustvarjanje vmesnika za razred, ki se ujema z javnimi člani razreda, je zelo pogosto. S tem sploh ne dodate nobene vrednosti - samo podvojite vmesnik razreda, ne da bi dodali resnično abstrakcijo.

Poglejmo si zdaj primer, kako se vmesniki preveč uporabljajo. Razmislite o naslednjem vmesniku z imenom IProduct.

javni vmesnik

    {

int Id {get; set; }

niz ProductName {get; set; }

dvojna cena {get; set; }

int Količina {get; set; }

    }

Razred Product razširja vmesnik IProduct, kot je prikazano spodaj.

javni razred Izdelek: IPproduct

    {

public int Id {get; set; }

javni niz ProductName {get; set; }

javna dvojna cena {get; set; }

public int Količina {get; set; }

    }

Jasno je, da vmesnika IProduct ne potrebujemo, saj sta vmesnik in njegova izvedba enaka. Odvečna koda ni potrebna.

Poglejmo še en primer. Naslednji delček kode prikazuje vmesnik z imenom IProductManager, ki ima izjavo dveh metod, in sicer Save in Update.

 javni vmesnik IProductManager

    {

void Save (izdelek IPproduct);

neveljavna posodobitev (izdelek IPproduct);

    }

Vmesnik IProductManager vsebuje izjave javnih metod razreda ProductManager. Evo, kako izgleda razred ProductManager.

 javni razred ProductManager: IProductManager

    {

javna praznina Shrani (izdelek IPproduct)

        {

// Tukaj napišite svojo izvedbo

        }

posodobitev za javno void (izdelek IPproduct)

        {

// Tukaj napišite svojo izvedbo

        }

    }

Vmesnika IProduct in IProductManager sta primera prekomerne uporabe vmesnikov. Oba vmesnika imata eno samo izvedbo in sploh ne dodajata nobene vrednosti.

Z uporabo vmesnikov lahko odstranite nepotrebne sklopke v kodi in olajšate preizkus kode. Vendar se je treba izogibati pretirani uporabi vmesnikov. Vmesnike uporabljajte le, če jih bo več kot ena izvedba. Vmesnike lahko uporabite tudi, če imate razred, ki ima veliko vlog ali ima več odgovornosti. V tem primeru lahko vaš razred implementira več vmesnikov - po enega za vsako vlogo.

$config[zx-auto] not found$config[zx-overlay] not found