Rýchla a jednoduchá schéma na urýchlenie vývoja rozsiahlych aplikácií Java zahŕňa použitie rozhraní. Rozhrania Java sú plánom funkčnosti obsiahnutej v pridruženom objekte.
Začlenením rozhraní do vášho budúceho projektu si všimnete výhody počas celého životného cyklu vášho vývojového úsilia. Technika kódovania na rozhrania a nie na objekty zvýši efektivitu vývojového tímu tým, že:
- Umožnenie vývojovému tímu rýchlo nadviazať interakcie medzi potrebnými objektmi bez toho, aby bolo potrebné včasné vymedzenie podporných objektov
- Umožnenie vývojárom sústrediť sa na svoje vývojové úlohy s vedomím, že integrácia už bola zohľadnená
- Poskytuje flexibilitu, aby bolo možné do existujúceho systému pridávať nové implementácie rozhraní bez veľkých úprav kódu
- Presadzovanie zmlúv dohodnutých členmi vývojového tímu s cieľom zabezpečiť, aby všetky objekty interagovali tak, ako boli navrhnuté
Prehľad
Pretože snahy o objektovo orientovaný vývoj zahŕňajú interakcie objektov, je nevyhnutné medzi týmito objektmi rozvíjať a presadzovať silné kontrakty. Technika kódovania rozhraní zahŕňa použitie rozhraní, a nie objektov, ako primárnej metódy komunikácie.
Tento článok predstaví používateľovi koncept kódovania rozhraní prostredníctvom jednoduchého príkladu. Nasleduje podrobný príklad, ktorý pomôže demonštrovať hodnotu tejto schémy vo väčšom systéme, ktorý si vyžaduje viacerých vývojárov. Než sa však dostaneme k ukážkovému kódu, pozrime sa na výhody kódovania do rozhraní.
Prečo kódovať rozhrania?
Rozhranie Java je zmluva o vývoji. Zaisťuje, že konkrétny objekt spĺňa danú množinu metód. Rozhrania sa používajú v celom Java API na špecifikáciu potrebných funkcií pre interakciu s objektom. Príklady použitia rozhrania sú mechanizmy spätného volania (Poslucháči udalostí
), vzory (Pozorovateľ
) a špecifikácie (Spustiteľné
, Serializovateľné
).
Kódovanie na rozhrania je technika, pomocou ktorej môžu vývojári vystaviť určité metódy objektu iným objektom v systéme. Vývojári, ktorí dostávajú implementácie týchto rozhraní, majú schopnosť kódovať rozhranie namiesto kódovania samotného objektu. Inými slovami, vývojári by napísali kód, ktorý neinteragoval priamo s objektom ako takým, ale skôr s implementáciou rozhrania tohto objektu.
Ďalším dôvodom na kódovanie do rozhraní a nie do objektov je to, že poskytuje vyššiu efektivitu v rôznych fázach životného cyklu systému:
- Dizajn: metódy objektu možno rýchlo určiť a zverejniť všetkým dotknutým vývojárom
- Rozvoj: kompilátor Java zaručuje, že všetky metódy rozhrania sú implementované so správnym podpisom a že všetky zmeny rozhrania sú okamžite viditeľné pre ostatných vývojárov.
- Integrácia: existuje schopnosť rýchleho spojenia tried alebo subsystémov dohromady vďaka ich dobre zavedeným rozhraniam
- Testovanie: rozhrania pomáhajú izolovať chyby, pretože obmedzujú rozsah možnej logickej chyby na danú podmnožinu metód
S touto technikou vývoja je spojená nejaká réžia kvôli požadovanej infraštruktúre kódu. Táto infraštruktúra obsahuje obe rozhrania pre interakcie medzi objektmi a vyvolávací kód na vytváranie implementácií rozhraní. Táto réžia je nepodstatná v porovnaní s ľahkosťou a výhodou používania rozhraní, ako je popísané.
Základný príklad
Pre ďalšie vysvetlenie koncepcie kódovania rozhraní som vytvoril jednoduchý príklad. Aj keď je tento príklad zjavne triviálny, demonštruje niektoré z výhod spomenutých vyššie.
Zvážte jednoduchý príklad triedy Auto
ktorý implementuje rozhranie Vozidlo
. Rozhranie Vozidlo
má jedinú metódu nazvanú štart ()
. Trieda Auto
implementuje rozhranie poskytnutím a štart ()
metóda. Ďalšia funkčnosť v Auto
triedy bola vynechaná kvôli lepšej prehľadnosti.
interface Vehicle {// Všetky implementácie vozidla musia implementovať metódu štart public void start (); } trieda Automobil implementuje vozidlo {// Vyžaduje sa na implementáciu vozidla public void start () {...}}
Po položení základov Auto
objekt, môžeme vytvoriť ďalší objekt s názvom Komorník
. Je to Komorník
je práca na začiatku Auto
a prines to patrónovi reštaurácie. The Komorník
objekt je možné písať bez rozhraní, a to nasledovne:
trieda komorník {verejné auto getCar (auto c) {...}}
The Komorník
objekt má metódu nazvanú getCar
že vráti a Auto
objekt. Tento príklad kódu spĺňa funkčné požiadavky systému, ale navždy spája Komorník
objekt s objektom Auto
. V tejto situácii sa o týchto dvoch objektoch hovorí, že sú Tesne spojené. The Komorník
objekt vyžaduje znalosť Auto
objekt a má prístup ku všetkým verejným metódam a premenným obsiahnutým v danom objekte. Najlepšie je vyhnúť sa takémuto tesnému spojeniu kódu, pretože to zvyšuje závislosti a znižuje flexibilitu.
Na kódovanie Komorník
objekt pomocou rozhraní, je možné použiť nasledujúcu implementáciu:
trieda Valet {verejné vozidlo getVehicle (vozidlo c) {...}}
Zatiaľ čo zmeny kódu sú pomerne malé - zmena referencií z Auto
do Vozidlo
- účinky na vývojový cyklus sú značné. Pomocou druhej implementácie sa Komorník
má vedomosti iba o metódach a premenných definovaných v dokumente Vozidlo
rozhranie. Akékoľvek ďalšie verejné metódy a údaje obsiahnuté v konkrétnej implementácii Vozidlo
používateľské rozhranie je skryté Vozidlo
objekt.
Táto jednoduchá zmena kódu zabezpečila správne utajenie informácií a implementáciu pred inými objektmi, a preto vylúčila možnosť, že vývojári použijú nežiaduce metódy.
Vytvára sa objekt rozhrania
Posledným problémom, ktoré je potrebné prediskutovať v súvislosti s touto technikou vývoja, je vytvorenie objektov rozhrania. Aj keď je možné vytvoriť novú inštanciu triedy pomocou Nový
operátor, nie je možné priamo vytvoriť inštanciu rozhrania. Ak chcete vytvoriť implementáciu rozhrania, musíte vytvoriť inštanciu objektu a vložiť ho do požadovaného rozhrania. Preto môže byť vývojár, ktorý vlastní kód objektu, zodpovedný za vytvorenie inštancie objektu aj vykonanie prenášania.
Tento proces vytvárania je možné dosiahnuť použitím a Továreň
vzor, v ktorom externý objekt nazýva statický createXYZ ()
metóda na a Továreň
a vráti rozhranie. Dá sa to dosiahnuť aj tým, že vývojár zavolá metódu na iný objekt a namiesto skutočnej triedy jej odovzdá rozhranie. Bolo by to obdobné ako pri schvaľovaní Vymenovanie
rozhranie namiesto a Vektor
alebo Hashtable
.
Podrobný príklad
Aby som demonštroval použitie tejto schémy na väčšom projekte, vytvoril som príklad plánovača schôdzky. Tento plánovač má tri hlavné komponenty: zdroje (konferenčná miestnosť a účastník schôdzky), výskyt (samotná schôdza) a plánovač (ten, kto udržiava kalendár zdrojov).
Predpokladajme, že tieto tri komponenty mali byť vyvinuté tromi rôznymi vývojármi. Cieľom každého vývojára by malo byť ustanoviť použitie jeho komponentu a zverejniť ho ostatným vývojárom v rámci projektu.
Zvážte príklad a Osoba
. A Osoba
môže implementovať množstvo metód, ale implementuje Zdroj
rozhranie pre túto aplikáciu. Vytvoril som Zdroj
rozhranie so všetkými potrebnými metódami prístupu pre všetky prostriedky použité v tomto príklade (zobrazené nižšie):
verejné rozhranie Zdroj {public String getID (); public String getName (); public void addOccurrence (Výskyt o); }
V tomto okamihu vývojár Osoba
Funkcionalita zverejnila rozhranie, pomocou ktorého majú všetci používatelia prístup k informáciám uloženým v Osoba
objekt. Kódovanie rozhrania pomáha zabezpečiť, aby žiadny vývojár nepoužíval Osoba
objekt nesprávne. Developer Plánovač
objekt môže teraz používať metódy obsiahnuté v Zdroj
rozhranie pre prístup k informáciám a funkciám potrebným na vytvorenie a údržbu harmonogramu systému Windows Osoba
objekt.
The Výskyt
Rozhranie obsahuje metódy potrebné na plánovanie Výskyt
. Môže to byť konferencia, cestovný plán alebo akákoľvek iná udalosť plánovania. The Výskyt
rozhranie je zobrazené nižšie:
verejné rozhranie Výskyt {public void setEndDatetime (dátum d); public Date getEndDatetime (); public void setStartDatetime (dátum d); public Date getStartDatetime (); public void setDescription (popis reťazca); public String getDescription (); public void addResource (zdroj r); public Resource [] getResources (); public boolean occursOn (dátum d); }
The Plánovač
kód používa Zdroj
rozhranie a Výskyt
rozhranie na udržanie harmonogramu zdroja. Všimnite si, že Plánovač
nemá žiadne vedomosti o subjekte, pre ktorý udržuje plán:
public class Scheduler implementuje Schedule {Vector schedule = null; public Scheduler () {schedule = new Vector (); } public void addOccurrence (Výskyt o) {schedule.addElement (o); } public void removeOccurrence (výskyt o) {schedule.removeElement (o); } public Occurrence getOccurrence (Dátum d) {Enumeration scheduleElements = schedule.elements (); Výskyt o = null; while (scheduleElements.hasMoreElements ()) {o = (Occurrence) scheduleElements.nextElement (); // V tomto jednoduchom príklade sa výskyt zhoduje s tým, či // je čas a čas začiatku schôdzky. Túto logiku // je možné podľa potreby skomplikovať. if (o.getStartDatetime () == d) {break; }} vratit o; }}
Tento príklad ukazuje výkon rozhraní vo vývojových fázach systému. Každý zo subsystémov má znalosti iba o rozhraní, cez ktoré musí komunikovať - nie sú potrebné žiadne znalosti o implementácii. Ak by každý zo stavebných prvkov vo vyššie uvedenom príklade mal byť ďalej vyvíjaný tímami vývojárov, ich úsilie by sa zjednodušilo kvôli presadzovaniu týchto zmlúv o rozhraní.
Záverečné úvahy o rozhraniach
Tento článok demonštroval niektoré výhody kódovania rozhraní. Táto technika umožňuje vyššiu efektivitu v každej fáze životného cyklu vývoja.
Počas fáz návrhu projektu umožňujú rozhrania rýchle nadviazanie požadovaných interakcií medzi objektmi. Objekty implementácie spojené s daným rozhraním je možné definovať po zadaní metód a požiadaviek pre dané rozhranie. Čím rýchlejšie dôjde k nadviazaniu interakcie, tým rýchlejšie môže vývojová fáza prejsť do vývoja.
Rozhrania poskytujú vývojárom možnosť vystaviť a obmedziť určité metódy a informácie na používateľov ich objektov bez zmeny povolení a vnútornej štruktúry samotného objektu. Použitie rozhraní môže pomôcť eliminovať otravné chyby, ktoré sa objavia pri integrácii kódu vyvinutého viacerými vývojovými tímami.
Presadzovanie zmlúv zabezpečuje rozhranie. Pretože sa na rozhraní všeobecne dohodne počas fázy návrhu projektu, vývojári majú možnosť sústrediť sa na svoje jednotlivé moduly bez obáv o moduly svojich kolegov. Integráciu týchto subsystémov zefektívňuje skutočnosť, že zmluvy sa už dodržiavajú počas fázy vývoja.
Na účely testovania je možné vytvoriť jednoduchý objekt ovládača na implementáciu dohodnutých rozhraní. Pomocou tohto objektu môžu vývojári pokračovať v práci s vedomím, že na prístup k objektu používajú správne metódy. Keď sú objekty nasadené v testovacom prostredí, triedy ovládačov sú nahradené triedami true, čo umožňuje testovanie objektu bez zmien kódu alebo vlastností.
Táto schéma poskytuje schopnosť ľahkého rozšírenia tohto systému; v našom príklade by sme mohli rozšíriť kód tak, aby obsahoval viac foriem zdrojov, ako sú konferenčné miestnosti a audio / video zariadenie. Akákoľvek ďalšia implementácia Zdroj
rozhranie zapadne do zavedeného mechanizmu bez úpravy existujúceho kódu. Rozsiahle projekty využívajúce túto schému by mohli byť navrhnuté a implementované takým spôsobom, že je možné pridať ďalšie funkcie bez zásadných úprav infraštruktúry. Ako príklad možno uviesť Konferenčná miestnosť
objekt bol vytvorený. Tento objekt implementuje Zdroj
rozhranie a môže komunikovať s Časový plán
a Výskyt
realizátorov bez zmeny infraštruktúry.
Ďalšou výhodou je centralizované umiestnenie kódu. Ak sa do systému majú pridať nové metódy Zdroj
všetky implementácie tohto rozhrania budú identifikované ako vyžadujúce zmenu. Tým sa zníži potreba vyšetrovania na určenie možného dopadu zmien rozhrania.
Okrem výhod pre vývoj predstavuje technika uvedená v tomto článku projektové riadenie so zárukou, že počas cyklu vývoja boli zavedené a presadzované interobjektové alebo medzisystémové komunikačné vzory. To znižuje riziko zlyhaní počas fázy integrácie a testovania projektu.