Programavimas

Dizainas su statiniais elementais

Nors „Java“ yra orientuota į objektą, ji nėra a grynas į objektą orientuota kalba. Viena iš priežasčių, kodėl „Java“ nėra orientuota vien į objektą, yra ta, kad ne viskas joje yra objektas. Pvz., „Java“ leidžia deklaruoti primityvių tipų kintamuosius (tarpt, plūdė, loginisir kt.), kurie nėra objektai. „Java“ turi statinius laukus ir metodus, kurie yra nepriklausomi ir atskirti nuo objektų. Šiame straipsnyje pateikiami patarimai, kaip naudoti statinius laukus ir metodus „Java“ programoje, tuo pačiu išlaikant objektu orientuotą dizainą.

Klasės „Java“ virtualioje mašinoje (JVM) gyvenimo trukmė turi daug panašumų su objekto tarnavimo laiku. Kaip objektas gali turėti būseną, vaizduojamą jo egzempliorių kintamųjų reikšmėmis, klasė gali turėti būseną, kurią vaizduoja jo klasės kintamųjų reikšmės. Kaip JVM, prieš vykdydamas inicializavimo kodą, egzempliorių kintamuosius nustato numatytosioms pradinėms reikšmėms, JVM prieš vykdant inicializavimo kodus nustato klasių kintamuosius numatytosioms pradinėms reikšmėms. Kaip ir objektai, klasės gali būti surinktos šiukšlės, jei veikianti programa jų nebepasako.

Nepaisant to, egzistuoja reikšmingi klasių ir objektų skirtumai. Bene svarbiausias skirtumas yra egzempliorių ir klasių metodų panaudojimo būdas: egzempliorių metodai yra (dažniausiai) dinamiškai susieti, tačiau klasių metodai - statiškai. (Trimis ypatingais atvejais egzempliorių metodai nėra dinamiškai susieti: privačių instancijų metodų iškvietimas, inic metodai (konstruktoriai) ir iškvietimai su super raktinis žodis. Daugiau informacijos žr. Ištekliai.)

Kitas skirtumas tarp klasių ir objektų yra duomenų slėpimo laipsnis, kurį suteikia privačios prieigos lygiai. Jei egzemplioriaus kintamasis yra paskelbtas privačiu, prie jo gali prisijungti tik egzempliorių metodai. Tai leidžia jums užtikrinti egzemplioriaus duomenų vientisumą ir padaryti objektus saugius. Likusi programos dalis negali tiesiogiai pasiekti tų egzempliorių kintamųjų, tačiau turi atlikti egzempliorių metodus, kad galėtų manipuliuoti egzempliorių kintamaisiais. Siekdami, kad klasė elgtųsi kaip gerai suprojektuotas objektas, galite padaryti klasės kintamuosius privačius ir apibrėžti klasių metodus, kurie jais manipuliuoja. Nepaisant to, tokiu būdu jūs negalite garantuoti gijų saugumo ar net duomenų vientisumo, nes tam tikros rūšies kodas turi specialią privilegiją, suteikiančią jiems tiesioginę prieigą prie privačių klasių kintamųjų: egzempliorių metodų ir net egzempliorių iniciatorių. kintamieji, gali tiesiogiai pasiekti tuos privačios klasės kintamuosius.

Taigi statiniai laukai ir klasių metodai, nors ir daugeliu atžvilgių panašūs į objektų egzempliorių laukus ir metodus, turi reikšmingų skirtumų, kurie turėtų turėti įtakos jų naudojimui projektuojant.

Klasių traktavimas kaip objektų

Kurdami „Java“ programas, tikriausiai susidursite su daugeliu situacijų, kuriose jaučiate objekto, veikiančio tam tikrais būdais, pavyzdžiui, klasės, poreikį. Pavyzdžiui, galite norėti objekto, kurio gyvenimas sutampa su klasės. Arba galite norėti objekto, kuris, kaip ir klasė, apsiriboja vieninteliu instancija nurodytoje vardo erdvėje.

