Programiranje

Oblikovanje s statičnimi elementi

Čeprav je Java v veliki meri objektno naravnana, ni čisto objektno usmerjen jezik. Eden od razlogov, da Java ni povsem objektno usmerjena, je, da ni vse v njej objekt. Na primer, Java vam omogoča, da prijavite spremenljivke primitivnih tipov (int, plovec, logičnoitd.), ki niso predmeti. In Java ima statična polja in metode, ki so neodvisne in ločene od predmetov. Ta članek vsebuje nasvete o uporabi statičnih polj in metod v programu Java, hkrati pa ohranja objektno usmerjen fokus v svojih načrtih.

Življenjska doba razreda v navideznem računalniku Java (JVM) ima veliko podobnosti z življenjsko dobo predmeta. Tako kot ima lahko objekt stanje, predstavljeno z vrednostmi spremenljivk primerka, lahko tudi razred ima stanje, ki ga predstavljajo vrednosti spremenljivk razreda. Tako kot JVM pred izvedbo inicializacijske kode nastavi spremenljivke primerka na privzete začetne vrednosti, JVM pred izvedbo inicializacijske kode nastavi spremenljivke razreda na privzete začetne vrednosti. Tako kot predmeti lahko tudi na razrede zbiramo smeti, če se nanje izvajana aplikacija ne sklicuje več.

Kljub temu obstajajo pomembne razlike med razredi in predmeti. Morda je najpomembnejša razlika način, kako se prikličejo metode instance in razreda: metode instance (večinoma) so dinamično vezane, metode razredov pa so statično vezane. (V treh posebnih primerih metode primerkov niso dinamično vezane: priklic metod zasebnega primerka, priklic datoteke v metode (konstruktorji) in klici z super ključna beseda. Za več informacij glejte Viri.)

Druga razlika med razredi in predmeti je stopnja skrivanja podatkov, ki jo odobrijo ravni zasebnega dostopa. Če je spremenljivka primerka razglašena za zasebno, lahko do nje dostopajo samo metode primerka. To vam omogoča, da zagotovite celovitost podatkov primerka in naredite predmete varne pred nitmi. Preostali del programa ne more neposredno dostopati do teh spremenljivk primerka, ampak mora skozi metode primerka manipulirati s spremenljivkami primerka. V prizadevanju, da se razred obnaša kot dobro zasnovan objekt, lahko spremenljivke razreda naredite zasebne in določite metode razredov, ki z njimi manipulirajo. Kljub temu na ta način ne dobite tako dobrega zagotovila varnosti niti niti celo integritete podatkov, ker ima določena vrsta kode poseben privilegij, ki jim omogoča neposreden dostop do spremenljivk zasebnega razreda: metod primerov in celo inicializatorjev primerkov spremenljivke, lahko neposredno dostopajo do spremenljivk zasebnega razreda.

Tako imajo statična polja in metode razredov, čeprav so v mnogih pogledih podobna poljem in metodam predmetov, pomembne razlike, ki bi morale vplivati ​​na način njihove uporabe pri načrtovanju.

Obravnavanje pouka kot predmetov

Ko načrtujete programe Java, boste verjetno naleteli na številne situacije, v katerih boste čutili potrebo po objektu, ki na nek način deluje kot razred. Morda boste na primer želeli predmet, katerega življenjska doba se ujema z življenjem razreda. Lahko pa si želite predmeta, ki se tako kot razred omeji na enega samega primer v danem imenskem prostoru.

V takih situacijah oblikovanja je lahko skušnjava ustvariti razred in ga uporabiti kot objekt, da bi definirali spremenljivke razreda, jih naredili zasebne in opredelili nekatere metode javnega razreda, ki manipulirajo s spremenljivkami razreda. Tako kot predmet ima tak razred tudi stanje. Tako kot dobro zasnovan objekt so tudi spremenljivke, ki definirajo stanje, zasebne in zunanji svet lahko na to stanje vpliva le s sklicevanjem na metode razreda.

Na žalost pri tem pristopu "razred-kot-objekt" obstajajo nekatere težave. Ker so metode razredov statično vezane, vaš razred kot objekt ne bo užival prožnosti polimorfizma in nadgradnje. (Za definicije polimorfizma in dinamične vezave glejte članek Tehnike oblikovanja, Sestava proti dedovanju.) Polimorfizem je omogočen in uporaben za posodobitev z dinamično vezavo, vendar metode razredov niso dinamično vezane. Če nekdo podrazredi vaš razred-kot-objekt, tega ne bo mogel preglasiti metode razreda z razglasitvijo metod razreda z istim imenom; lahko bodo le skrij njim. Ko se prikliče ena od teh redefiniranih metod razreda, bo JVM izbral izvedbo metode, ki se ne bo izvajala po razredu predmeta med izvajanjem, temveč po vrsti spremenljivke v času prevajanja.

