object identification objectifying (oliointi) Luokkien (olioiden) tunnistaminen Luonteeltaan takaisinmallinnusta ohjelmia ei muuteta Ensimmäinen vaihe konvertoitaessa proseduraalisia (tai muita ei-olio-ohjelmia) olio-ohjelmiksi konversio voi olla täydellistä tai epätäydellistä Tunnistaminen voi olla automaattista ei riipu sovellusalueesta sovellusalueen tuntemukseen perustuvaa ei onnistu täysin automaattisesti Muita tunnistuksen kohteita: suunnittelumallit (design pattern) aspektit konversio tunnistaminen (takaisinmallinnus) TTY Ohjelmistotekniikka 1 Olioparadigman ominaisuuksien tunnistaminen Luokkien tunnistaminen tietueet ja unionit (vaihtelevat tietueet) moduulit (abstraktit tietotyypit) Periytymisen tunnistaminen tietueen sisällä määritelty tietue tai unioni tyypin muunnokset toisiaan muistuttavat tietorakenteet Operaatioiden liittäminen luokkiin viittaukset globaaleihin muuttujiin muodolliset parametrit ja paluutyypit operaatioiden ominaisuuksien tarkastelu (käsiteanalyysi) Monimuotoisuuden (polymorphism) tunnistaminen monivalintalauseet (case, switch) funktio-osoittimet ja aliohjelman välittäminen parametrina TTY Ohjelmistotekniikka 2 Luokkien tunnistaminen tietueista typedef struct { float re; float im; } complex; class complex { private: float re; float im; TTY Ohjelmistotekniikka 3 Luokkien tunnistaminen moduuleista DEFINITION MODULE StackManager; TYPE Stack; PROCEDURE Push ( S: Stack; X: CARDINAL ); PROCEDURE Pop ( S: Stack ): CARDINAL; PROCEDURE IsEmpty ( S: Stack ): BOOLEAN; PROCEDURE Init ( VAR S: Stack ); END StackManager; DEFINITION MODULE DataRepository; TYPE Stack; TYPE Queue; PROCEDURE Push ( S: Stack; X: CARDINAL ); PROCEDURE Pop ( S: Stack ): CARDINAL; PROCEDURE Enque ( Q: Queue; X: CARDINAL ); PROCEDURE Deque ( Q: Queue ); PROCEDURE Init ( VAR S: Stack; VAR Q: Queue ); Ohjelmien ylläpito ja END evoluutio DataRepository; TTY Ohjelmistotekniikka 4 Periytymisen tunnistaminen typedef struct { union { int student_number; int teacher_office; char name [ 30 ]; class person { char name [ 30 ]; class student: public person { int student_number; } person; class teacher: public person { int teacher_office; type personkind = ( student, teacher, ); persontype = record Huom! name: array [ 1..30 ] of Char; Lueteltu case persontag: personkind of tyyppi student: ( studentnumber: Integer ); teacher: ( teacheroffice: Integer ); TTY Ohjelmistotekniikka 5 end; Operaatioiden liittäminen luokkiin Globaaleihin muuttujiin perustuva tunnistaminen Tyyppeihin perustuva tunnistaminen parametrien ja funktion paluuarvojen tyypit Käsiteanalyysi ja sen soveltaminen tunnistamisessa TTY Ohjelmistotekniikka 6 1
Globaalit muuttujat #define SIZE 100 int stack [ SIZE ]; int top; int [ SIZE ]; int first, last; struct list_type { int elem; struct list_type *next; } list; void inits ( ) { /* top */ } int isemptys ( ) { /* top */ } int isfulls ( ) { /* top */ } void push ( int i ) { /* stack, top */ } int pop ( ) { */ stack, top */ } void initq ( ) { /* first, last */ } int isemptyq ( ) { /* first, last */ } int isfullq ( ) {/* first, last */ } void ( int i ) { /*, last */ } int ( ) { /*, first */ } void initl ( ) { /* list */ } void add ( int i ) { /* list */ } void remove ( int i ) { /* list */ } TTY Ohjelmistotekniikka 7 stack push pop top inits isemptys isfulls push pop Globaalit muuttujat (lopputulos) list initl add remove last initq isemptyq isfullq first initq isemptyq isfullq TTY Ohjelmistotekniikka 8 Globaalit muuttujat (kaksijakoinen verkko) top tack inits isemptys isfulls t push s pop first last q initq inemptyq isfullq list initl add remove TTY Ohjelmistotekniikka 9 typedef struct stack_t { item_type item; struct stack_t *next; } stack_type; void push ( stack_type type **p, item_type type s ) { stack_type *q; /* allocate space for q */ q->item = s; q->next = *p; *p = q; } Parametrit ja paluutyypit TTY Ohjelmistotekniikka 10 Käsiteanalyysi Konteksti C = ( O, A, R ) O: olioiden äärellinen joukko A: attribuuttien äärellinen joukko R: binaarirelaatio O:n ja A:n välillä Sovitukset ( X ) = { a A o X: ( o, a ) R } etsii olioille attribuutit esim. ( { kissat, apinat } ) = { karvapeitteinen } ( Y ) = { o O a Y: ( o, a ) R } etsii attribuuteille oliot esim. ( { meressä elävä } ) = { delfiinit, valaat } TTY Ohjelmistotekniikka 11 Esimerkki kontekstista kissat koirat älykäs meressä elävä nelijalkainen karvapeitteinen kädellinen delfiinit apinat ihmiset valaat TTY Ohjelmistotekniikka 12 2
Lisää käsiteanalyysista Käsite koostuu oliojoukosta ja attribuuttijoukosta mahdollisimman suuri kokoelma sellaisia olioita, joilla on yhteiset attribuutit esim. ( { kissat, koirat }, { nelijalkainen, karvapeitteinen } ) on käsite esim. ( { kissat, apinat }, { karvapeitteinen } ) ei ole käsite Käsiteristikko käsitteiden osittainen järjestys esim. ( { delfiinit, valaat }, { älykäs, meressä elävä } ) ( { apinat, delfiinit, ihmiset, valaat }, { älykäs } ) Erikoistapaukset huippu-käsite: kaikki oliot pohja-käsite: kaikki attribuutit TTY Ohjelmistotekniikka 13 Jakamattomien käsitteiden laskenta ( ( { kissat } ) ) = ( { nelijalkainen, karvapeitteinen } ) = { kissat, koirat } ( ( { koirat } ) ) = ( { nelijalkainen, karvapeitteinen } ) = { kissat, koirat } ( ( { delfiinit } ) ) = ( { älykäs, meressä elävä } ) = { delfiinit, valaat } ( ( { apinat } ) ) = ( { karvapeitteinen, älykäs, kädellinen } ) = { apinat } ( ( { ihmiset } ) ) = ( { älykäs, kädellinen } ) = { apinat, ihmiset } ( ( { valaat } ) ) = ( { älykäs, meressä elävä } ) = { delfiinit, valaat } TTY Ohjelmistotekniikka 14 Jakamattomat käsitteet: Löydetyt käsitteet c 0 = ( { kissat, koirat }, { nelijalkainen, karvapeitteinen } ) c 1 = ( { apinat }, { karvapeitteinen, älykäs, kädellinen } ) c 2 = ( { delfiinit, valaat }, { älykäs, meressä elävä } ) c 3 = ( { apinat, ihmiset }, { älykäs, kädellinen } ) Johdetut käsitteet: c 4 = c 0 c 1 = ( { kissat, koirat, apinat }, { karvapeitteinen } ) c 5 = c 1 c 2 = ( { apinat, delfiinit, valaat, ihmiset }, { älykäs } ) TTY Ohjelmistotekniikka 15 c 0 = ( { kissat, koirat }, { nelijalkainen, karvapeitteinen } ) c 1 = ( { apinat }, { karvapeitteinen, älykäs, kädellinen } ) c 2 = ( { delfiinit, valaat }, { älykäs, meressä elävä } ) c 3 = ( { apinat, ihmiset }, { älykäs, kädellinen } ) työlista = [ (c 0, c 1 ), (c 0, c 2 ), (c 0, c 3 ), (c 1, c 2 ), (c 2, c 3 ) ] c 4 = c 0 c 1 = ( { kissat, koirat, apinat }, { karvapeitteinen } ) työlista = [ (c 0, c 2 ), (c 0, c 3 ), (c 1, c 2 ), (c 2, c 3 ), (c 2, c 4 ), (c 3, c 4 ) ] c 0 c 2 = huippu työlista = [ (c 0, c 3 ), (c 1, c 2 ), (c 2, c 3 ), (c 2, c 4 ), (c 3, c 4 ) ] c 0 c 3 = huippu työlista = [ (c 1, c 2 ), (c 2, c 3 ), (c 2, c 4 ), (c 3, c 4 )] c 5 = c 1 c 2 = ( { apinat, delfiinit, valaat, ihmiset }, { älykäs } ) työlista = [ (c 2, c 3 ), (c 2, c 4 ), (c 3, c 4 ), (c 0, c 5 ), (c 4, c 5 ) ] c 2 c 3 = c 5 työlista = [ (c 2, c 4 ), (c 3, c 4 ), (c 0, c 5 ), (c 4, c 5 ) ] c 2 c 4 = huippu työlista = [ (c 3, c 4 ), (c 0, c 5 ), (c 4, c 5 ) ] c 3 c 4 = huippu työlista = [ (c 0, c 5 ), (c 4, c 5 ) ] c 0 c 5 = huippu ja c 4 c 5 = huippu työlista = Ø Johdettujen käsitteiden etsintä TTY Ohjelmistotekniikka 16 Käsiteristikko huippu ( { kaikki oliot }, Ø ) c5 ( { delfiinit, apinat, ihmiset, valaat }, { älykäs } ) c4 ( { kissat, koirat, apinat }, huippu { karvapeitteinen } ) c 4 c 5 c3 ( { apinat, ihmiset }, { älykäs, kädellinen } ) c2 ({d delfiinit, it valaat t} }, c 3 { älykäs, meressä elävä } ) c 0 c1 ( { apinat }, c 1 c 2 { karvapeitteinen, älykäs, kädellinen } ) c0 ( { kissat, koirat }, { nelijalkainen, karvapeitteinen } ) pohja pohja ( Ø, { kaikki attribuutit } ) Käsiteanalyysin soveltaminen ohjelmiin 1. Muodosta konteksti oliojoukko: ohjelman aliohjelmat attribuuttijoukko: aliohjelmien ominaisuuksia ominaisuudet kuvaavat esim. aliohjelmien ja tietorakenteiden välisiä suhteita 2. Rakenna käsiteristikko 3. Etsi käsitteille ryhmittelyt TTY Ohjelmistotekniikka 17 TTY Ohjelmistotekniikka 18 3
struct stack { struct { Esimerkkiohjelma struct stack inits () { /* stack */ } struct initq ( ) { /* */ } int isemptys ( struct stack *s ) { /* stack */ } int isemptyq ( struct *q ) { /* */ } void push ( struct stack *s, int i ) { /* stack */ } void ( struct *q, int i ) { /* */ } int pop ( struct stack *s ) { */ stack */ } int ( struct *q ) { /* */ } TTY Ohjelmistotekniikka 19 Esimerkkiohjelman konteksti paluutyyppinä stack paluutyyppinä parametrina stack parametrina viittaa stack:n kenttiin viittaa :n kenttiin inits initq isemptys isemptyq push pop TTY Ohjelmistotekniikka 20 Käsiteristikko huippu ( { kaikki oliot }, Ø ) huippu c5 ( { initq, isemptyq,, }, { käyttää :n kenttiä } ) c 4 c 5 c4 ( { inits, isemptys, push, pop }, { käyttää stack:n kenttiä } ) c 0 c 2 c 1 c 3 c3 ( { isemptyq,, }, { parametrina, käyttää :n kenttiä } ) c2 ( { isemptys, push, pop }, pohja { parametrina stack, käyttää stack:n kenttiä } ) c1 ( { initq }, Ryhmittelyt { paluutyyppinä } ) R 1 { huippu } c0 ( { inits }, R 2 { c 4, c 5 } { paluutyyppinä stack } ) R 3 { c 0, c 2, c 5 } pohja ( Ø, { kaikki attribuutit } ) R 4 { c 4, c 1, c 3 } TTY R 5 Ohjelmistotekniikka { c 0, c 2, c 1, c 3 } 21 Sovellusaluetietämyksen hyödyntäminen 1. Suunnitteluratkaisun jäljittäminen j 2. Sovelluksen mallintaminen 3. Olioiden sovittaminen 4. Lähdekoodin mukauttaminen TTY Ohjelmistotekniikka 22 Suunnitteluratkaisun jäljittäminen Aloitetaan matalan tason suunnitteludokumenteista kulkukaaviot, tietovuokaaviot Tuotetaan ER-kaavio sisältää periytymissuhteita, osasuhteita Lopulta saadaan oliokeskeinen sovellusmalli (peruuttava) ER-kaavion oliot esim. ohjelmakoodissa esiintyvät tietuemäärittelyt Sovelluksen mallintaminen Rakennetaan oliokeskeinen sovellusmalli (etenevä) lähdetään sovelluksen vaatimuksista Sovellus on aikaisemmin suunniteltu muilla kuin oliokeskeisillä menetelmillä Sovellus mallinnetaan nyt uudestaan oliomenetelmiä käyttäen TTY Ohjelmistotekniikka 23 TTY Ohjelmistotekniikka 24 4
Olioiden sovittaminen Peruuttavan ja etenevän mallin oliot sovitetaan yhteen etenevä malli antaa kehykset peruuttava mallista saadaan yksityiskohdat Proseduraalinen jäännös sisältää osat, joille ei löydy vastaavuuksia Lähdekoodin mukauttaminen Yhteensovitetut oliot kapseloidaan löydetyt attribuutit ja operaatiot sekä globaalit tietoalkiot Proseduraalinen jäännös mukautetaan olioparadigman mukaiseksi Proseduraaliseen jäännökseen voivat kuulua: proseduraalisen ohjelman pääohjelma lajittelu- ja etsintätoimintoja, jotka eivät sovi mihinkään luokkaan TTY Ohjelmistotekniikka 25 TTY Ohjelmistotekniikka 26 Suunnittelumallien tunnistaminen Esimerkkejä tunnistettavista malleista: MVC-malli (arkkitehtuurimalli) GoF-mallit (mikroarkkitehtuuri) muut mallit (esim. oliomallit) Tunnistamismenetelmiä: osittava (top-down) kokoava (bottom-up) metriikat peittävyyden mittaaminen käsiteanalyysi Mahdollisia lähteitä: proseduraaliset ohjelmat olio-ohjelmat UML-kaaviot Ohjelmien laadun parantaminen TTY Ohjelmistotekniikka 27 Mallilähtöinen etsintä (top-down) Oliomallin (esim. Roles Played) ilmentymien tunnistaminen koodista mallin ilmentymät määritellään sovellusalueen termeillä esim. asiakas, työntekijä malli ilmaistaan ohjelmointikielen rakenteilla mallin ilmentymien etsintä TTY Ohjelmistotekniikka 28 Koodilähtöinen etsintä (bottom-up) Abstraktien tietotyyppien sovittaminen suunnittelumalleihin sopivien tietotyyppien etsintä esim. henkilö, työntekijä, asiakas tarkastellaan tietotyyppien ryppäitä ja niiden suhteita esim. henkilö voi olla osa työntekijää löydetyt suhteet muokataan oliokeskeisiksi esim. periytymissuhde suhteet sovitetaan suunnittelumalliin esim. periytymissuhde Roles Played malliin, jolloin tuloksena saadaan luokka PlayerRole ja sen aliluokat TTY Ohjelmistotekniikka 29 Player PlayerRole1 PlayerRole TimeStart: date TimeEnd: date PlayerRole2 Person type Employee = record data: Person; salary: Salary_type; end Employee type Person = record name: Name_type;... end Customer Esimerkki Malli- lähtöinen etsintä Koodilähtöinen etsintä type Customer = record data: Person; number: Number_type; end TTY Ohjelmistotekniikka 30 5
Composite-suunnittelumalli Client Component Operation ( ) Add ( Component ) Remove ( Component ) GetChild ( int ) Esimerkki Composite-mallin tunnistamisesta AbstractDocument print ( ) AbstractDocument Element print ( ) Document Element nbofelements Title getelements ( ) Paragraph Title Leaf Operation ( ) Composite children Operation ( ) forall g in children Add ( Component ) g.operation ( ); Remove ( Component ) GetChild ( int ) TTY Ohjelmistotekniikka 31 Document nbofelements getelements ( ) ParaIndent Main Paragraph ParaIndent TTY Ohjelmistotekniikka Main 32 Aspektit ja niiden tunnistaminen Lähtökohta: luokkien välillä esiintyy myös horisontaalista samankaltaisuutta Terminologiaa: concern mielenkiinnon kohde, jaotteluperuste (huolenaihe) eri mielenkiinnon kohteet johtavat erilaisiin jaotteluihin cross-cutting concerns läpileikkaavat jaotteluperusteet separation of concerns mielenkiinnon kohteiden tarkastelu erikseen aspect modulaarinen yksikkö, joka mahdollistaa mielenkiinnon kohteiden toteuttamisen erikseen TTY Ohjelmistotekniikka 33 Erilliset luokkahierarkiat Fruit peelable color ripeness pick ( ) refrigerate ( ) Grapes Orange globespercluster juiceable sour tanginess seedless squeeze ( ) makewine ( ) drypeel ( ) getsugar ( ) Gadget color turnon ( ) turnoff ( ) Wireless Wired frequency connectortype range isconnected ( ) acquiresignal ( ) reset ( ) receive ( ) TTY Ohjelmistotekniikka 34 Grapes makewine ( ) getsugar ( ) Läpileikkaavat jaotteluperusteet Orange squeeze ( ) drypeel ( ) Wireless acquiresignal ( ) receive ( ) Wired isconnected ( ) reset ( ) Osto ja myynti Pakkaaminen Varastointi TTY Ohjelmistotekniikka 35 Esimerkkejä aspekteista Aspekteja, joita ohjelmointikieli voi tukea poikkeusten hallinta try, throw, catch rinnakkaisuus synchoronized, wait, notify invariantit invariant, ensure, require Muita aspekteja lokitietojen ylläpito peruminen (undo) tarkistukset (esim. parametrien) ja virhetilanteiden käsittely vrt. viipalointi TTY Ohjelmistotekniikka 36 6
Aspektien tunnistaminen Staattisia menetelmiä fan-in-analyysi tunnusten analysointi Dynaamisia menetelmiä kutsuryhmien analysointi esim. resurssien varaaminen ja vapauttaminen esim. monivaiheiset toiminnot käsiteanalyysin soveltaminen ajetaan instrumentoitua koodia erilaisilla käyttötapauksilla ja kerätään ajojäljet ajojäljet: kontekstin olioita suoritetut operaatiot: kontekstin ominaisuuksia (attribuutteja) löydetään operaatiot, jotka suoritetaan samassa käyttötapauksessa TTY Ohjelmistotekniikka 37 7