Tema 8 Programdesign som isolerer godt mellom logikk og presentasjon passer godt for å lage ulike grensesnitt mot logikk-delen. Klassen ZipFile som ble brukt i et konsoll-basert grensesnitt på side 67, kan like gjerne utnyttes i et grafisk brukergrensesnitt. Et meget enkelt grensesnitt kan for eksempel bygges for å vise rader med filinformasjon øverst i et vindu, og totalt innspart lagerplass nederst i vinduet. Fem team arbeidet med dette. Ingen av teamene hadde mye trening verken i analyse eller diagramkonstruksjon. De fikk likevel fram interessante design. To og to team slo seg sammen og presenterte hvert sitt felles forslag i henholdsvis gult og oransje lag. Det femte teamet overvåket, opponerte og pekte ut beste design til slutt. Pia Aimée Tordly fotograferte på oppfordring, tjenestevillig og uforberedt. Analyse og design Begge teamene brukte pakkesymboler i stedet for klassesymboler. Firkanter rundt teksten i pakkesymbolene kunne gjort at hvert pakkediagram inneholdt et klassesymbol. Innholdet i hver pakke er nemlig akkurat det som kunne stått innenfor klassesymbolet. Gult lag har plassert alle getterne (aksessorene) i den øverste avdelingen, som getsize, getname osv Det korrekte er å plassere alle metoder (som aksessorer, mutatorerer og hjelpemetoder) i den nederste avdelingen. Den øverste avdelingen skal inneholde
klassefelt, altså datafelt og pekere til objekter som deltar i det samarbeidet som klassen har ansvar for. Pilene viser avhengighet og navigasjonsretning. Helt korrekt UML-syntaks er i dette tilfelle åpne piler. Med den bakgrunnen gult team har i denne typen prosessarbeid, er resultatet meget bra. Oransje team ble av vurderingsteamet tildelt best bedømmelse. For å få helt korrekt UMLsyntaks inne i pakkene, ville det vært nok å sette en ekstra firkant rundt teksten og pusse ut tverrstrekene mellom klassediagrammets kant og pakkediagrammets kant. Pilene må være åpne. Siden entrypoint neppe skal kalle writelist og writesaved, kan disse metodene antagelig være private. Hvis klassen skal hete Dialog, er det antagelig konstruktøren, altså metoden Dialog(), som skulle vært tatt med, og dessuten angitt som public. Oransje team har også gjort en meget dyktig jobb ut fra forutsetningene! Keep it simple I alle sammenhenger der systemutvikling diskuteres, sies det at det enkleste er det beste. Mens dette sikkert er sant, er det vanskelig å få øye på det enkleste med en gang. Det krever faktisk erfaring og evne til organisering. Dessuten er det enklere å bygge en god programdesign når man selv definerer oppgaven.
De fleste gode programdesign og kodesamlinger utvikler seg fra kompliserte til enkle løsninger. De fleste dårlige programdesign går fra kompliserte til uhåndterlige løsninger. For å komme fram til et godt design i denne oppgaven, er det nyttig å regne med at det som regel finnes brukerkontroller som automatisk viser data fra datasamlinger som for eksempel array. For å unngå at logikk-objektet må tilby mange tjenester, kan det pakke dataene i et sammensatt returobjekt. Et forslag til løsning på denne oppgaven er basert på følgende to ideer: 1. å pakke de generelle filopplysningene inn i et array. Dermed kan arrayet brukes som input til en passende grafisk brukerkontroll. 2. å levere ferdig beregnet spart plass Oransje team hadde med løsningen i punkt 2. Det er et interessant spørsmål hvorfor ikke gult team kunne se at dette måtte være en vesentlig tjeneste å be om fra logikk-objektet? Keep it simple. Faglærers forslag til løsning: Ingen av løsningene spesifiserer tydelig kilden til filnavnet. I en praktisk løsning kan kilden godt være klassen Zipvindu eller et oppstartsargument som dermed kommer fra entrypoint. Kilden kan bare ikke være i klassen Ziplogikk. Dette ville gått ut over gjenbrukbarheten som ellers er oppnådd i dette programdesignet. Faglærers løsning spesifiserer konstruktørene i begge de nederste klassene. Dette er egentlig bare strengt nødvendig for ZipLogikk, og grunnen er å vise at konstruktøren bærer med seg argumentet filnavn. For klassen Zipvindu gjelder regelen at argumentløse konstruktører er default, det vil si at konstruktøren lages automatisk hvis vi ikke lager den selv. Men ved å ta den med som vist i
diagrammet ovenfor, kan vi spesifisere at den må lages likevel, fordi den skal spesialisere vinduet. Programmeringstips Datasamlinger som for eksempel Enumeration kan forsynes med typedeklarasjoner for enklere syntaks. Eksempel uten typedeklarasjoner, med konvertering ved kjøretidspunktet: private Enumeration untyped; untyped = z.entries(); ZipEntry filinfo = (ZipEntry) untyped.nextelement(); Eksempel med typedeklarasjoner og forhåndsbestemt type ved kjøretidspunktet: private Enumeration<? extends ZipEntry> typed; typed = z.entries(); ZipEntry filinfo = typed.nextelement(); I dette eksemplet er fordelen at man slipper typekonvertering (altså (ZipEntry) ) for objektet filinfo. I større sammenhenger er fordelene mye tydeligere. I programdesign for robuste systemer foretrekkes alltid typesterke elementer fremfor runtime konvertering. Konvertering ved runtime innebærer dessuten alltid en viss risiko. Oppgaveteksten Oppgaveteksten for de fem teamene ble først presentert muntlig, deretter vist på stor skjerm foran teamene. Oppgave for tre-grupper Oppgaven handler om et enkelt gui til klassen ZipFile og zipfilen test.zip. Når en fil lagres i zip-format, blir filen komprimert. Forskjellen mellom den normale filen og den komprimerte filen er det samme som spart plass.
Forskjellen mellom alle de normale filstørrelsene og alle de komprimerte størrelsene er det samme som totalt spart plass. Lag en analyse med klassesymboler for : Et entrypoint som heter HveZip. Et vindu som viser liste over filnavnene, størrelse og komprimert størrelse i en zip-fil et tall som viser hvor mye plass som totalt er spart for alle zipfilene tilsammen En logikk-klasse som leverer fillisten og utregnet plass som er spart totalt. Analysen skal vise hvilke tjenester (dvs metoder) klassene i analysen skal tilby. (Et programmert løsningsforslag ligger i kodesamlingen til kapittel 4) slutt på dokumentet
This document was created with Win2PDF available at http://www.win2pdf.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only. This page will not be added after purchasing Win2PDF.