Tokiose projektavimo situacijose, kaip ši, gali būti viliojanti sukurti klasę ir naudoti ją kaip objektą, norint apibrėžti klasės kintamuosius, paversti juos privačiais ir apibrėžti kai kuriuos viešus klasės metodus, kuriais manipuliuojama klasės kintamaisiais. Kaip ir objektas, tokia klasė turi būseną. Kaip ir gerai suprojektuotas objektas, taip ir būseną apibūdinantys kintamieji yra privatūs, o išorinis pasaulis gali paveikti šią būseną tik pasitelkdamas klasės metodus.

Deja, šiuo požiūriu egzistuoja tam tikros problemos. Kadangi klasių metodai yra statiškai susieti, jūsų klasė kaip objektas nepatiks polimorfizmo ir „upcasting“ lankstumo pranašumų. (Polimorfizmo ir dinaminio rišimo apibrėžimus žr. „Dizaino technikos“ straipsnyje „Kompozicija prieš paveldėjimą“.) Polimorfizmas yra įmanomas ir naudingas dinamiškai susiejant, tačiau klasės metodai nėra dinamiškai susieti. Jei kas nors priskirs jūsų klasę kaip objektą, jis negalės nepaisyti savo klasės metodus, deklaruodami to paties pavadinimo klasės metodus; jie galės tik paslėpti juos. Kai bus naudojamas vienas iš šių iš naujo apibrėžtų klasės metodų, JVM pasirinks metodo įgyvendinimą, kurį vykdys ne objekto klasė vykdymo metu, o kintamojo tipas kompiliavimo metu.

Be to, siūlų saugumas ir duomenų vientisumas, pasiektas kruopščiai įgyvendinant klasės metodus savo klasėje, yra tarsi iš šiaudų pastatytas namas. Jūsų siūlų sauga ir duomenų vientisumas bus garantuoti tol, kol visi naudos klasės metodus, kad manipuliuotų būsena, saugoma klasės kintamuosiuose. Tačiau neatsargus ar nenuoseklus programuotojas, pridėdamas vieną egzemplioriaus metodą, kuris tiesiogiai pasiekia jūsų privačios klasės kintamuosius, gali netyčia šnibždėti ir pūsti bei išpūsti jūsų siūlų saugumą ir duomenų vientisumą.

Dėl šios priežasties mano pagrindinė klasių kintamųjų ir klasių metodų gairė yra:

Nelaikykite klasių kaip daiktais.

Kitaip tariant, nekurkite statinių laukų ir klasės metodų taip, tarsi jie būtų objekto egzempliorių laukai ir metodai.

Jei norite tam tikros būsenos ir elgesio, kurio gyvenimas sutampa su klasės gyvenimu, venkite klasės kintamųjų ir klasės metodų, kad imituotumėte objektą. Vietoj to sukurkite faktinį objektą ir naudokite klasės kintamąjį, kad laikytumėte nuorodą į jį, ir klasės metodus, suteikiančius prieigą prie objekto nuorodos. Jei norite įsitikinti, kad vienoje vardų erdvėje egzistuoja tik vienas tam tikros būsenos ir elgesio atvejis, nebandykite sukurti klasės, kuri imituoja objektą. Vietoj to sukurkite pavienis - objektas, kuriame yra tik vienas egzempliorius vienoje pavadinimo vietoje.

Taigi, kam naudingi klasės nariai?

Mano nuomone, geriausia mąstysena, kurią reikia ugdyti kuriant „Java“ programas, yra objektų, objektų, objektų mąstymas. Susitelkite į puikių objektų kūrimą ir galvokite apie klases pirmiausia apie objektų brėžinius - struktūrą, kurioje apibrėžiate egzempliorių kintamuosius ir egzempliorių metodus, kurie sudaro jūsų gerai suprojektuotus objektus. Be to, galite galvoti apie klases, kurios teikia keletą specialių paslaugų, kurių objektai negali suteikti arba negali suteikti taip elegantiškai. Galvok apie klases kaip:

  • tinkama vieta apibrėžti „naudingumo metodus“ (metodai, įvedantys ir išvedantys tik perduodant parametrus ir grąžinimo vertę)
  • būdas kontroliuoti prieigą prie objektų ir duomenų

Naudingumo metodai

