PC Press
O nama
O nama
Pretplata
O nama
Postanite saradnik PC-ja
Kontakt sa redakcijom
PC Press
Novi broj
Novi broj   
Pretrazivanje
Arhiva
Arhiva   
PC Online
PC Plus   
Specijalna izdanja
Softver Softver
PC #37 : Jul / Avgust 1998 Knjiga 50 godina racunarstva u Srbiji

 Naslovna  Sadržaj 
Aleksandar Petrović  

Crtanjem do programa

Visual CASE omogućava da do gotove aplikacije dođete samo uz pomoć miša.

Stingray Software je veliko ime u svetu programiranja. Do sada su proizvodili samo biblioteke za C++ i Javu, a sada je pred nama CASE alat koji kao izlaz daje C++/MFC kod. C++ tržište je dugo odolevalo CASE alatima – kao da se smatralo da programer koji se odluči za C++ razvojnu platformu, želi da zadrži kontrolu nad svakim aspektom razvoja programa (što je uglavnom tačno) i da mu ne treba bilo kakva pogodnost ili olakšanje koji se nude u drugim razvojnim alatima (što uglavnom nije tačno).

Sada duvaju i drugi vetrovi: iako nije stvaran sa idejom uklapanja u RAD okruženja, simbioza C++-a i RAD alata se pokazala prilično uspešnom (Optima++, C++Builder), a i pobornik „stare škole“, Visual C++, postaje sve ugodniji prema programeru. Ukratko, došlo je vreme da se i u C++ svetu razmišlja o CASE alatima.

Miš umesto tastature

Stingray je pre nekoliko meseci kupio firmu Rogue Wave, još jednog proizvođača objektnih biblioteka, a rezultat tog spajanja je i Visual CASE, primer onoga što se može učiniti Stingray ekstenzijama MFC-a. Duh Objective Toolkit-a, biblioteke zadužene za proširenje korisničkog interfejsa je stalno prisutan, a verovatno su u izradi korišćene usluge i drugih biblioteka ovog proizvođača, recimo Objective Diagram-a i Objective Edit-a.

Trka između veličine diska i veličine razvojnih alata je, čini se, završena: čak i puna instalacija programa kao što je Visual C++ neće oduzeti previše prostora na današnjim diskovima. I pored toga, lepo je videti potpuno funkcionalan alat koji zajedno sa help fajlovima i primerima zauzima samo 11 MB. Prvi start pokazuje okruženje slično Developer Studio-u, radna površina u velikom prozoru sa desne strane, hijerarhijski pogled sa leve strane, a da biste shvatili za šta služe elementi korisničkog interfejsa, moramo se upoznati sa filozofijom Visual CASE-a.

Osnova rada u Visual CASE-u su UML (Unified Modeling Language) dijagrami, standardni način za definisanje klasa i odnosa među njima – razlika je samo u tome što je dijagram u Visual CASE-u „živ“, ne predstavlja crtež na papiru već nešto na osnovu čega se generiše standardni C++ tekst programa. Visual CASE se dobro snalazi sa različitim tumačenjima reči „klasa“ u jeziku C++ – dijagrami su podeljeni na dijagrame klasa, dijagrame struktura i dijagrame interfejsa. Šta opisuju dijagrami klasa i struktura, jasno je po imenu, za dijagrame interfejsa ne postoji pandan u C++ jeziku.

To bi trebalo da budu apstraktne klase koje definišu samo pure virtual funkcije, ali ne postoji nijedan mehanizam u jeziku C++ koji bi programeru zabranio da u takvu klasu stavi običnu funkciju. Slično C++-u, Visual CASE ne ograničava pravljenje interfejsa bilo kakvim pravilima, sem napomene u help fajlovima da se bilo šta osim pure virtual funkcija ne preporučuje. Takođe, moguće je putem dijagrama definisati i različite tipove klasa i njihovu međusobnu interakciju (nasleđivanje, sadržavanje...). Postoje i dijagrami za mapiranje klasa (predstavljenih dijagramima) u cpp i h fajlove na disku; oni se kasnije prevode korišćenjem kompajlera.

Predefinisani dijagrami

