Naudotojas:Loading/OProjektavimas

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.

Turinys

[taisyti] Ideja

Drįstu (taip, būtent tokia mano būsena:) bandyti paaiškinti Jums 2 objektinio projektavimo principus, kaip pats juos suprantu.

  1. Naudok paveldėjimą tik polimorfizmui įgyvendinti
  2. Naudok interfeisus vietoj klasių kur tai yra prasminga

[taisyti] Realizacija

[taisyti] Interfeisas

Kaip Jūs visi žinote, interfeisas yra esybė apibrežianti kokius pranešimus jai galima siųsti ir identifikuojama pagal savo vardą. Klasės santykiai su interfeisais Kiekviena klasė priklausomai nuo kalboje numatytų inkapsuliacijos lygių turi 3 ar 4 interfeisus (public, protected, default arba package access ir private). Toliau sakydamas klasės interfeisas turėsiu omeny public interfeisą.

[taisyti] Kontraktas

Jei neabstrakti klasė realizuoja interfeisą, joje turi būti interfeiso realizaciją, kuriai savitas ribotumas. Realizaciją įgyvendindama gryną idėją įneša į ją tikrovės apribojimus: skaičiavimų tikslumo apribojimus, būsenų (laukų) apibrėžimo aibės, algoritmus ir kt. Šitie apribojimai yra vadinami klasės kontraktu.

[taisyti] Paveldėjimas

Paveldėjimo mechanizmas sugalvotas polimorfizmui įgyvendinti: t.y. galimybei naudoti skirtingų klasių objektus, žinant tik tai kad jos realizuoja mums žinomą interfeisą.

Jei klasė realizuoja interfeisą, tai viskas ką ji paveldi yra public interfeisas.

Kai klasė išplėčia kitą klasę, ji be to kad paveldi kitos klasės interfeisą, gali naudotis (panaudojamumas! - privalumas) tėvinės klasės funkcionalumu. Kitaip sakant, vaiko klasė paveldi dalį realizacijos, o kartu su realizacija ir tėvinės klasės kontraktą, kuriuo įsipareigoja laikytis, kad nepažeistų tėvinės klasės funkcionalumo.

Pažeidimą įsivaizduoti visai paprasta: jūs paveldite iš dvimačio taško, galinčio egzistuoti tik x>0, y>0, spalvotu tašku, kuriam galimas y=0. Jei valkinėje, SpalvotasTaškas, klasėje nera perrašytas DvimatisTaškas metodas paskaičiuotiA(b) tai su b=0 DvimatisTaškas::paskaičiuotiA(0) įvyks dalybą iš nulio, kuri DvimatisTaškas klasėje būtų neįmanoma.

Jei nenorime būti suvaržyti kitos klasės kontrakto – nepaveldėkime iš jos. Kitaip tai skambą taip:

Principas 1: Naudok paveldėjimą tik polimorfizmui įgyvendinti

Bet, sakysite Jūs, mes laisvai galime perrašyti visą tėvinės realizaciją ir sukurti savo vaikinės klasės kontraktą ir busite teisūs:) Tačiau, tokiu atveju Jūs paveldite tik tėvinės klasės interfeisą ir nieko nepanaudojate. Dar blogiau, Jūs niekada nesate užtikrinti kad sekančioje tėvinės klasės versijoje kūrėjas neapibrėš papildomo metodo, kuris yra nesuderinamas su Jūsų vaikinės klasės kontraktu.

Principas 2a: Norėdamas polimorfizmo ir panaudojimo – paveldėk iš klasės ir prisilaikyk jos kontrakto, norėdamas tik polimorfizmo – paveldėk iš interfeiso

Apie kontrakto sąvoką turime prisiminti ir projektuodami interfeisus (ir klases). Kad mūsų interfeisai būtų kuo lankstesnį, neturėtume apriboti mūsų kodo naudotojų kontraktais, t.y. nurodyti klasių parametrais ir gražinamomis reikšmėmis klases.

Pricipas 2b: Geriau nurodyti funkcijų parametrus ir gražinamas reikšmes interfeisais.

Tačiau egzisuoja ir kiti objektinio projektavimo principai, kurie sako, kad klasės turi būti kuo paprastesnės ir atlikti tik konkrečias užduotis, todėl jei aklai seksime 2b principu mūsų programa turės klasių ir interfeisų beveik po lygiai.

Siūlau tokį šios problemos sprendimą: naudokime 2b ten kur yra jungiami du skirtingų žmonių kodo gabai arba du įsivaizduojami komponentai:) Naudokime 2b tam, kas, kaip dabar manome, bus panaudotą dar kartą.