Použití interface   zodpovězená otázka

.NET

zdravím, mám jednu teoretickou otázku. Kdy je vhodné použít interface?

Jde mi o to jestli má smysl ho dávat před úplně každou třídu nebo jen v ojedinělých případech (např. když daná třída není součástí jiné mojí třídy, ale vytvářím přímo její instance apod.). Vím že pokud použiju interace bude se mi třída (mimo jiné) lépe testovat, ale kdy ho používáte vy?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Všude tam, kde se dá využít polymorfizmus a to rozhodně není každá třída.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, definovat interface má smysl v případě, kdy potřebujete využít polymorfizmus tj. když potřebujete (nebo chcete mít do budoucna možnost) mít více různých konkrétních implementací třídy nezávisle na jejím použití (použití skryjete za definovaný interface).

Jedním z důvodu pro to může být psaní testovatelného kódu, kdy právě potřebuje umět pro test vyměnit standardní implementaci třídy za "fake" implementaci, která například vrací testovací data "natvrdo" místo toho, aby je tahala z databáze apod..

V takovém případě může být dále výhodné konfiguraci toho, jaká konkrétní instance se má zrovna použít (tj. zjednodušeně zda jste v testu nebo ne), řešit pomoci IoC/DI kontejneru.

K tomuto tématu vám doporučuji pro úvod článek zde:

http://www.dotnetportal.cz/blogy/3/Tomas...

a dále video z přednášky "Jak na IoC/DI kontejnery v .NETu" zde:

http://www.wug.cz/zaznamy/101-Jak-na-IoC...

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ta otázka je správná. Ačkoliv to tu už částečně bylo řečeno, konkrétně využívám interface v případech:

- když chci nejdříve navrhnout rozhraní komunikace mezi objekty a až potom objekty implementovat. Ve výsledku to člověka nutí trochu více přemýšlet a mě to pomáhá psát čistší kód s méně závislostmi

- když chci mít možnost měnit implementaci

- když chci mít možnost definovat, že třída podporuje nějaké rozšířené rozhraní a přitom její předek tuto funkci mít nemusí. Například v .NET frameworku rozhraní ICustomFormatter, které říká, že třída (ať už jakákoliv) podporuje rozšířené formátování do textového řetězce.

Obecně by šlo každou třídu popsat i interfacem a s tím pak pracovat. Ale nedělá se to, protože pokud spolu některé třídy přímo souvisí a jsou navržené tak, aby pracovaly dohromady (byla mezi nimi přímá vazba), pak nemá smysl mezi nimi vytvářet abstrakci. Jen by kód zesložitilo a obvykle ničemu nepomohlo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback