TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

Samankaltaiset tiedostot
TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

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

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

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Kertaus: yleistys-erikoistus ja perintä

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Ohjelmistoarkkitehtuurit Komponentit Kevät 2014

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

13/20: Kierrätys kannattaa koodaamisessakin

TIE Ohjelmistojen suunnittelu

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Mitä on periytyminen?

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

Ohjelmistotuotanto. Luento

Ohjelmistojen mallintaminen, kesä 2010

Ohjelmistotekniikan menetelmät, kesä 2008

Ohjelmistojen suunnittelu

812341A Olio-ohjelmointi, I Johdanto

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Kehyspohjainen ohjelmistokehitys

Ohjelmistojen mallintaminen, kesä 2009

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

TIE Ohjelmistojen suunnittelu

Ohjelmistotekniikan menetelmät, kevät 2008

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

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

12. Kehysarkkitehtuurit

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Uudelleenkäytön jako kahteen

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmistojen mallintaminen kertausta Harri Laine 1

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

Analyysi on tulkkaamista

3. Komponentit ja rajapinnat

Ohjelmistotuotanto. Luento

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

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

T Ohjelmistojen määrittely- ja suunnittelumenetelmät

T harjoitustyö, kevät 2012

C++11 lambdat: [](){} Matti Rintala

Rajapinnat ja olioiden välittäminen

Tietokoneverkot. T Tietokoneverkot (4 op) viimeistä kertaa CSE-C2400 Tietokoneverkot (5 op) ensimmäistä kertaa

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

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

Ohjelmistojen mallintaminen, mallintaminen ja UML

UML:n yleiskatsaus. UML:n osat:

Ohjelmistoarkkitehtuurit kevät

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

TIE Ohjelmistojen suunnittelu

Harjoitustehtävät ja ratkaisut viikolle 48

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Ohjelmistoarkkitehtuurit kevät

TIE Ohjelmistojen suunnittelu

Ohjelmistojen mallintaminen, kertausta

Komponentit ja rajapinnat

815338A Ohjelmointikielten periaatteet

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

812336A C++ -kielen perusteet,

Rajapinta (interface)

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

TIE Ohjelmistojen suunnittelu. Luento 2: protot sun muut

Muutamia peruskäsitteitä

Kehyksillä toteuttettujen tuotelinjojen rakenteellinen optimointi

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

Muusta kuin vesisioista

Ohjelmistoarkkitehtuurit. Kevät

P e d a c o d e ohjelmointikoulutus verkossa

TIE Ohjelmistojen suunnittelu. Luento 2: protot sun muut

Ohjelmistoarkkitehtuurit Kevät käytäntöjä

Ohjelmistotuotanto. Luento

Suunnittelumallien käyttö ohjelmistosuunnittelussa

Ohjelmoinnin perusteet Y Python

Ohjelmistojen mallintaminen. Luento 7,

Kurssijärjestelyt. CS-1180 Verkkojulkaisemisen perusteet (5 op) Hanna Hämäläinen Informaatioverkostot / Mediatekniikan laitos

Ohjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit

Agenda. Läpäisyvaatimukset Henkilökunta Luennot ja aikataulu Kurssimateriaali Harjoitustyöt Demoharjoitus Tentti ja arvostelu Muuta?

Ohjelmistoarkkitehtuurit Kevät käytäntöjä

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

T Ohjelmistojen määrittely- ja suunnittelumenetelmät Harjoitustyöraportti TNT - Tarkistetaan Ne Tentit Arkkitehtuuri- ja suunnittelumalli

15. Ohjelmoinnin tekniikkaa 15.1

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

Ohjelmistoarkkitehtuurit, syksy

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Transkriptio:

TIE-20200 Ohjelmistojen suunnittelu Viimeinen luento: kertaus 1

Ajankohtaista Harjoitustyön dedis 9.12. klo 12:00 Demoilusessiot samalla/seuraavalla viikolla Harjoitustyön neuvontapäivystyksiä KE 15-16 TE116 (Samuel)

Ohjelmassa tänään Pikakertaus kurssin aihealueesta Tentin rakennetta, kysymyksien tyyliä Sananen harjoitustyön arvioinnista jne.

Harkkatyöstä Harjoitustyön arvostelusta: Harjoitustyöstä molemmille X pistettä, ryhmän sisällä voi luovuttaa pisteitä työnsankarille, jos haluaa (maksimissaan 2 pistettä/opiskelija) Pisteytyksen jakaminen onnistuu ilmoittamalla omalle assarille Vertaisarviointi: Dediksen jälkeen toisen ryhmän työhön tutustuminen, kirjoitetaan kahden sivun raportti työstä 1 sivu ohjelman rakenteesta ja sen tärkeimmistä suunnitteluratkaisuista 1 sivu arviointia työstä, laajennettavuus, muokattavuus, joustavuus vs. Jäykkyys, hauraus jne.