Metodai, kuriais manipuliuojama ar nenaudojama objekto ar klasės būsena, kurią aš vadinu „naudingumo metodais“. Naudingumo metodai tik grąžina tam tikrą vertę (arba reikšmes), apskaičiuotą tik iš metodui perduotų duomenų kaip parametrų. Turėtumėte padaryti tokius metodus statiškus ir priskirti juos prie klasės, labiausiai susijusios su metodo teikiama paslauga.

Naudingumo metodo pavyzdys yra String copyValueOf (char [] duomenys) klasės metodas Stygos. Šis metodas sukuria jo išvestį, tipo grąžinimo vertę Stygos, tik pagal jo įvesties parametrą, masyvą chars. Nes copyValueOf () nenaudoja ir neveikia jokio objekto ar klasės būsenos, tai yra naudingas metodas. Kaip ir visi naudingi metodai, copyValueOf () yra klasės metodas.

Taigi vienas pagrindinių klasės metodų naudojimo būdų yra naudingumo metodai - metodai, kurie grąžina išvestį, apskaičiuotą tik iš įvesties parametrų. Kiti klasės metodų naudojimo būdai apima klasės kintamuosius.

Duomenų slėpimo klasės kintamieji

Vienas iš pagrindinių objektinio programavimo priesakų yra duomenų slėpimas - apriboti prieigą prie duomenų, kad būtų sumažinta priklausomybė tarp programos dalių. Jei tam tikros duomenų dalies prieinamumas yra ribotas, šie duomenys gali pasikeisti nesulaužant tų programos dalių, kurios negali pasiekti duomenų.

Jei, pavyzdžiui, objektas reikalingas tik tam tikros klasės egzemplioriams, nuorodą į jį galima saugoti privačios klasės kintamajame. Tai suteikia visiems šios klasės atvejams patogią prieigą prie to objekto - egzemplioriai tiesiog naudoja jį tiesiogiai - bet joks kitas kodas niekur kitur programoje negali jo pasiekti. Panašiai galite naudoti prieigą prie paketo ir apsaugotus klasės kintamuosius, kad sumažintumėte objektų, kuriuos turi bendrinti visi paketo ir poklasio nariai, matomumą.

Viešosios klasės kintamieji yra kita istorija. Jei viešosios klasės kintamasis nėra galutinis, tai yra visuotinis kintamasis: tas bjaurus konstruktas, kuris yra duomenų slėpimo priešingybė. Niekada negalima pateisinti viešosios klasės kintamojo, nebent jis yra galutinis.

Galutiniai viešosios klasės kintamieji, nesvarbu, ar jie yra primityvūs, ar objektiniai, yra naudingi. Primityvių tipų arba tipų kintamieji Stygos yra tiesiog konstantos, kurios apskritai padeda padaryti programas lankstesnes (lengviau keičiamas). Kodas, kuriame naudojamos konstantos, lengviau pakeisti, nes vienoje vietoje galite pakeisti pastoviąją vertę. Vieši galutinių nuorodų tipų klasės kintamieji leidžia suteikti visuotinę prieigą prie objektų, kurie reikalingi visame pasaulyje. Pavyzdžiui, System.in, System.outir System.err yra viešieji galutinės klasės kintamieji, suteikiantys visuotinę prieigą prie standartinių įvesties išvesties ir klaidų srautų.

Taigi pagrindinis būdas peržiūrėti kintamuosius yra mechanizmas, ribojantis kintamųjų ar objektų prieinamumą (reiškia, paslėpti). Derindami klasės metodus su klasės kintamaisiais, galite įgyvendinti dar sudėtingesnę prieigos politiką.

Klasės metodų naudojimas su klasės kintamaisiais