Osnovna namena Visual CASE-a je rad na projektu „od nule“. Kako se složeniji program ne može zamisliti bez dodatnih biblioteka ili sprege sa operativnim sistemom, Visual CASE obezbeđuje set dijagrama koji pokrivaju kompletnu MFC biblioteku, ATL (Stingray tvrdi da je Visual CASE prvi CASE alat koji podržava ATL) i pravljenje COM objekata. Kupci Objective Grid-a i Objective Toolkit-a će u Visual CASE-u naći podršku za rad sa ovim bibliotekama.

Alat može da se koristi i kao podrška za razvoj i održavanje postojećih programa: pri startovanju aplikacije pojavljuje se dijalog koji pored opcije za kreiranje novog projekta nudi i Reverse Engineered Project, koji se može otvoriti u direktorijumu ciljnog (C++) projekta ili na nekom drugom mestu. Posle izbora direktorijuma i imena projekta, na red dolazi navođenje fajlova koji ga čine, da bi se formirali dijagrami klasa. Kako se definicije klasa mahom nalaze u .h fajlovima (zaglavljima), inicijalno je ponuđeno parsiranje ovog tipa datoteka.

Proces prevođenja arhitekture programa u grafički oblik ovim nije gotov: Visual CASE zahteva da se sve globalne deklaracije zaokruže makroima, kako bi bile vidljive posle parsiranja. Po završetku parsiranja klase su složene u hijerarhijskom prikazu nalik onome iz Visual C++-a; treba ih „ručno“ prevući u radni prostor, pazeći na međuzavisnost – Visual CASE ne dozvoljava da se na radni prostor postavi dijagram u kome je klasa A izvedena iz klase B, ako klasa B već ne postoji na radnom prostoru.

Treći način rada sa Visual CASE-om je Round-Trip Engineering, koji uključuje stalnu promenu radnog alata: projekat se može početi u Visual CASE-u, generisani kod se može dalje obrađivati u Visual C++-u, da bi se pri povratku u Visual CASE promene učitale u dijagram klasa ili poništile.

Početak rada

Radni prostor Visual CASE-a je podeljen na dva dela: veći prozor sadrži jedan ili više dijagrama klasa ili modula, dok se hijerarhijski prikaz sa leve strane zove Project Control Centar; pored sadržaja koji se može videti i u desnom prozoru, on sadrži prikaz bibilotečkih klasa koje se mogu uključiti u projekat, prikaze modula i dijagrama klasa uključenih u projekat itd.

Bilo da se izabere reverse-engineering ili nov projekat, počinjete u praznom prozoru za dijagrame. Reverse-engineering se sastoji od opisane procedure, dok je rad „od nule“ drugačiji: kako se veći projekat može sastojati od više različitih klasa, korisno je uvesti više „listova“ u koje se dijagrami smeštaju.

Imena „listova“ postaju čvorovi u hijerarhijskom prikazu sa leve strane, što olakšava povezivanje klasa čiji se dijagrami nalaze na različitim listovima: napravite klasu na jednom listu, a kada vam ona zatreba na nekom drugom listu (pravite drugu klasu koja nasleđuje prvu, ili sadrži objekat tipa prve klase), dovoljno je da iz „stabla“ sa leve strane na „list“ prevučete ono što vam treba. Biće kreiran duplikat koji je funkcionalno identičan polaznoj klasi.

Kao crtanje

Kreiranje klasa podseća na rad u programima za crtanje: sa toolbar-a se odabere tip klase koju treba kreirati (najčešće je to obična (Simple), ali može biti i, recimo, šablonizovana), klikne se na prazan deo željenog „lista“ sa dijagramima i Visual CASE kreira novi dijagram klase sa podrazumevanim imenom. Dijagram je pravougaonik podeljen na tri vertikalna dela, od kojih je najviši deo rezervisan za ime klase, dok ostala dva dela sadrže članice i metode klase.

Dimenzije pravougaonika se menjaju pomoću „ručki“ (crnih kvadratića) koji se pojavljuju na uglovima i sredinama stranica dijagrama kada je selektovan, a pošto podrazumevano ime najčešće ne odgovara potrebama programera, najčešća opcija je dvoklik na dijagram klase, koji predstavlja prečicu za Properties. Dijalog nudi mnoštvo opcija od kojih mnoge kriju ono što se obično obavlja u editoru: tip klase je moguće promeniti bez obzira na inicijalno podešavanje, moguće je birati između klasa, struktura i interfejsa, a u dijalogu se nalaze i opcije vezane za ActiveX i COM programe...

