Huonon suunnittelun oireita. Hajuja ja sääntöjä. Hyvän suunnittelun periaatteet. Paha haju

Samankaltaiset tiedostot
TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Tarjolla tänää: Ohjelmiston toteutuksesta. Kuinka tulla hyväksi ohjelmoijaksi? CRC-kortit. Testilähtöinen kehittäminen JOT2007. Uudelleenrakentaminen

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmistoarkkitehtuurit Komponentit Kevät 2014

3. Komponentit ja rajapinnat

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Tietorakenteet ja algoritmit

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Java kahdessa tunnissa. Jyry Suvilehto

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

11. Javan valintarakenteet 11.1

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

P e d a c o d e ohjelmointikoulutus verkossa

Metodien tekeminen Javalla

Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu

Tietorakenteet ja algoritmit

Rajapinta (interface)

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Ohjelmistoarkkitehtuurit kevät

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Tietorakenteet ja algoritmit

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

Test-Driven Development

TIE Ohjelmistojen suunnittelu

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IV Periytyminen ja monimuotoisuus

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Java-kielen perusteita

Muutamia peruskäsitteitä

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmistojen suunnittelu

Harjoitustyön testaus. Juha Taina

12. Monimuotoisuus 12.1

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

11. Javan valintarakenteet 11.1

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Test-Driven Development

Ohjelmistojen mallintaminen. Luento 7,

Ohjelmistoarkkitehtuurin suunnitteluperiaatteita

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

Uudelleenkäytön jako kahteen

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

Ohjelmistoarkkitehtuurit kevät

Komponentit ja rajapinnat

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Tietueet. Tietueiden määrittely

JUnit ja EasyMock (TilaustenKäsittely)

Kertaus: yleistys-erikoistus ja perintä

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

Muuttujien roolit Kiintoarvo cin >> r;

9. Periytyminen Javassa 9.1

Tietorakenteet ja algoritmit

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

815338A Ohjelmointikielten periaatteet

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Ohjelmointi 2 / 2010 Välikoe / 26.3

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

Ohjelmoinnin peruskurssien laaja oppimäärä

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

18. Abstraktit tietotyypit 18.1

15. Ohjelmoinnin tekniikkaa 15.1

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Pakkauksen kokoaminen

Metaohjelmointia ja muuta hauskaa

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

812336A C++ -kielen perusteet,

Tietorakenteet ja algoritmit

Eclipse ja JUnit-ohjelmoijatestit

Tutkimusdatan pitkäaikaissäilytys ATT-hankkeessa.

Perinteiset asennuspaketit

Transkriptio:

Hajuja ja sääntöjä OA2005 Huonon suunnittelun oireita Kankeus suunnitelmaa on vaikea muokata. Hauraus suunnitelma on helppo rikkoa. Liikkumattomuus suunnitelmaa on hankala uudelleenkäyttää. Viskositeetti hankalaa tehdä asiat oikein. Tarpeeton kompleksisuus ylisuunniteltu. Tarpeeton toisto hiiren väärinkäyttö. Sameus järjestymätön ilmaisu. Hyvän suunnittelun periaatteet 1. Yksi vastuu (single responsibility, SRP) 2. Avoin-suljettu (open-closed, OCP) 3. Liskovin korvaussääntö (Liskov substitution, LSP) 4. Riippuvuuden kääntäminen (dependency inversion, DIP) 5. Rajapintaerottelu (interface segregation, ISP) Paha haju Paha haju suunnitelmassa on aina oire jostakin suunnitteluongelmasta, esim. kankeus! huonosti huomioitu OCP. Korjataan varmistamalla periaatteen pitävyys suunnitelmassa. vain jos tarvitaan ei parfymointia; siitä on seurauksena vain tarpeeton kompleksisuus