Poleg tega sta varnost niti in celovitost podatkov, doseženi z natančnim izvajanjem metod razreda v vašem razredu kot predmetu, podobna hiši, zgrajeni iz slame. Varnost niti in celovitost podatkov bosta zagotovljeni, dokler vsi uporabljajo metode razreda za manipulacijo stanja, shranjenega v spremenljivkah razreda. Toda nepreviden ali brezvestni programer bi lahko z dodatkom ene instance, ki neposredno dostopa do spremenljivk vašega zasebnega razreda, nehote prepihnil in napihnil ter odpihnil varnost niti in integriteto podatkov.

Iz tega razloga je moje glavno vodilo glede spremenljivk razreda in metod razredov:

Razredov ne obravnavajte kot predmete.

Z drugimi besedami, ne načrtujte s statičnimi polji in metodami razreda, kot da bi bili primerki polja in metode predmeta.

Če želite nekaj stanja in vedenja, katerih življenjska doba se ujema z razredom, se izogibajte uporabi spremenljivk razreda in metod razreda za simulacijo predmeta. Namesto tega ustvarite dejanski objekt in uporabite spremenljivko razreda, da shranite sklic nanj, in metode razreda, da zagotovite dostop do reference predmeta. Če želite zagotoviti, da v enem imenskem prostoru obstaja samo en primerek nekega stanja in vedenja, ne poskušajte oblikovati razreda, ki simulira objekt. Namesto tega ustvarite a singleton - objekt, za katerega je zagotovljeno, da ima samo en primerek na imenski prostor.

Za kaj so torej člani razreda primerni?

Po mojem mnenju je najboljša miselnost, ki jo je treba gojiti pri oblikovanju programov Java, razmišljati o predmetih, predmetih, predmetih. Osredotočite se na oblikovanje odličnih predmetov in razmislite o razredih predvsem kot načrti predmetov - strukturi, v kateri določite spremenljivke primerkov in metode primerkov, ki sestavljajo vaše dobro oblikovane predmete. Poleg tega si lahko o predavanjih predstavljate nekaj posebnih storitev, ki jih predmeti ne morejo ponuditi ali pa jih ne morejo ponuditi tako elegantno. Predavanja si predstavljajte kot:

  • ustrezno mesto za opredelitev "uporabnostnih metod" (metode, ki sprejemajo vhodne podatke in zagotavljajo izhodne podatke samo prek posredovanih parametrov in vrnjene vrednosti)
  • način nadzora dostopa do predmetov in podatkov

Uporabne metode

Metode, ki ne manipulirajo ali uporabljajo stanja predmeta ali razreda, imenujem »uporabne metode«. Pomožne metode samo vrnejo neko vrednost (ali vrednosti), izračunane izključno iz podatkov, ki so bili metodi posredovani kot parametri. Takšne metode bi morali narediti statične in jih uvrstiti v razred, ki je najbolj povezan s storitvijo, ki jo metoda ponuja.

Primer uporabne metode je String copyValueOf (podatki char []) metoda pouka Vrvica. Ta metoda ustvari izhodno vrednost, vrnjeno vrednost tipa Vrvica, samo iz njegovega vhodnega parametra, niz chars. Ker copyValueOf () niti ne uporablja niti ne vpliva na stanje katerega koli predmeta ali razreda, je uporabna metoda. In, kot bi morale biti vse uporabne metode, copyValueOf () je razredna metoda.

Torej je eden glavnih načinov uporabe razrednih metod uporabnostne metode - metode, ki vrnejo izhod, izračunan izključno iz vhodnih parametrov. Druge uporabe metod razredov vključujejo spremenljivke razreda.

Spremenljivke razreda za skrivanje podatkov

Eden temeljnih zapovedi objektno usmerjenega programiranja je skrivanje podatkov - omejevanje dostopa do podatkov, da se zmanjša odvisnost med deli programa. Če ima določen del podatkov omejeno dostopnost, se lahko ti podatki spremenijo, ne da bi zlomili tiste dele programa, ki ne morejo dostopati do podatkov.

Če na primer objekt potrebujejo samo primerki določenega razreda, se lahko sklic nanj shrani v spremenljivko zasebnega razreda. To daje vsem primerkom tega razreda priročen dostop do tega predmeta - primerki ga preprosto uporabljajo neposredno - vendar nobena druga koda kjer koli drugje v programu ne more do njega. Na podoben način lahko uporabite spremenljivke za dostop do paketov in zaščitene spremenljivke razreda, da zmanjšate vidnost predmetov, ki jih morajo deliti vsi člani paketa in podrazredi.

Spremenljivke javnega razreda so druga zgodba. Če spremenljivka javnega razreda ni dokončna, je to globalna spremenljivka: ta grd konstrukt, ki je antiteza skrivanju podatkov. Za spremenljivko javnega razreda nikoli ni nobenega opravičila, razen če je dokončna.