Arvostelukriteeristöä Suunnittelu, rakenne Jako eri osa-alueisiin, korkean tason rakenne Spagetti vs. selkeät vastuualueet Rajapintojen suunnittelu, toiminnallisuuden jako Dokumentaatio Selkeys, luettavuus, tarkoituksenmukaisuus Auttaako dokumentin lukeminen ohjelman ymmärtämisessä vai päinvastoin? Toteutus/koodi Ulkonäkö, luettavuus, funktioiden ja luokkien pituudet, nimeäminen, vakioiden käyttö jne. esi-jälkiehdot, invariantit, jne. esitietokursseilta tuttu asia Yhteneväisyys, kommentit (miten ja mitä kommentoitu vs. määrä) Toiminnallisuus, toimiiko peli (vai kaatuilee), tehtiinkö mitä luvattiin? Muut Versiohallinnan käyttö Testit, bonusta yksikkötestit, omat järkevät testikentät jne.

Aihealueet Rajapinnat, rajapintojen suunnittelun periaatteita jne. Periytyminen, moniperiytyminen SOLID ja toisaalta huonon suunnittelun oireet Ohjelman jakoa loogisiin kokonaisuuksiin, MVC ja kumppanit Suunnittelumallien perusidea (tehtaat, tarkkailija), tapa kommunikoida suunnitteluideoita Lokalisointi-kansainvälistäminen C++ perinnän kera, viipaloituminen Riippuvuuksien syöttö, dependency injection Kirjastot, dynaaminen vs. staattinen Yksityiskohtia: Templatet, lambdat, QML (idea), työkalujutut (kehitysprosessin vaiheet) (UML) mallintaminen, luokkakaaviot, rajapinnat, sekvenssikaaviot

Luettavaa, kurssimateriaali Olioiden ohjelmointi C++:lla (löytyy IDLEstä) Kopioit ja viipaloituminen, luku 7 Rajapinnat, sopimussuunnittelu: luku 8 Periytyminen, moniperiytyminen: kirjasta 6.7-6.11 Suunnittelumalleja, geneerisyys luku 9 API Design for C++ (nimestään huolimatta paljon yleistä suunnitteluohjetta, ei pelkästään API-suunnittelua) Pääsy TTY:n verkosta, VPN-yhteydellä kotoa Luku 3: pattern-kamaa (singleton-varoitus ) Luku 4: Yleisesti suunnittelusta, SOLID Luku 10: testaamisen suunnittelusta Luku 12: plugin-juttuja SOLIDista ja suunnittelusta http://www.objectmentor.com/resources/articles/principles_and_patterns.pdf http://butunclebob.com/articles.unclebob.principlesofood Singletonin pahuudesta (kirjassa paljon singelton-asiaa, tämä huomioitavana asiana) http://butunclebob.com/articles.unclebob.singletonvsjustcreateone http://www.ibm.com/developerworks/webservices/library/co-single/ http://blog.code-cop.org/2012/01/why-singletons-are-evil.html http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/

Tentin rakenteesta 1 kpl pikkukysymyksiä 0..2 kpl koodia tai kaavioita, joko itse piirtäen tai tutustuminen & vastaaminen kysymyksiin 1 kpl väärin oikein perustele 0..1 kpl esseehtävä kysymys

Huonon suunnittelun tunnusmerkistöä Huonon suunnittelun kriteeristöä Ei siirrettävää koodia, ohjelman rakenne täynnä riippuvuuksia, komponentteja ei voi uudelleen käyttää tai siirtää näiden takia (immobility) Jäykkyys, yksittäinen muutos vaikuttaa moneen muuhun osaan (rigidity) Hauraus, muutos yhteen osaan rikkoo asioita muualla (fragility) STUPID singleton, tight coupling, untestability, premature optimization, indescriptive naming, duplication Boilerplate-koodin määrä (käyttäjä joutuu toistamaan paljon samaa koodia tehdäkseen haluamansa asian rajapinnan avulla)

Ja hyviä periaatteita SOLID Dependency injection Tarkat parametrityypit, ei tolkuttoman pitkiä parametrilistoja, nimeäminen kuvaavaa & johdonmukaista, soveltuu käyttäjälleen (oikea abstraktiotaso), riittävän ilmaisuvoimainen

Single responsibility principle Single responsibility principle (SRP) a class should have only a single responsibility. Vain yksi vastuualue/luokka Pohjautuu reason-to-change ajetelmaan, jokaisella luokalla pitäisi olla vain yksi huolehdittava asia, vain yksi syy, miksi luokan toteutusta pitäisi muuttaa. Jos luokalla kaksi tai useampi muutossyy, voi muutoksella yhden vastuualueen toimiin olla helposti vaikutusta toisen toimintaan (korjataan yhtä, rikotaan toinen) Uudelleenkäyttö ja eriyttäminen vaikeampaa, kun mukana tulee ylimääräistä kuormaa