Ohjelmisto mätänee, aina. Alussa kaikki on aina hienosti, sitten tapahtuu se pieni virhe......ja mätäneminen alkaa. Mätänemistä voi estää ja hidastaa, sitä tulee estää ja hidastaa. Mätäneminen näkyy ylläpidon vaikeutena. Ylläpitoa on myös ohjelman kehitys! Mätänemisen syy löytyy......tekijöistä! Mätäneminen alkaa, kun ohjelmisto ei pysty vastaamaan muuttuviin vaatimuksiin. Vaatimukset muuttuvat aina, jos tätä ei ohjelmiston tekijä ota huomioon, on hän yksinkertaisesti huono tekijä. Kankeus Ohjelmistoa on hankala muokata, sillä muokkaus yhdessä kohdassa pakottaa muokkaamaan ohjelmistoa muualtakin. Se olikin paljon monimutkaisempi muutos kuin oletin! Hauraus Yksi muutos saa ohjelmiston hajoamaan useasta eri kohdasta. Jatkuvasti korjattavana olevat osat ohjelmistosta, jotka vain huonontuvat korjaus korjaukselta.

Liikkumattomuus, siirrettävyyden puute Ohjelmisto on hankala purkaa uudelleenkäytettäviin komponentteihin. Aikaa vievää tai kallista, tai ei vain vaivan arvoista. Ohjelmiston viskositeetti Ohjelmistoa voi muuttaa niin, että suunnitelmat pysyvät, tai niin että suunnitelmat pettävät. Jos ensimmäinen on hankalampaa kuin jälkimmäinen, on viskositeetti suuri; on helppoa tehdä vääriä ratkaisuja. Ohjelmisto tulisi suunnitella niin, että suunnitelman säilyttävät muokkaukset olisivat helppoja ja houkuttelevampia kuin suunnitelmat rikkovat muokkaukset. Ympäristön viskositeetti Jos kehitysympäristö on hidas ja heikkotehoinen, ohjelmiston tekijät alkavat suosia ratkaisuja, joiden toteuttaminen ei vaadi liikaa ympäristöltä, esim. ei suuria uudelleenkäännöksiä. Jälleen ohjelmiston suunnitelma ei säily, se pyrkii muuttumaan heikon kehitysympäristön ehdoilla. Tarpeeton kompleksisuus Valmistaudutaan tuleviin tarpeisiin tai vaatimuksiin etukäteen. Tuottaa paljon tarpeetonta, käyttämätöntä suunnitelmaa. Hankaloittaa ylläpitoa ja ymmärtämistä.

