**Ohjelmistokehys** (myös *sovelluskehys*, engl. *Software Framework*) tarkoittaa ohjelmistotuotetta, joka muodostaa rungon (myös termi *ydin* on käytössä) sen päälle rakennettavalle tietokoneohjelmalle. Ohjelmistokehys on ohjelmoinnin apuväline, jonka tarkoituksena on nopeuttaa uusien ohjelmistotuotteiden valmistusta. Kehys tarjoaa valmiiksi rakennettuja tietokoneohjelman osia, joita ei tarvitse kirjoittaa uudelleen ohjelmistokehityksen aikana – tämä nopeuttaa kehitystyötä. Tavallisesti ohjelmistokehystä ei voi käyttää sellaisenaan suoritettavana ohjelmana, vaan varsinainen toimiva lopputuote saadaan aikaan rakentamalla uusi ohjelma kehyksen päälle.

Ohjelmistokehykset rakentuvat *ohjauksen kääntämisen* (engl. *inversion of control*) periaatteelle, jossa ohjelman kontrollitoiminnot siirtyvät säiliön tai sovelluskehyksen vastuulle. Oman käyttäytymisen lisääminen tarkoittaa kehyksen luokkien laajentamista tai omien luokkien lisäämistä.

Monet ohjelmistokehykset ovat oliopohjaisia. Web-sovelluskehykset ovat suunnattu web-sovellusten kehittämiseen, mutta muitakin ohjelmistokehyksiä on olemassa. Esimerkiksi agenttiohjelmointi on eräs kehysten sovellusalue. Ohjelmistokehyksiä on toteutettu mm. Java-, PHP-, Ruby- ja Python-ohjelmointikielillä.

Ohjelmistokehykset ovat muodoltaan kirjastoja, joissa hyvin määritelty ohjelmointirajapinta (engl. API) on uudelleen hyödynnettävissä missä tahansa uuden kehitettävän ohjelmiston sisällä. Tietyt ominaisuudet kuitenkin erottavat ohjelmistokehykset muista kirjastomuodoista. Esimerkiksi ohjelmistokehysten käyttäjät eivät voi muokata kehyksen koodia, mutta voivat laajentaa sitä.

Arkkitehtuuri
-------------

Ohjelmistokehys koostuu laajennuskohdista (engl. hot spot) sekä uudelleenkäytettävästä ohjelmarakenteesta eli kehyksen jäädytetyistä kohdista (engl. frozen spot). Jäädytetyt kohdat ohjelmistokehyksessä määrittelevät ohjelmiston kokonaisarkkitehtuurin eli ohjelmiston peruskomponentit ja niiden väliset suhteet. Jäädytetyt kohdat pysyvät siis muuttumattomina kaikissa ohjelmistokehyksen instansseissa. Laajennuskohdat ovat kehyksessä se osa, johon kehystä hyödyntävät ohjelmistokehittäjät voivat lisätä omia ohjelmistorakenteitaan oman projektin toiminnallisuuksien luomista varten. Täydentämällä näitä ohjelmistokehyksien laajennuskohtia, kehyksistä saadaan tuotettua erilaisia ohjelmistokokonaisuuksia. Oliopohjainen ohjelmistokehys koostuu abstrakteista ja konkreettisista luokista. 

Kun ohjelmistokehittäjät kehittävät ohjelmistojärjestelmiä ohjelmistokehysten avulla, he hyödyntävät laajennuskohtia järjestelmien erityisominaisuuksien ja -vaatimusten toteuttamiseen. Ohjelmistokehykset perustuvat Hollywoodin periaatteeseen ("älä soita meille, me soitamme sinulle"). Tämä tarkoittaa sitä, että käyttäjän määrittelemät luokat (esimerkiksi uudet alaluokat) saavat viestejä ennalta määritellyiltä kehysluokilta.

Edut
----

Ohjelmistokehysten tarkoituksena on yksinkertaistaa kehitysympäristöä. Tällöin kehittäjät voivat keskittyä ohjelmiston vaatimuksiin sen sijaan, että keskittyisivät käsittelemään kehyksen toistuvia toimintoja. Kun uudelleen käytetään valmiiksi rakennettua ja testattua koodia, parannetaan järjestelmien luotettavuutta sekä vähennetään ohjelmointiin, testaustyöhön ja markkinointiin kuluvaa aikaa. Ohjelmistokehykset usein tarjoavat ohjelmistoon uusia toimintoja, parempaa suorituskykyä tai parempaa laatua ilman, että ohjelmistokehyksen käyttäjän tarvitsisi tehdä suurta määrää lisää kehitystyötä.

Tunnettuja ohjelmistokehyksiä
-----------------------------

* Apache Cocoon
* CodeIgniter
* Django
* Flutter
* Symfony
* Jade
* Ruby on Rails
* TurboGears
* .NET Framework

Lähteet
-------

1. 1 2  Loredana Crusoveanu: Intro to Inversion of Control and Dependency Injection with Spring *baeldung.com*. Viitattu 27.10.2019. (englanniksi)
2. 1 2 3  Njeru Mwendi Edwin: Software Frameworks, Architectural and Design Patterns.  *Journal of Software Engineering and Applications*, 7.7.2014, 2014. vsk. doi:10.4236/jsea.2014.78061. ISSN 1945-3124. Artikkelin verkkoversio.  en

Aiheesta muualla
----------------

* Kuvia tai muita tiedostoja aiheesta **Ohjelmistokehys** Wikimedia Commonsissa