Ohjelmistoarkkitehtuurit 2012
1 Refaktorointi
Refaktorointi (refactoring, uudelleenrakentaminen) on ohjelmiston sisäisen toteutuksen parantamista ilman että ulkoinen käytös muuttuu. Yleensä tämä tarkoittaa sitä, että parannetaan ohjelmiston laadullisia ominaisuuksia, ei toiminnallisia.
1.1 Historia
- 1980-luku Forth:
- Factoring — Pilkotaan liian suuri sanamääritys pienemmiksi.
- 1984 Thinking Forth -kirja
- Kokeile Forthia
- repl.it sisältää muitakin kieliä kokeiltavaksi, mutta valitse λ-napin alta Forth kieleksi ja kokeile sitä Thinking Forth -kirjan mukaan
- 1991 William Grisoldin väitöskirja http://cseweb.ucsd.edu/~wgg/Abstracts/gristhesis.pdf
- 1992 William Opdyken väitöskirja http://www.laputan.org/pub/papers/opdyke-thesis.pdf
- 1999 Fowler, Beck, Brant Opdyke Roberts: Refactoring: Improving the Design of Existing Code
- 2000-luvulla refaktorointi levisi yleiseen tietouteen ja IDEihin.
1.2 Muualla
- Vähän ja jäsennellysti Wikipediassa: http://en.wikipedia.org/wiki/Code_refactoring
- Paljon ja rämettyneesti Wikissä: http://c2.com/cgi/wiki?WhatIsRefactoring
- "Kotisivut": http://martinfowler.com/refactoring/
- sisältää mm. "katalogin" http://martinfowler.com/refactoring/catalog/index.html
1.3 Vaiheet
- Tunnistetaan refaktoroinnin kohde.
- Kirjoitetaan TDD-testit refaktoroinnin kohteelle.
- Testien läpimeno osoittaa, että refaktorointi on onnistunut.
- Refaktoroidaan (Aja useasti TDD-testit!)
- TDD-testit osoittavat läpimennessään, ettei refaktorointi riko mitään.
- Varmistetaan toiminta (Aja TDD-testit!)
- TDD-testit osoittavat, että kaikki on taas kunnossa.
1.4 Milloin refaktoroin?
- Kolmannella kerralla
- Virhettä korjatessa
- Uutta toimintoa lisätessä
- Katselmoinnin yhteydessä
- Älä uudelleenrakenna, jos koodi ei toimi, tai aikatakaraja on lähellä
1.5 Ongelmia
- Tietokannat
- rakenna väliin rajapinta / välittäjä
- Käytä oliotietokantoja oliokoodille
- Rajapinnat ja kutsumuodot
- Älä julkaise rajapintoja ennenaikaisesti!
- Helpota siirtymää työkaluin.
1.6 Refaktoroinnin kohteen tunnistaminen
- Suunnittelumallien perusteella
- Pahan hajun perusteella
- koodiduplikaatit, pitkät metodit, suuret luokat, pitkät parametrilistat, jatkuva muutos, haulikkokirurgia, ominaisuuskateus, dataklöntit, primitiivipakkomielle, switch- lauseet, …, viestiketjut, välimies, …, kommentti
1.7 Tunnistettujen kohteiden korjaus
- Kutakin hajua vastaa joukko uudelleenrakentamismalleja
- jatkuva muutos: irrota luokka
- primitiivipakkomielle: korvaa tietoarvo oliolla; irrota luokka; korvaa tyyppitieto luokalla; …
- kommentti: uudelleenrakenna niin, ettei kommenttia tarvita
1.8 Lista refaktoroinneista
- http://martinfowler.com/refactoring/catalog/index.html
- muitakin varmasti löytyy
1.9 Refaktorointi ja IDE
- IDEn refaktorointityökalut tekevät refaktoroinnin liian helpoksi
- Olisi silti syytä jaksaa kirjoittaa ne testit
- jotta ymmärtää tilanteen todella
- jotta näkee, ettei mikään mene rikki
- Testien kirjoittamiseen menneen ajan saa moninverroin takaisin, kun ei tarvitse uhrata pitkiä aikoja syntyneiden virheiden perkaamiselle
2 Uudistaminen (re-engineering)
Ohjelmiston järjestelmällinen tutkiminen ja uudelleenkirjoitus
- Reverse-engineering - tutkitaan ja selvitetään, mitä ohjelmisto oikeasti tekee ja miten; uudistamisen ensimmäinen vaihe
- Uudelleenkirjoitus - Suunnitellaan ja muokataan ohjelma uusiksi
- http://en.wikipedia.org/wiki/Reengineering_(software)
- 1990 Chikofsky ja Cross http://dx.doi.org/10.1109/52.43044
- 2003 Nierstrasz, Ducasse, Demeyer: Object-oriented re-engineering http://scg.unibe.ch/download/oorp/
- Program Transformation Wiki: http://www.program-transformation.org/