Programovanie

Inteligentnejší vývoj v prostredí Java

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íkje 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.

$config[zx-auto] not found$config[zx-overlay] not found