MVC for dummies: malli, näkymä ja ohjain -arkkitehtuuri web-sovelluksissa

Julkaistu 8.4.2020 | Päivitetty 6.6.2024

Ammattilaisten kehittämä sovellus ei ole pelkkä satunnainen kasa koodia, vaan rakentuu valittujen arkkitehtuurimallien ympärille. Arkkitehtuuri auttaa pitämään sovelluksen sisäisen rakenteen loogisena ja helpottaa sovelluksen ylläpidettävyyttä ja jatkokehitettävyyttä.

Model-View-Controller (MVC) on perinteinen ohjelmistokehityksen suunnittelumalli, jonka tärkein tehtävä on eriyttää sovelluksen esitys- ja logiikkakerros toisistaan ja delegoida sovelluksen sisäisiä vastuita eri osa-alueille.

Alkuperäisellä MVC-arkkitehtuurilla on ikää yli 40 vuotta, joten se on vuosien saatossa saanut rinnalleen runsaasti erilaisia muunnelmia ja muita arkkitehtuurimalleja. Useat web-frameworkit (esim. Laravel, Django ja Ruby on Rails) käyttävät joko suoraan MVC-arkkitehtuuria tai jotain sen muunnelmaa. MVC soveltuukin hyvin vaikkapa REST-rajapintojen rakentamiseen.

MVC, tai mikään muukaan sovelluksen sisäinen arkkitehtuuri, ei kuitenkaan suoraan näy sovelluksen loppukäyttäjälle, eikä edes palveluntarjoajalle. Tässä blogitekstissä kerromme tarkemmin siitä, mitä web-sovellusten pinnan alla tapahtuu.

MVC-arkkitehtuurissa on kolme osaa

MVC:n ydinperiaate on säilynyt samana vuosien ajan: ohjelmiston rakenne jäsennetään kolmeen osa-alueeseen, eli malliin (Model), näkymään (View) ja ohjaimeen (Controller). 

Malli, näkymä ja ohjain toimivat vuorovaikutuksessa keskenään ja ovat usein toisistaan riippuvaisia, vaikka niiden toiminnot suunnitellaan ja toteutetaan jossain määrin erikseen. Eri osa-alueiden välinen riippuvuus tarkoittaa sitä, että esimerkiksi muutos mallissa saattaa tarkoittaa muutoksia myös näkymässä. 

MVC käytännön sovelluksessa

MVC-kaavio.

Kaaviossa on yksinkertainen MVC, jonka pohjalta on luontevaa suunnitella ja rakentaa järjestelmän toiminnallisuuksia. Kuvassa on ohitettu käyttöliittymäkerroksen omat toiminnot, jotta MVC-arkkitehtuuri voidaan kuvata mahdollisimman yksinkertaisesti.

Sovelluksen ydintoiminto on tiedonhaku: käyttäjä hakee kaikki tallennetut yhteystiedot tietokannasta.

  • Malli pitää sisällään ohjelmointikielisen kuvauksen siitä, mitä tietoja henkilöille kuuluu (esim. idnumero, nimi), ja miten tämä tieto löydetään tietokannasta.
  • Näkymä on henkilölistaus.  
  • Ohjain on tietojen kuljettaja, joka vastaanottaa käyttäjältä tulevan pyynnön, vie pyynnön mallille ja huolehtii siitä, että mallilta tuleva tieto välittyy näkymälle. Ohjain ei tee muutoksia tietokantaan tai näkymään, vaan toimii ainoastaan välittäjän roolissa. 

Malli eli Model on järjestelmän tietosisältöolio

Malli on järjestelmän dynaaminen tietorakenne, joka käsittelee ja varastoi ohjelmiston sisällä liikkuvaa tietoa. Tietoa hallinnoivat mallit ovat usein kytkettyinä ohjelmiston toiminnan kannalta oleelliseen tietovarastoon, kuten relaatiotietokantaan.

Näkymä eli View tarjoaa tavan esittää tietosisältöä

Näkymä esittää datan määritetyssä muodossa, joka voi olla esimerkiksi sovelluksen käyttöliittymä (HTML) tai jokin muu datan esitysmuoto (esim. JSON tai XML). 

Näkymä-käsitettä käytetään web-kehityksessä sekä back-endin, että front-endin puolella. Perinteisesti näkymät ovat olleet suoraan käyttäjälle esitettäviä HTML-dokumentteja, mutta nykyisin näkymät ovat useimmiten käyttöliittymien käsiteltäväksi tarkoitettua dataa.

Ohjain eli Controller työskentelee mallin ja näkymän välillä

Ohjaimen tehtävänä on vastaanottaa komentoja ja toimia komentojen mukaisesti tiedon siirtäjänä mallin ja näkymän välillä. Käytännössä tämä tarkoittaa, että ohjain hakee, kirjoittaa tai poistaa dataa mallin kautta ja lopuksi palauttaa uuden näkymän.

Esimerkiksi web-sovellusten back-endissä ohjaimelle tulevat komennot ovat useimmiten HTTP-pyyntöjä. Kun pyyntö on käsitelty, ohjain palauttaa näkymän HTTP-vastauksena.

MVC-arkkitehtuurin mukaan tehty ohjelmisto on kokonaisuus

Vaikka MVC-arkkitehtuurissa ohjelmiston sisäisten osien vastuualueet erotetaan toisistaan ja voidaan myös rakentaa erikseen, huomioidaan ohjelmistokehityksessä aina mallin, näkymän ja ohjaimen väliset riippuvuudet. 

Fiksusti suunnitellun ja rakennetun sovelluksen jatkokehitys on myöhemmin helpompaa, tehokkaampaa ja nopeampaa. Kun sovelluksen rakenne huomioidaan alusta saakka, säästetään resursseja varsinaisten ominaisuuksien kehittämiseen.

Kun tarvitset osaavaa sovelluskehityspalvelua, ota yhteyttä!

Jätä yhteydenottopyyntö