Be veikimo kaip naudingumo metodų, klasės metodai gali būti naudojami kontroliuojant prieigą prie objektų, saugomų klasės kintamuosiuose, visų pirma norint kontroliuoti, kaip objektai yra kuriami ar tvarkomi. Du tokio tipo klasės metodo pavyzdžiai yra „setSecurityManager“ () ir „getSecurityManager“ () klasės metodai Sistema. Programos saugos vadybininkas yra objektas, kurio, kaip ir standartinių įvesties, išvesties ir klaidų srautų, reikia daugelyje skirtingų vietų. Skirtingai nuo standartinių įvesties / išvesties srauto objektų, nuoroda į saugos tvarkyklę nėra saugoma viešame galutinės klasės kintamajame. Saugos tvarkyklės objektas saugomas privačios klasės kintamajame, o „set and get“ metodai įgyvendina specialią objekto prieigos politiką.

„Java“ saugos modelis saugos vadybininkui nustato specialius apribojimus. Iki „Java 2“ (anksčiau vadintos „JDK 1.2“) programa pradėjo savo gyvenimą be saugos vadybininko („getSecurityManager“ () grįžo niekinis). Pirmasis skambutis „setSecurityManager“ () įsteigė apsaugos vadovą, kuriam vėliau nebuvo leista pasikeisti. Visi paskesni skambučiai „setSecurityManager“ () suteiktų saugumo išimtį. „Java 2“ programoje visada paleidžiamas saugos valdytojas, tačiau panašus į ankstesnes versijas „setSecurityManager“ () metodas leis jums pakeisti saugos vadybininką ne daugiau kaip vieną kartą.

Saugos vadybininkas pateikia gerą pavyzdį, kaip klasės metodai gali būti naudojami kartu su privačių klasės kintamaisiais, norint įgyvendinti specialią prieigos politiką objektams, kuriems nurodyti klasės kintamieji. Be naudingumo metodų, galvokite apie klasės metodus kaip apie priemones, skirtas nustatyti specialią prieigos politiką objektų nuorodoms ir klasių kintamuosiuose saugomiems duomenims.

Gairės

Pagrindinis šiame straipsnyje pateiktas patarimas yra:

Nelaikykite klasių kaip daiktais.

Jei jums reikia objekto, padarykite objektą. Apribokite klasių kintamųjų ir metodų naudojimą apibrėždami naudingumo metodus ir įgyvendindami specialių tipų prieigos strategijas objektams ir primityviems tipams, saugomiems klasės kintamuosiuose. Nors „Java“ nėra gryna į objektą orientuota kalba, vis dėlto „Java“ yra orientuota į objektą ir tai turėtų atspindėti jūsų dizainas. Galvok objektus.

Kitą mėnesį

Ateinančio mėnesio Dizaino technika straipsnis bus paskutinis iš šio stulpelio. Netrukus pradėsiu rašyti knygą, paremtą „Design Techniques“ medžiaga, Lanksti „Java“ir įdės tą medžiagą į savo svetainę. Taigi sekite tą projektą ir atsiųskite man atsiliepimų. Po mėnesio ar dviejų pertraukos grįšiu „JavaWorld“ ir Saulės pasaulis su nauja skiltimi, orientuota į Jini.

Prašymas dėl skaitytojo dalyvavimo

Aš skatinu jūsų komentarus, kritiką, pasiūlymus, liepsnas - visokius atsiliepimus - apie šioje skiltyje pateiktą medžiagą. Jei su kažkuo nesutinkate arba turite ką pridėti, praneškite man.

Galite dalyvauti diskusijų forume, skirtame šiai medžiagai, įvesti komentarą per formą, esančią straipsnio apačioje, arba atsiųsti man el. Laišką tiesiogiai naudodamiesi nuoroda, pateikta žemiau esančiame mano biografijoje.

Billas Vennersas profesionaliai rašė programinę įrangą 12 metų. Silicio slėnyje įsikūręs jis teikia programinės įrangos konsultavimo ir mokymo paslaugas „Artima Software Company“ vardu. Per daugelį metų jis sukūrė programinę įrangą buitinės elektronikos, švietimo, puslaidininkių ir gyvybės draudimo pramonei. Jis programavo daugeliu kalbų daugelyje platformų: surinkimo kalba įvairiuose mikroprocesoriuose, C „Unix“, C ++ „Windows“, „Java“ internete. Jis yra knygos „Inside the Java Virtual Machine“, kurią išleido McGraw-Hill, autorius.
$config[zx-auto] not found$config[zx-overlay] not found