Programavimas

Kaip nenaudoti sąsajų C #

Kuriant programą dažnai reikės naudoti sąsajas ir abstrakčias klases. Šiame straipsnyje aptariami keli įprasti „piktnaudžiavimo sąsaja“ pavyzdžiai ir strategijos, kurias galime naudoti, kad jų išvengtume. Taip pat aptariama, ką reiškia principas „programa sąsajai, o ne įgyvendinimui“.

Kas yra sąsajos?

Pirmiausia supraskime sąsajas ir kodėl jos reikalingos programuojant. Sąsaja yra griežtai sutartis; jis neturi jokio įgyvendinimo. Sąsajoje yra tik narių deklaracijos. Galite turėti metodo deklaracijas, bet ne apibrėžtis. Sąsajoje deklaruojami nariai turėtų būti įgyvendinami pagal tipus (klases ir struktūras), kurie išplėtė arba įgyvendina sąsają. Sąsajoje negali būti laukų. Sąsaja negali būti serijinė, nes joje negali būti duomenų narių. Kaip sakiau, sąsajoje gali būti tik deklaracijos, o ne apibrėžimai.

Venkite keisti sąsajas

Klasė ar struktūra, pratęsianti sąsają, turėtų įdiegti visus jos narius. Jei diegimas pasikeis, jūsų kodas vis tiek veiks. Tačiau jei pasikeis sutartis, t. Y. Sąsaja, turėsite pakeisti visų tipų, kurie išplės sąsają, diegimą. Kitaip tariant, bet koks sąsajos pakeitimas paveiks visus tipus, kurie plečia sąsają. Sąsają plečiantys tipai turi atitikti sutartį. Taigi, naudokite sąsajas tik tada, kai jas keisti reikia retai. Be to, paprastai geriau sukurti naują sąsają, nei pakeisti esamą.

Programuokite sąsajai, o ne diegimui

Dabar ir tada galbūt girdėjote žodžius „programa sąsajai, o ne diegimui“. Galbūt jūs naudojote sąsajas savo kode, bet vis tiek programavote diegimą. Dabar panagrinėkime šių dviejų požiūrių skirtumą.

Kai programuojate sąsają, vietoj konkretaus įgyvendinimo naudojate dažniausiai naudojamą abstrakciją (sąsają arba abstrakčią klasę). Kadangi sąsajos garantuoja vienodumą, programavimas sąsajoje reiškia, kad panašius objektus galite valdyti vienodai. Tai darydami esate atsietas nuo diegimo, t. Y. Jūsų diegimas gali skirtis. Tai taip pat padidina jūsų dizaino lankstumą.

Šis kodo fragmentas iliustruoja programavimą sąsajoje. Apsvarstykite sąsają, pavadintą „IRepository“, kurioje yra kelių metodų deklaracija. „ProductRepository“ ir „CustomerRepository“ klasės praplečia „IRepository“ sąsają ir įgyvendina „IRepository“ sąsajoje deklaruotus metodus, kaip parodyta žemiau.

viešoji sąsaja IR saugykla

    {

// Kažkas kodas

    }

viešosios klasės „ProductRepository“: „IRepository“

    {

// Kažkas kodas

    }

viešosios klasės „CustomerRepository“: „IRepository“

    {

// Kažkas kodas

    }

Šį kodą galima naudoti kuriant „ProductRepository“ egzempliorių.

„IRepository“ saugykla = nauja „ProductRepository“ ();

Idėja yra ta, kad čia galite naudoti bet kurią klasę, kuri įgyvendina „IRepository“ sąsają. Taigi, šis teiginys taip pat galioja.

„IRepository“ saugykla = nauja „CustomerRepository“ ();

Kai programuojate diegimą, šis vienodumas prarandamas. Vietoj to paprastai turėsite keletą konstrukcijų, pvz., „If..else“ arba „switch..case“ sakinius, kad valdytumėte elgesį savo kode.

Venkite per didelio sąsajų naudojimo

Kiekvienos klasės susiejimas su sąsaja nėra gera praktika. Pernelyg didelis sąsajų naudojimas tokiu būdu sukuria nereikalingą sudėtingumą, sukuria kodo perteklių, pažeidžia YAGNI ir sumažina kodo bazės įskaitomumą ir prieinamumą. Sąsajos yra naudojamos objektams, turintiems vienodą elgesį, sugrupuoti. Jei objektai nevienodai elgiasi, šios grupavimo nereikia. Sąsajų naudojimas, kai neketinate to kelis kartus įdiegti, yra sąsajos per daug naudojimo pavyzdys.

Kurti klasės sąsają, kuri atitiktų viešus klasės narius, yra gana įprasta. Tai darydami jūs visiškai nepridedate jokios vertės - jūs tiesiog dubliuojate klasės sąsają, nepridėdami tikros abstrakcijos.

Dabar pažvelkime į tai, kaip per daug naudojamos sąsajos. Apsvarstykite šią sąsają, pavadintą „IProduct“.

viešosios sąsajos IProduktas

    {

int Id {gauti; rinkinys; }

eilutė „ProductName“ {get; rinkinys; }

dviguba kaina {get; rinkinys; }

int Kiekis {gauti; rinkinys; }

    }

Produkto klasė išplečia „IProduct“ sąsają, kaip parodyta žemiau.

viešosios klasės produktas: „IProduct“

    {

public int Id {get; rinkinys; }

vieša eilutė „ProductName“ {get; rinkinys; }

viešas dvigubas Kaina {get; rinkinys; }

public int Kiekis {gauti; rinkinys; }

    }

Aišku, mums nereikia „IProduct“ sąsajos, nes sąsaja ir jos įgyvendinimas yra identiški. Perteklinis kodas nereikalingas.

Pažvelkime į kitą pavyzdį. Šiame kodo fragmente rodoma sąsaja, pavadinta „IProductManager“, turinti dviejų metodų deklaraciją: „Išsaugoti“ ir „Atnaujinti“.

 viešoji sąsaja „IProductManager“

    {

void Save („IProduct“ produktas);

negaliojantis „Update“ („IProduct“ produktas);

    }

„IProductManager“ sąsajoje yra „ProductManager“ klasės viešųjų metodų deklaracijos. Štai kaip atrodo „ProductManager“ klasė.

 viešosios klasės „ProductManager“: „IProductManager“

    {

public void Save („IProduct“ produktas)

        {

// Parašykite savo įgyvendinimą čia

        }

public void Update („IProduct“ produktas)

        {

// Parašykite savo įgyvendinimą čia

        }

    }

„IProduct“ ir „IProductManager“ sąsajos yra per didelio sąsajos naudojimo pavyzdžiai. Abi šios sąsajos turi vieną įgyvendinimą ir jos visiškai neprideda jokios vertės.

Naudodami sąsajas galite pašalinti nereikalingas jūsų kodo jungtis ir padaryti kodą lengvai patikrinamą. Tačiau reikėtų vengti per didelio sąsajų naudojimo. Sąsajas naudokite tik tada, kai jų bus daugiau nei vienas. Taip pat galite naudoti sąsajas, kai turite klasę, kurioje yra daug vaidmenų arba kurioms tenka kelios pareigos. Tokiu atveju jūsų klasė gali įdiegti kelias sąsajas - po vieną kiekvienam vaidmeniui.

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