Tarpeeton toisto Jaskan täytyy toteuttaa hörpätin. Hän kaivaa suunnitelmasta esille palasen, joka muistuttaa hörpätintä ja kopioi tästä toteutuksen. Jaskan käyttämän palasen on tehnyt Ere, joka on löytänyt sen Penan tekemästä palasesta. Pena taas on ottanut sen kopioimalla ja muokkaamalla riplakkeen toteuttavan pätkän. Korjaaminen työlästä, mutta kannattavaa. Valitettavasti yksi korjaus ei enää riitä. Sameus Kun ohjelmiston osaa muokataan ja kehitetään, se samenee. Sameneminen estää osan ymmärtämisen. Uutta osaa tehtäessä ollaan sisällä työssä, immersioituneita. Jälkeenpäin osa ei enää näytäkään niin selkeälle. Suunnitelmat pitää tehdä luettaviksi ja ne pitää luetuttaa toisilla tekijöillä. Yhden vastuun periaate Luokalla tulee olla vain yksi syy muuttua. Väärä suunnittelu haisee kankealle ja hauraalle. interface Modem { public void dial(string pno); public void hangup(); public void send(char c); public char receive(); Yhden vastuun periaate interface DataChannel { public void send(char c); public char receive(); interface Connection { public void dial(string pno); public void hangup(); class ModemImplementation implements DataChannel, Connection { //...

Avoin-suljettu periaate Avoin-suljettu periaate Ohjelmiston osien tulee olla avoimia laajennoksille, mutta suljettuja muokkauksilta. Väärä suunnittelu haisee kankealle. Client Client Server «interface» Client interface Server Avoin-suljettu periaate Avoin-suljettu periaate Piirretään ympyröitä (Circle) Piirretään neliöitä (Square) Molemmat ovat muotoja (Shape) Järjestyksellä on väliä enum shape_t { circle, square ; struct shape { shape_t type; ; struct circle { shape_t type; double radius; point center; ; struct square { shape_t type; double side; point top_left ; void draw_square(struct square *); typedef struct shape *shape_p; void draw_all_shapes(shape_p *list, int n) { int i; for (i=0; i<n; i++) { struct shape *s=list[i]; switch (s->type) { case square: draw_square((struct square *)s); break; case circle:...

Avoin-suljettu periaate class shape { public: virtual void draw() const = 0; ; class square : public shape { public: virtual void draw() const; ; void draw_all_shapes(vector<shape*>& list) { vector<shape*>::iterator i; for (i=list.begin(); i!=list.end(); ++i) (*i)->draw(); Järjestyksellä on väliä. " Nykyinen malli ei mahdollista tätä. " Mikään malli ei ole luonnollinen kaikkiin konteksteihin. Mitkä muutokset ovat todennäköisiä? Odotetaan, kunnes muutokset ilmenevät. Stimuloidaan muuttumista. Liskovin vaihdantaperiaate Alityyppien täytyy olla käytettävissä ylityyppeinään. void g(rectangle r) { r.setwidth(5); r.setheight(4); assert(r.area()==20); Liskovin vaihdantaperiaate Liskovin periaate Eristettyä mallia ei voi mielekkäästi validoida. IS-A liittyy käytökseen. Design by contract, sopimukset ohjelmoijatesteihin. Varo aliluokkia, joiden metodit rajoittaa yliluokan metodin toiminnallisuutta. Varo aliluokkia, joiden metodit voivat aiheuttaa poikkeutuksia, joita yliluokan metodit eivät voi.

Riippuvuuden kääntäminen Ylätason moduulien ei tule riippua alatason moduuleista. Molempien riippuvuudet tulisi olla abstraktioihin. Abstraktiot eivät saa riippua yksityiskohdista. Yksityiskohtien tulisi riippua abstraktioista. Policy Layer Mechanism Layer Riippuvuuden kääntäminen Utility Layer Riippuvuuden kääntäminen Rajapintaerottelu Asiakkaita ei tulisi pakottaa riippuvaisiksi metodeista joita ne eivät käytä. Jaa lihava rajapinta useisiin erillisiin rajapintoihin.

Paketointi Uudelleenkäyttö-julkaisu yhteys (the reuse-release principle, REP) Yhteinen uudelleenkäyttö (the common reuse principle, CRP) Yhteinen sulkeuma, (the common-closure principle, CCP) Syklittömät riippuvuudet (the acyclic-dependencies principle, ADP) Vakaat riippuvuudet (the stable-dependencies principle, SDP) Vakaat abstraktiot (the stable-abstractions principle, SAP) Uudelleenkäyttöjulkaisu yhteys Uudelleenkäytön osanen on myös julkaisun osanen. (granule) käytetyn kirjaston toivoisi olevan mieluusti ylläpidetyn, ja siirtymisen versiosta toiseen asiakkaan päätettävissä (vanhaa versiota tuettava) täytyy löytyä uudelleenkäytettävä paketti jos joku paketin luokista on uudelleenkäytettävissä, kaikkien on oltava paketin luokkien on oltava saman tahon uudelleenkäyttämiä (ei sotketa esim. toimialaluokkia ja yleiskäyttöisiä säilöluokkia samaan pakettiin) Yhteinen uudelleenkäyttö Paketin luokkia uudelleenkäytetään yhdessä. Jos yhtä luokkaa uudelleenkäytetään, käytetään kaikkia. mitä luokkia laitetaan samaan pakettiin mitkä luokat jätetään paketista pois Yhteinen sulkeuma Luokat paketissa ovat suljettuja samankaltaisten muutosten suhteen. Muutos, joka vaikuttaa pakettiin, vaikuttaa kaikkiin sen luokkiin, muttei muihin paketteihin. Vertaa yksi vastuu (SRP), muista myös avoin-suljettu (OCP).

Syklittömät riippuvuudet Ei syklejä pakettigraafeihin. Korjausehdotuksia riippuvuuden kääntäminen luo uusi paketti, siirrä osalliset sinne Vakaat riippuvuudet Riippuvuudet kohti stabiiliutta. C a (afferent couplings): ulkopuolisten, paketista riippuvien luokkien määrä C e (efferent couplings): sisäpuolisten, muista paketeista riippuvien luokkien määrä Ce I: epästabiilius I = Ca + Ce Vakaat abstraktiot A-I graafi Paketin tulee olla yhtä abstrakti kuin se on stabiili. N c : Luokkia paketissa N a : Abstrakteja luokkia paketissa A: abstraktius A = Na Nc (0,1) Abstraktius Kipualue Epästabilius Tarpeettomat (1,0)