Najvažnije su stranice u dijalogu koje nose nazive Attributes i Operations. Attributes se odnosi na promenljive – članice klase, a Operations opisuje funkcije članice klase i sadrži editor pomoću koga se kuca konkretan kod funkcije. U skladu sa „programiramo mišem“ filozofijom, do pisanja koda se dolazi zaobilazno: treba kliknuti na Semantics, da bi se otvorio prozor editora. U editoru se kuca samo program – parametri vezani za funkciju (ulazni parametri, povratna vrednost, tip funkcije (static, virtual itd) definišu se u dijalogu. Ako je klasa izvedena iz MFC klase CCmdTarget, moguće je definisati i neku od Windows poruka na koju će funkcija odgovarati.

Klase i njihovi odnosi

List C++ Code Generation omogućava deklariranje makroa i funkcija potrebnih za interni rad MFC-a (DECLARE_DYNCREATE, serijalizacija etc). Na ovom može da se zatraži i kreiranje uobičajenih funkcija: „operator =“, kopi konstruktor i sl. Kako klase često nisu „pusta ostrva“ u programu, treba definisati i njihove interakcije, koje se biraju klikom na odgovarajuću strelicu toolbar-a. Posle izbora strelice, treba mišem spojiti dve klase za koje se definiše odnos.

Strelice su aktivan deo dijagrama, pa dvoklik na njih prikazuje dijalog sa podešavanjima. Kakav će to dijalog biti zavisi od tipa veze između dve klase: u slučaju nasleđivanja dijalog će nuditi opcije za definisanje tipa nasleđivanja (public, protected...) i parametre za inicijalizaciju bazne klase, dok je sadržavanje objekata jedne klase u drugoj sasvim drugačija priča: pored definisanja imena promenljive i načina pristupa, moguće je definisati i pristup preko pointera ili reference, početnu vrednost, a posebno je zanimljiva opcija sa kojom se određuje broj promenljivih u klasi – ako je broj veći od jedan, automatski se nudi i izbor MFC kontejnerske klase koja će čuvati taj niz promenljivih (CList ili CArray).

Pomenuli smo izvođenje iz klase CCmdTarget. Visual CASE sadrži predefinisanu hijerarhiju MFC klasa, koje se ubacuju u projekat – treći „list“ kontrolnog centra (hijerarhijskog prikaza sa leve strane). Pored najčešće upotrebljavanog MFC-a, tu je i podrška za ATL biblioteku, MFC COM interfejsi, podrška za Stingray biblioteke Objective Toolkit i Objective Grid, kao i šabloni za Windows aplikacije, sa kojima se jednostavno kreće u pravljenje tipičnih Windows programa (MFC MDI i SDI, dijalog aplikacija, DLL...) Klase se sa dijagrama prevlače na radnu površinu; dobijaju plavi okvir, kako biste ih razlikovali od ostatka dijagrama.

Visual CASE poseduje „znanje“ o standardnim klasama, što znači da će definisanjem relacije između novostvorene i neke bazne klase, nova klasa automatski dobiti neke metode i uklopiti se u MFC okruženje. Kreiranje klasa i njihovih međuzavisnosti je pola posla. S obzirom na specifičnosti jezika C++ (koji ponekad izgleda kao da je ciljno pravljen da što više oteža projektovanje ovakvih alata), treba definisati smeštanje deklaracija i implementacija klasa u fajlove, te međuzavisnost tih fajlova (#include).

Mapiranje klasa

Da biste mapirali klase u fajlove, treba da napravite jedan ili više „listova“ koji će sadržati simbole fajlova. U njih ubacujete dijagrame koji predstavljaju fajlove, a postoji tri tipa dijagrama: „h“, za zaglavlja, „C++“ za implementaciju klase, te „&“ koji može sadržavati i zaglavlje i implementaciju. Pri postavljanju dijagrama na list, definiše se i ime fajla koji predstavlja, a mapiranje između fajlova se vrši prevlačenjem sa levog na desni panel.

Visual CASE pruža pomoć prikazujući u drugom listu komandnog centra sve klase koje nisu mapirane u fajlove (klasa mora biti dva puta mapirana – jednom za deklaraciju, drugi put za implementaciju). Omogućeno je jednostavno upravljanje izgledom projekta na disku, kroz definisanje logičkih celina za koje se pri generisanju koda otvaraju posebni direktorijumi. Određivanje međusobnih veza između fajlova (#include) vrši se kao i kod klasa – promenom posebne vrste strelica.

Mapiranje klasa u fajlove je poslednja stepenica pre generisanja koda, o kojem se malo toga može reći – izborom opcije Generate code iz Round-trip menija dijagrami se pretvaraju u C++ kod, koji je u Visual C++ poželjno učitati uz pomoć posebnog čarobnjaka koji se instalira u okruženje zajedno za Visual CASE-om. Dalji rad sa generisanim kodom je nezavisan, a moguća je dvosmerna veza između dijagrama i koda: kod se može prepraviti u editoru i ponovo parsirati u klase, ili se promene mogu vršiti na dijagramu, uz ponovno generisanje koda.

Pro et contra

Ocenjivati C++ CASE alat nije nimalo zahvalno, pošto se radi o pristupu programiranju koji je relativno nepoznat – ako programer ne želi da se prilagodi ovakvom okruženju i traži od njega da se ponaša kao konvencionalni alat na kome je radio, možda je bolje da se i ne upušta u avanturu sa Visual CASE-om. Ipak, alatu se može uputiti i nekoliko principijelnih zamerki.

Najveći problem Visual CASE-a je „mladost“ ovog alata, koji još uvek pati od dečijih bolesti. Ako zanemarimo povremenu sporost u nekim operacijama i povremene (na sreću, ne mnogo česte) padove, prva stvar koja se primeti je potpuni nedostatak Undo opcije – neke akcije je nemoguće poništiti na elegantan i intuitivan način, pa se ispostavlja da je lakše deo posao uraditi ponovo nego ispravljati.

Daleko su veći problemi koncepcijske prirode: mnogo potencijalnih korisnika bi ovaj proizvod verovatno koristilo za analizu već postojećih projekata, što je, bar deklarativno, podržano u Visual CASE-u. Problem sa upotrebom ovog alata je njegova nesposobnost da prepozna bilo kakvu deklaraciju koja ne pripada nekoj klasi, što je pristup koji možda može da prođe kod Jave, ali kod C++-a sigurno ne. Rešenje je ručna pretraga svih fajlova i zatvaranje globalnih varijabli i deklaracija u posebne makroe, što zna da bude zamoran posao.

Zamerke možemo uputiti i nedovršenosti korisničkog interfejsa, kome kao da fali „poliračnje“, Do nekih uobičajenih akcija se dolazi preko previše klikova na razne tastere, a današnji programi su nas navikli na više udobnosti – neshvatljivo je zašto je nemoguće menjanje imena funkcije samo preko ulaska u dijalog za podešavanje cele klase i probijanja kroz još dve ili tri stranice u tom dijalogu. CASE alat bi morao da pruža veću udobnost u popunjavanju polja u dijalogu (recimo, da prepoznaje upravo napravljene tipove i omogući njihovo lako biranje u zavisnosti od konteksta)...

Ozbiljnu zamerku upućujemo konceptu pisanja funkcije – kao da su programeri namerno favorizovali upotrebu miša nad tastaturom, pa je samo pisanje funkcija (do koga najzad mora da dođe) praktično neupotrebljivo – editor je smešten u modal dijalog, iz koga je nemoguće pogledati ostale članice klase, o help-u nema ni pomisli, a ni editor nije čudo udobnosti.

Ukratko, Visual CASE je dobar za generalni dizajn programa, ali će se editovanje finkcija ipak najverovatnije odvijati u paketu Developer Studio ili nekom drugom alatu. Za verziju 2.0 bismo poželeli Visual CASE integrisan u Developer Studio, u kome bi se jednim klikom prelazilo između editora, help-a i dijagrama klasa... Do te verzije treba probati i ovo što je sad pred nama – Visual CASE krije dosta lepih iznenađenja!