Greita ir paprasta schema, skirta paspartinti didelio masto „Java“ programų kūrimą, apima sąsajų naudojimą. „Java“ sąsajos yra susietame objekte esančių funkcijų planas.
Įtraukdami sąsajas į kitą projektą, pastebėsite naudą per visą savo kūrimo ciklą. Sąsajų, o ne objektų kodavimo technika pagerins kūrėjų komandos efektyvumą:
- Leisti kūrimo komandai greitai nustatyti sąveiką tarp reikalingų objektų, neverčiant anksti apibrėžti palaikančių objektų
- Leisti kūrėjams sutelkti dėmesį į savo kūrimo užduotis žinant, kad į integraciją jau buvo atsižvelgta
- Užtikrinamas lankstumas, kad naujus sąsajų diegimus būtų galima įtraukti į esamą sistemą be didelių modifikacijų
- Vykdyti sutartis, dėl kurių susitarė kūrimo komandos nariai, kad visi objektai sąveikautų taip, kaip suprojektuota
Apžvalga
Kadangi į objektą orientuotos plėtros pastangos apima objektų sąveiką, būtina sukurti ir vykdyti tvirtas sutartis tarp tų objektų. Sąsajų kodavimo technika apima sąsajų, o ne objektų, naudojimą kaip pagrindinį bendravimo metodą.
Šiame straipsnyje pateikiamas paprasto pavyzdžio vartotojas su sąsajų kodavimo samprata. Toliau bus pateiktas išsamus pavyzdys, padedantis parodyti šios schemos vertę didesnėje sistemoje, kuriai reikalingi keli kūrėjai. Vis dėlto prieš eidami prie kodo pavyzdžio, pažvelkime į sąsajų kodavimo pranašumus.
Kodėl koduojamas sąsajos?
„Java“ sąsaja yra kūrimo sutartis. Tai užtikrina, kad konkretus objektas atitinka nurodytą metodų rinkinį. Sąsajos naudojamos visoje „Java“ API nurodant būtiną funkciją objekto sąveikai. Sąsajos naudojimo pavyzdžiai yra atgalinio ryšio mechanizmai (Renginių klausytojai
), modeliai (Stebėtojas
) ir specifikacijos (Bėgama
, Serijinis
).
Kodavimas į sąsajas yra technika, kuria naudodamiesi kūrėjai gali atskleisti tam tikrus objekto metodus kitiems sistemos objektams. Kūrėjai, gaunantys šių sąsajų diegimą, turi galimybę koduoti sąsają vietoj kodavimo pačiame objekte. Kitaip tariant, kūrėjai rašys kodą, kuris tiesiogiai nesusietų su objektu, o būtent su to objekto sąsajos įgyvendinimu.
Kita priežastis koduoti sąsajas, o ne objektus yra ta, kad ji suteikia didesnį efektyvumą įvairiuose sistemos gyvavimo ciklo etapuose:
- Dizainas: objekto metodus galima greitai nurodyti ir paskelbti visiems paveiktiems kūrėjams
- Plėtra: „Java“ kompiliatorius garantuoja, kad visi sąsajos metodai įgyvendinami teisingu parašu ir kad visi sąsajos pakeitimai yra iškart matomi kitiems kūrėjams
- Integracija: yra galimybė greitai sujungti klases ar posistemes dėl jų gerai sukurtų sąsajų
- Testavimas: sąsajos padeda išskirti klaidas, nes jos apriboja galimos logikos klaidos apimtį tam tikru metodų rinkiniu
Dėl reikalingos kodo infrastruktūros yra keletas papildomų išlaidų, susijusių su šia kūrimo technika. Ši infrastruktūra apima abi sąsajas, skirtas sąveikai tarp objektų, ir iškvietimo kodą, kad būtų sukurtos sąsajos. Ši pridėtinė vertė yra nereikšminga, palyginti su paprastu ir naudingu sąsajų naudojimu, kaip aprašyta.
Pagrindinis pavyzdys
Norėdamas toliau paaiškinti sąsajų kodavimo sampratą, sukūriau paprastą pavyzdį. Nors šis pavyzdys yra akivaizdžiai trivialus, jis parodo kai kuriuos aukščiau paminėtus privalumus.
Apsvarstykite paprastą klasės pavyzdį Automobilis
kad įgyvendina sąsają Transporto priemonė
. Sąsaja Transporto priemonė
turi vieną metodą, vadinamą pradžia ()
. Klasė Automobilis
įdiegs sąsają pateikdamas pradžia ()
metodas. Kitas funkcionalumas Automobilis
klasė aiškumo sumetimais buvo palikta.
sąsaja Transporto priemonė {// Visose transporto priemonės versijose turi būti įdiegtas pradžios metodas public void start (); } klasės automobilio padargai Transporto priemonė {// Reikalinga norint įgyvendinti transporto priemonės viešąjį negaliojančią pradžią () {...}}
Padėjęs pamatus Automobilis
objektą, galime sukurti dar vieną objektą, vadinamą Valet
. Tai yra Valet
darbas pradėti Automobilis
ir atneškite jį restorano globėjui. Valet
objektą galima rašyti be sąsajų taip:
klasės „Valet“ {viešasis automobilis „getCar“ (automobilis c) {...}}
Valet
objektas turi vadinamąjį metodą „getCar“
kuris grąžina a Automobilis
objektas. Šis kodo pavyzdys tenkina sistemos funkcinius reikalavimus, tačiau jis visam laikui susieja Valet
objektas su Automobilis
. Šioje situacijoje sakoma, kad yra du objektai sandariai sujungtas. Valet
objektui reikalingos žinios apie Automobilis
objektą ir turi prieigą prie visų viešųjų metodų ir kintamųjų, esančių tame objekte. Geriausia vengti tokio griežto kodo sujungimo, nes tai padidina priklausomybę ir sumažina lankstumą.
Norėdami koduoti Valet
naudojant sąsajas, gali būti naudojamas toks įgyvendinimas:
klasės „Valet“ {viešųjų transporto priemonių „getVehicle“ (transporto priemonė c) {...}}
Nors kodo pakeitimai yra gana nedideli - nuorodos keičiamos iš Automobilis
į Transporto priemonė
- poveikis vystymosi ciklui yra didelis. Naudodamas antrąjį diegimą, Valet
turi žinių tik apie programoje apibrėžtus metodus ir kintamuosius Transporto priemonė
sąsaja. Bet kokie kiti viešieji metodai ir duomenys, esantys konkrečiame programos įgyvendinime Transporto priemonė
sąsaja yra paslėpta nuo Transporto priemonė
objektas.
Šis paprastas kodo pakeitimas užtikrino tinkamą informacijos slėpimą ir įgyvendinimą iš kitų objektų, todėl pašalino galimybę, kad kūrėjai naudos nepageidaujamus metodus.
Sąsajos objekto kūrimas
Paskutinis klausimas, kurį reikia aptarti atsižvelgiant į šią kūrimo techniką, yra sąsajos objektų kūrimas. Nors galima sukurti naują klasės egzempliorių naudojant naujas
operatoriaus, negalima tiesiogiai sukurti sąsajos egzemplioriaus. Norėdami sukurti sąsajos diegimą, turite iš karto sukurti objektą ir perduoti jį į norimą sąsają. Todėl kūrėjas, kuriam priklauso objekto kodas, gali būti atsakingas tiek už objekto egzemplioriaus sukūrimą, tiek už liejimą.
Šį kūrimo procesą galima pasiekti naudojant a Gamykla
šablonas, kuriame išorinis objektas vadina statinį sukurtiXYZ ()
metodas a Gamykla
ir grąžina sąsają. Tai taip pat galima pasiekti, jei kūrėjas iškviečia metodą kitame objekte ir perduoda jam sąsają, o ne tikrąją klasę. Tai būtų analogiška praėjimui Surašymas
sąsaja vietoj a Vektorius
arba „Hashtable“
.
Išsamus pavyzdys
Siekdamas parodyti šios schemos naudojimą didesniame projekte, sukūriau susitikimų planavimo priemonės pavyzdį. Šį planuoklį sudaro trys pagrindiniai komponentai: ištekliai (konferencijų salė ir posėdžio dalyvis), įvykis (pats susitikimas) ir planavimo priemonė (tas, kuris prižiūri išteklių kalendorių).
Tarkime, kad šiuos tris komponentus turėjo sukurti trys skirtingi kūrėjai. Kiekvieno kūrėjo tikslas turėtų būti nustatyti jo komponento naudojimą ir paskelbti jį kitiems projekto kūrėjams.
Apsvarstykite a pavyzdį Asmuo
. A Asmuo
gali įgyvendinti daugybę metodų, tačiau įgyvendins Ištekliai
šios programos sąsaja. Aš sukūriau Ištekliai
sąsaja su visais reikalingais visų šiame pavyzdyje naudojamų išteklių prieigos metodais (parodyta žemiau):
viešoji sąsaja Ištekliai {public String getID (); viešoji eilutė getName (); public void addOccurrence (įvykis o); }
Šiuo metu kūrėjas Asmuo
funkcionalumas paskelbė sąsają, kuria naudodamiesi visi vartotojai gali pasiekti Asmuo
objektas. Kodavimas į sąsają padeda užtikrinti, kad jokie kūrėjai nenaudoja Asmuo
objektas neteisingai. Kūrėjas Tvarkaraštis
objektas dabar gali naudoti metodus, esančius Ištekliai
sąsaja prieigai prie informacijos ir funkcijų, kurių reikia norint sukurti ir palaikyti Asmuo
objektas.
Pasitaikymas
sąsajoje yra metodai, būtini planuoti Pasitaikymas
. Tai gali būti konferencija, kelionės planas ar bet koks kitas planavimo renginys. Pasitaikymas
sąsaja rodoma žemiau:
viešoji sąsaja „Occurrence“ {public void setEndDatetime (data d); public Date getEndDatetime (); public void setStartDatetime (data d); public Data getStartDatetime (); public void setDescription (eilutės aprašymas); public String getDescription (); public void addResource (šaltinis r); viešasis šaltinis [] getResources (); viešoji loginė reikšmė įvyksta On (Data d); }
Tvarkaraštis
kodas naudoja Ištekliai
sąsaja ir Pasitaikymas
sąsaja išlaikyti išteklių tvarkaraštį. Atkreipkite dėmesį, kad Tvarkaraštis
neturi žinių apie subjektą, kurio tvarkaraštį taiko:
public class Tvarkaraštis įgyvendina Tvarkaraštį {Vektoriaus tvarkaraštis = null; public Scheduler () {tvarkaraštis = naujas vektorius (); } public void addOccurrence (įvykis o) {tvarkaraštis.addElement (o); } public void removeOccurrence (įvykis o) {tvarkaraštis.removeElement (o); } public Occurrence getOccurrence (data d) {Surašymo tvarkaraštisElementai = tvarkaraštis.elementai (); Pasitaikymas o = nulis; while (scheduleElements.hasMoreElements ()) {o = (Occurrence) tvarkaraščio.nextElement (); // Šiame paprastame pavyzdyje įvykis sutampa, jei // data laikas yra susitikimo pradžios laikas. Ši logika // gali būti sudėtingesnė, jei reikia. if (o.getStartDatetime () == d) {pertrauka; }} return o; }}
Šis pavyzdys rodo sąsajų galią sistemos kūrimo etapuose. Kiekvienas iš posistemių žino tik apie sąsają, per kurią turi bendrauti - žinių apie įgyvendinimą nereikia. Jei kiekvieną iš aukščiau pateikto pavyzdžio sudedamųjų dalių toliau plėtotų kūrėjų komandos, jų pastangos būtų supaprastintos dėl šių sąsajos sutarčių vykdymo.
Paskutinės mintys apie sąsajas
Šis straipsnis parodė kai kuriuos sąsajų kodavimo pranašumus. Ši technika leidžia didesnį efektyvumą kiekviename kūrimo gyvavimo ciklo etape.
Projekto projektavimo metu sąsajos leidžia greitai nustatyti norimą objektų sąveiką. Su tam tikra sąsaja susieti įgyvendinimo objektai gali būti apibrėžti nurodžius tos sąsajos metodus ir reikalavimus. Kuo greičiau nustatoma sąveika, tuo greičiau projektavimo etapas gali pereiti į plėtrą.
Sąsajos suteikia kūrėjams galimybę atskleisti ir apriboti tam tikrus metodus ir informaciją savo objektų vartotojams, nekeičiant paties objekto teisių ir vidinės struktūros. Sąsajų naudojimas gali padėti pašalinti nemalonias klaidas, kurios atsiranda integravus kelių kūrėjų komandų sukurtą kodą.
Sutarčių vykdymą užtikrina sąsaja. Kadangi sąsaja paprastai sutariama projekto projektavimo etape, kūrėjai turi galimybę sutelkti dėmesį į savo atskirus modulius, nesijaudindami dėl savo kolegų modulių. Šių posistemių integravimą efektyvina tai, kad sutartys jau buvo vykdomos per visą kūrimo etapą.
Testavimo tikslais galima sukurti paprastą tvarkyklės objektą, kad būtų įdiegtos sutartos sąsajos. Naudodamiesi šiuo objektu, kūrėjai gali tęsti savo darbą žinodami, kad naudoja tinkamus prieigos prie objekto metodus. Kai objektai yra išdėstyti bandymo aplinkoje, tvarkyklių klasės pakeičiamos tikrosiomis klasėmis, todėl objektą galima patikrinti be kodo ar ypatybių pakeitimų.
Ši schema suteikia galimybę lengvai išplėsti šią sistemą; savo pavyzdyje galėtume išplėsti kodą, įtraukdami daugiau išteklių rūšių, tokių kaip posėdžių salės ir garso / vaizdo įranga. Bet koks papildomas programos įgyvendinimas Ištekliai
sąsaja bus pritaikyta nustatytam mechanizmui nekeičiant esamo kodo. Didelio masto projektai, naudojantys šią schemą, galėtų būti suprojektuoti ir įgyvendinti taip, kad būtų galima pridėti papildomų funkcijų be didelių infrastruktūros pakeitimų. Pavyzdžiui, Konferencijų salė
objektas buvo sukurtas. Šis objektas įgyvendina Ištekliai
sąsają ir gali sąveikauti su Tvarkaraštis
ir Pasitaikymas
įgyvendintojai nekeičiant infrastruktūros.
Kitas privalumas yra centralizuota kodo vieta. Jei prie programos reikia pridėti naujų metodų Ištekliai
sąsaja, bus nustatyta, kad visus šios sąsajos diegimus reikia keisti. Tai sumažins tyrimą, kurio reikia norint nustatyti galimą sąsajos pakeitimų poveikį.
Be kūrimo naudos, šiame straipsnyje pateikta technika užtikrina projekto valdymą užtikrindama, kad tarpobjektiniai ar tarpsisteminiai komunikacijos modeliai buvo sukurti ir įgyvendinti per visą kūrimo ciklą. Tai sumažina gedimų riziką integruojant ir išbandant projektą.