Malli-näkym kymä-ohjain arkkitehtuurit (Model-View View-Controller, MVC) Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta. Lähtökohdat: Sovelluksen tilasta pitäisi pystyä antamaan erilaisia näkymiä Käyttöliittymän pitäisi välittömästi heijastaa sovelluksen tilan muutoksia Käyttöliittymää pitäisi olla helppo muuttaa Sovellus pitäisi voida kohtuullisella työllä siirtää toiselle graafiselle alustalle 1
Perusajatus komento vaste Ohjain Näkymä sovelluksen toiminto Malli sovelluksen tilan muutos 2
Esimerkiksi Näkymä TextField Malli Sovelluslogiikka Ohjain Button Kuuntelija 3
Vastuut Malli Tarjoaa sovellukseen liittyvät loogiset toiminnot ja tiedot Rekisteröi sovelluksen tilasta kiinnostuneet näkymäkomponentit Ilmoittaa rekisteröityneille komponenteille tilan muutoksista Näkymä Huolehtii sovelluksen tilan näyttämisestä näytöllä Ohjain Ottaa vastaan käyttäjän komentoja Muuntaa komennot sovelluksen toiminnoiksi 4
MVC malli Observer Model update() * update() attach(observer) detach(observer) notify() getdata() service() attach() getdata() View initialize(model) makecontroller() activate() display() update() Controller initialize(model,view) handleevent() update() attach() service() 5
MVC vuorovaikutus Controller Model View handle- Event service suorita toiminto notify update getdata display 6
Kerroksittainen MVC (Esim. verkonhallintasovellukset) Näkymä Käyttäjän komennot Toiminto pyynnöt Ohjain Sovelluslogiikka Model Sovellusaluelogiikka Näytä tulokset Tuota tulokset 7
MVC:n edut ja ongelmat Etuja Helppo toteuttaa useita näkymiä samaan tietoon Kaikki näkymät ovat automaattisesti synkronoituja Uusia näkymiä voidaan ajoaikana liittää järjestelmään Käyttöliittymän ulkoasu suhteellisen helposti vaihdettavissa Ongelmia Mahdollisesti turhia näkymien päivityskutsuja Mallidatan kyselyt voivat lisätä suoritusaikaa 8
Tulkkiarkkitehtuurit Tarve antaa toiminnallisia kuvauksia syötteenä järjestelmälle, esimerkiksi: tarve yhdistellä primitiivisiä toimintoja eri tavoin, jotka eivät ole tiedossa etukäteen tarve erottaa looginen, abstrakti suoritusalusta konkreettisesta (esim. jälkimmäisen vaihtamisen helpottamiseksi) 9
Tulkkiarkkitehtuurin perusidea toimintakuvauksen sisäinen esitys Tuloste Jokin toiminnallinen kuvaus (teksti, XML, graafinen, ym.) Tulkki kutsuu Konkreettinen suoritusalusta noudattaa 1 toteutus 2 Syöte Kielen määritys 10
Esimerkki 1: Java käännös toimintakuvauksen sisäinen esitys Tavukoodi Ohjelman tulokset Java-ohjelma JVM (C-ohj) kutsuu Suoritusalusta (C ympäristö) noudattaa toteutus Ohjelman syöte Javan määritys 11
Esimerkki 2: Taulukkolaskenta Laskettu taulukko sis.esitys Taulukkoskripti Skriptitulkki Taulukkolaskenta noudattaa toteutus Skriptikielen määritys Taulukon alkion arvo 12
Esimerkki 3: SQL kyselyt DBMS SQL-kysely SQLtulkki Tietokanta Kyselyn tulos Sovellus 13
Esimerkki 4: Tulkitseva DSL toimintakuvauksen sisäinen esitys Tuloste Sovelluksen kuvaus DSL-kielellä Tulkki kutsuu API Alusta noudattaa toteutus Syöte DSL-kielen määritys DSL = Domain-Specific Language 14
Tulkin suunnittelu: Tulkki-suunnittelumalli Ongelma: miten esittää tulkittava ohjelma olioina? Ratkaisu: Tulkki-suunnittelumalli (Interpreter) Interpreter AbstractStruct interpret(rep) * TerminalStruct interpret(rep) CompositeStruct interpret(rep) 15
Tulkki-suunnittelumallin johtaminen: Kielen rakenteiden esitys luokkina Ongelma: Miten esittää kielen rakenteet luokkina? Esimerkiksi: Script ::= "SCRIPT" Action {";" Action} "END" Action ::= "IF" Expr "THEN" Action "END" identifier "(" Expr ") Expr ::=... Luokkamalli? 16
Välisymbolit ja rakenteiset loppusymbolit esitetää ään n luokkina Esimerkiksi: Script, Action, PrimAction, CondAction, Expr, identifier => luokkia Ei-rakenteiset loppusymbolit (avainsanat, erikoismerkit ym.): SCRIPT END IF THEN ; ( ) Näitä tarvitaan vain jäsennyksen (ja lukemisen) tueksi, eivät olennaisia (nk. konkreettinen syntaksi) 17
Mitä tuotossää ääntö merkitsee luokkien kannalta? Ehdotus: Tuotossääntö merkitsee sitä, että oikean puolen luokat ovat osa-suhteessa vasemman puolen luokkiin. A ::= B C tarkoittaa: OK, mutta entä A ::= B C D E? A 1 1 B C 0..1 A 0..1 0..1 0..1 B C D E Ei hyvä... 18
Vaihtoehtoiset rakenteet aliluokiksi A ::= B C D E => A ::= A1 A2 A1 ::= B C A2 ::= D E A A1 A2 B C D E 19
Rekursiiviset rakenteet Statement ::= CompoundStatement AssignmentStatement CompoundStatement ::= { StatementList } StatementList ::= {Statement ; } Statement * AssignmentStatement CompoundStatement Rekursiokooste 20
Script interpret() 1..* Action interpret() 1 Esimerkki Script ::= "SCRIPT" Action {";" Action} "END" Action ::= CondAction PrimAction CondAction ::= "IF" Expr "THEN" Action "END" PrimAction ::= identifier "(" Expr ")" Expr ::=... CondAction PrimAction Expr interpret() interpret() 1 1 val(): float 1 Identifier name(): String 21
Tulkkiarkkitehtuurin edut ja ongelmat Edut: Ajoaikainen suoritusympäristö omassa hallinnassa Tulkittavaa kieltä suhteellisen helppo muuttaa Kielen merkitystä suhteellisen helppo muuttaa Suoritusympäristö voidaan helposti vaihtaa (rajapinnat) Ongelmat: Suorituskyky (epäsuora, ei-natiivi suoritus; sisäisen esityksen muodostaminen) Tilankäyttö (ohjelman sisäinen esitys esim. Tulkki-mallilla voi vaatia paljon tilaa) 22