Končne spremenljivke javnega razreda, bodisi primitivni tip bodisi sklic na objekt, imajo koristen namen. Spremenljivke primitivnih tipov ali vrste Vrvica so preprosto konstante, ki na splošno pomagajo narediti programe bolj prilagodljive (lažje spremenljive). Kodo, ki uporablja konstante, je lažje spremeniti, ker lahko na enem mestu spremenite konstantno vrednost. Javne spremenljivke končnega razreda referenčnih tipov omogočajo globalni dostop do predmetov, ki so potrebni po vsem svetu. Na primer, System.in, System.out, in System.err so javne spremenljivke končnega razreda, ki dajejo globalni dostop do standardnih vhodnih izhodov in tokov napak.

Tako je glavni način za prikaz spremenljivk razreda mehanizem za omejevanje dostopnosti (torej skrivanja) spremenljivk ali predmetov. Ko kombinirate metode razredov s spremenljivkami razreda, lahko uveljavite še bolj zapletene politike dostopa.

Uporaba metod razreda s spremenljivkami razreda

Razen tega, da delujejo kot pomožne metode, se metode razredov lahko uporabljajo za nadzor dostopa do predmetov, shranjenih v spremenljivkah razreda, zlasti za nadzor nad tem, kako se predmeti ustvarjajo ali upravljajo. Dva primera tovrstne metode predavanj sta setSecurityManager () in getSecurityManager () metode pouka Sistem. Upravitelj varnosti za aplikacijo je objekt, ki je, tako kot standardni vhodni, izhodni in napačni tokovi, potreben na številnih različnih mestih. V nasprotju s standardnimi predmeti vhodno / izhodnega toka pa sklic na upravitelja varnosti ni shranjen v javni spremenljivki končnega razreda. Objekt upravitelja varnosti je shranjen v spremenljivki zasebnega razreda, metode set in get pa izvajajo posebno politiko dostopa do predmeta.

Javin varnostni model postavlja posebno omejitev za upravitelja varnosti. Pred Java 2 (prej znan kot JDK 1.2) je aplikacija začela svoje življenje brez upravitelja varnosti (getSecurityManager () vrnil nič). Prvi klic setSecurityManager () ustanovil upravitelja varovanja, ki ga po tem ni smel več spreminjati. Vsi nadaljnji klici na setSecurityManager () bi prinesla varnostno izjemo. V Javi 2 se aplikacija vedno zažene z upravljalnikom varnosti, vendar podobno kot v prejšnjih različicah, setSecurityManager () metoda vam bo omogočila spremembe varnostnik, največ enkrat.

Upravitelj zaščite ponuja dober primer, kako je mogoče metode razredov uporabiti skupaj s spremenljivkami zasebnega razreda za izvajanje posebne politike dostopa za predmete, na katere se sklicujejo spremenljivke razreda. Razen uporabnostnih metod si metode razredov predstavljajte tudi kot sredstvo za vzpostavljanje posebnih politik dostopa do referenc objektov in podatkov, shranjenih v spremenljivkah razreda.

Smernice

Glavna točka nasveta v tem članku je:

Razredov ne obravnavajte kot predmete.

Če potrebujete predmet, ga naredite. Omejite uporabo spremenljivk in metod razreda na določanje uporabnostnih metod in izvajanje posebnih vrst pravilnikov dostopa za predmete in primitivne tipe, shranjene v spremenljivkah razreda. Čeprav Java ni zgolj objektno usmerjen jezik, je kljub temu v veliki meri predmetno usmerjen in to bi morali odražati vaši modeli. Mislite na predmete.

Naslednji mesec

Naslednji mesec Tehnike oblikovanja članek bo zadnji v tem stolpcu. Kmalu bom začel pisati knjigo, ki temelji na gradivu Design Techniques, Prilagodljiva Java, in bo to gradivo objavljal na moji spletni strani, ko grem. Torej, prosim, sledite temu projektu in mi pošljite povratne informacije. Po mesecu ali dveh premora se vrnem ob JavaWorld in Sončni svet z novo rubriko, osredotočeno na Jini.

Zahteva za sodelovanje bralcev

Spodbujam vaše pripombe, kritike, predloge, plamene - vse vrste povratnih informacij - o gradivu, predstavljenem v tej kolumni. Če se z nečim ne strinjate ali imate kaj dodati, mi sporočite.

Lahko sodelujete v forumu za razprave, posvečen temu gradivu, vnesete komentar prek obrazca na dnu članka ali mi pošljete neposredno po povezavi v spodnji biografiji.

Bill Venners že 12 let profesionalno piše programsko opremo. S sedežem v Silicijevi dolini ponuja svetovanje in izobraževanje o programski opremi pod imenom Artima Software Company. Z leti je razvil programsko opremo za potrošniško elektroniko, izobraževanje, polprevodniške in življenjske zavarovalne panoge. Programiral je v številnih jezikih na številnih platformah: montažni jezik na različnih mikroprocesorjih, C na Unixu, C ++ na Windows, Java na spletu. Je avtor knjige Inside the Java Virtual Machine, ki jo je založil McGraw-Hill.
$config[zx-auto] not found$config[zx-overlay] not found