Open-closed principle Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification You should be able to extend a classes behavior, without modifying it. Moduulit ja luokat: Ovat avoimia laajennuksille, toiminnallisuutta voidaan lisätä, rajapintaa laajentaa uusilla palveluilla Suljettu muutoksilta: moduulin tai luokan toteutusta ei saa muuttaa Koodi testattu, katselmoitu jne, sitä ei enää muuteta Kuulostaa ristiriitaiselta, ideana hyödyntää abstraktioita Voidaan käyttää hyväksi perintää, (abstrakteja) kantaluokkia Ohjelmat, joissa hyödynnetään open-closed periaatetta, muutetaan lisäämällä uutta koodia, ei muuttamalla olemassa olevaa Ei realistisesti mahdollista päästä tilanteeseen, jossa 100% koodista suljettuna muutoksilta pitää tehdä päätöksiä siitä, mihin panostetaan, missä ohjelman osissa tulee todennäköisimmin muutoksia? Abstraktiot, ja osan ohjelmakoodin sulkeminen.

Liskov substitution principle Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program. Derived classes must be substitutable for their base classes Mikä tahansa aliluokan instanssi kelpaa kantaluokkaolion tilalle (ilman että ohjelman toiminta kärsii/muuttuu virheelliseksi) C++-maailmassa: mikä tahansa viitteen tai osoittimen luokkaan ottavan funktion on pystyttävä käyttämään mitä tahansa luokan aliluokkaa ilman että funktion toteutuksessa täytyy tietää todellinen tyyppi (taas vääränlaiset tyyppimuunnokset jne.) Toiminnalliset aliluokat: Toiminnallinen lisävaatimus pelkän syntaksivaatimuksen lisäksi (semantiikka), ei pelkkä syntaktinen yhteensopivuus (samat funktion protyypit jne.)

Interface segregation principle many client-specific interfaces are better than one general-purpose interface. Make fine grained interfaces that are client specific Rajapinnan käyttäjän ei pidä olla riippuussuhteessa palveluihin/funktioihin joita se ei tarvitse/käytä Jaetaan isommat rajapinnat pienemmiksi roolien mukaan, saadaan roolirajapintoja (role interfaces) Isompi ohjelma, jossa paljon keskinäisiä riippuvuuksia ja isoja möhkälerajapintoja pienikin muutos heijastuu joka puolelle muutoksen tekijä joutuu tonkimaan muutettavat asiat muun turhan sälän seasta yksittäiseen asiaan liittyvän toteutuksen vaihtaminen vaatii copy-pastea vanhoista koodeista ja uuden asian lisäämisen lisäksi Anti-versio periaatteesta, yksi iso möhkäleluokka, joka tarjoaa lähes kaikki toiminnot. Vaikea hallita, päivittää, muuttaa, jos rinnakkaisuutta, saadaan suorituskykyongelmat mukaan Lihavat rajapinnat (fat interfaces), rajapintojen saastuminen (interface pollution)

Dependency inversion principle A) High-level modules should not depend on low-level modules. Both should depend on abstractions. B) Abstractions should not depend upon details. Details should depend upon abstractions. http://www.objectmentor.com/resources/articles/dip.pdf Riippuvuudet abstraktioihin, ei konkreettisiin toteutuksiin Huonon suunnittelun kriteeristö vs. Dependency inversion

Suunnittelumalleista Mitä, miksi, mihin käyttöön? Observer Tehtaat MVC ja kumppanit Piirrä sekvenssikaavio, jolla voit kuvata pull-tyylisen MVCmallin toimintaa. Piirrä luokka- ja oliokaavio, jossa on tarkkailtava tapahtumalähde (Observable) nappula ja sille kaksi eri tarkkailijaa (Observer) pääikkuna ja lokiluokka. Katso esiteltyä koodia, mitä suunnittelumallia/ratkaisua siinä on käytetty?

Lambdat, templatet Idea, käyttökohteet, perusrakenne Esimerkkikysymys: Mitä vaatimuksia esitelty koodi asettaa tietotyypille (T)? Mitä esitellyssä koodissa tapahtuu? (mitkä ovat v:n ja summan arvot? std::vector< int > v = { 2, 3, 6, 9 }; int summa = 0; std::for_each(v.begin(), v.end(),[&summa](int a){summa +=++a;});

Moniperintä Käyttökohteet, vaarat, ongelmat, kuten toistuva moniperintä/diamond problem/repeated multiple inheritance Piirrää esimerkki toistuvasta moniperinnästä (diamond problem/repeated multiple inheritance) ja kerro siihen liittyvistä ongelmista. Selitä miten kahdesta eri kantaluokasta/rajapinnasta saatavat saman nimiset funktiot voivat olla ongelma.

Yhteenveto Kurssin tärkein opetus: suunnittelun ja ohjelman rakenteen vaikutus koodipuolelle: ohjelman jako osiin vs. koodi Kurssin jälkeen pitäisi olla eväitä olla mukana ohjelmien suunnittelutyössä Ymmärtää yleisimpiä suunnitteluratkaisuja, pohjataidot, joiden avulla kyky oppia uusia Tentiin kannattaa lukaista muutakin kun luentokalvot, erityisesti jos luennot & harkat ovat jääneet väliin (luentokalvot on tehty luentoja varten) TIE-20200 Samuel Lahtinen 19