"Nelsons affebuti" et esempel på systemutviling med objeter Originale lysar av Jens Kaasbøll - mindre endringer av G. Sagestein og Knut Hegna IN5-javaNelson- Analyse Lageradministrasjon (inventory) Mange affeslag (blend, ind, coffee, type):, columbians, VIP, enyans, o Hvert affeslag har et, en, på lager, minimumsnivå, streode Hvert affeslag leveres i er (batches) o Hvert har en og en Funsjoner o Klargjøre for motta av er o Vise data o Sjee minimumsbeholdning o Sjee hvor mye tilgjengelig o Endre o Legge til et til beholdning o Selge affe o Fjern for gammel affe IN5-javaNelson-3 Nelsons affebuti Området som programmet sal handle om Oppgavene som bruerne (undene) sal gjøre Testreefølge: En funsjon om gangen Bruerevaluering Programutførelse og test Kompilering og retting av syntasfeil Analyse Hva består området av? Hvile funsjoner sal programmet dee? Kravspesifiasjon Design Hvordan sal programmet strutureres? Program og datastrutur Kodingsreefølge En funsjon om gangen En lasse om gangen Koding Velge array, evt. flere dimensjoner HashMap Nelsons affebuti modifisert (Gently 8.6) IN5-javaNelson-2 Analyse: Modell av butien Ett affelager Flere slag (type) Flere er for hvert slag mange mange IN5-javaNelson-4
Design: Metoder i -objetet Gently side 235 nyttparti() viskaffe() nytt() () sjeutløpsdato() lagerverdi() lesfrafil() Det lages bare en instans (et objet) av denne lassen utførordre() srivpåfil() IN5-javaNelson-5 Design: Velge datastrutur Array HashMap Lengde Fast Ubegrenset Ordning til max- 2 og flerdimensjonale Ingen Gjennomløp Enel for-løe Iteration put Sette inn objet Tilordning Oppdatere antall Ta ut objet Tilordning, evt. flytting, oppdatere antall Søing Ingen get remove Kaffe Ubegrenset antall 2 Ingen ordning 3 Gjennomløpes ved les/sriv på fil 4 Opprette og fjerne 5 Søing etter et HashMap Kaffeene Ubegrenset antall 2 Stadig nye inn og ut 3 Kronologis ordning 4 Gjennomløpes ved les/sriv på fil 5 Opprette nye, fjerne eldste 6 Ingen søing, ta neste Array best 3 6, HashMap 2 IN5-javaNelson-7 Design: Metoder i de øvrige objetene Gently side 235 () vispåsjerm() sjeminimumsbeholdning(int dato) endrepris() nyttparti() () double 6. Boolean sjeutløp(int dato) sjeutløp(int dato) vispåsjerm double tilgjengelig() 999723 lesfra(stream innfil) lesfra (Stream innfil) srivpå(stream utfil) srivpå (Stream utfil) IN5-javaNelson-6 Dato og tid har lasser for dette i paen util + Mange muligheter Tungt å sette seg inn i Kan brue int int dato, dato 2; dato < dato2 ønser vi sal bety at dato ommer før dato2. Leser derfor alle datoer inn fra terminal og fil på formen ååååmmdd IN5-javaNelson-8
Modellen Kenyan Columbian 78.9 62.5 999723 6. 3. 2. 99988 9996 8. 9995 IN5-javaNelson-9 Konstrutør og utførordreogtavarepådata () = new HashMap(); in = new Stream (System.in); fil = "affe.data"; void utførordreogtavarepådata() lesfrafil(); utførordre(); srivpåfil(); in fil affe.data IN5-javaNelson- Kontrolløren KaffeKontroll main l = new (); l.utførordreogtavarepådata(); l IN5-javaNelson- Filformat 3 Antall affeslag Columbian 62.5 2 Navn på affeslag Pris Antall er 3. 22 Mengde Utløpsdato 7. 22 83.5 2. 2 Kenyan 78.9 8. 26 IN5-javaNelson-2
void lesfrafil() lesfrafil ; innfil = new Stream (fil, Stream.READ ); int antslag = innfil.readint( ); for (int i=; i<=antslag; i++) { = new ( );.lesfra(innfil);.put(.,); // Slutt for fil innfil void lesfra(stream innfil) = innfil.readstring( ); = innfil.readdouble( ); = innfil.readint( ); for (int i=; i<=; i++) { [i] = new (); [i].lesfra( ); () = new [+]; innfil fil affe.data void lesfra(stream innfil) innfil = innfil.readdouble( ); = innfil.readint( ); 6. 999723 IN5-javaNelson-3 Reefølge i oding Etter å ha larlagt funsjonalitet datastrutur og programstrutur sal de enelte metoder defineres og odes. To veier: En funsjon av gangen med nødvendige metoder i hver lasse for å unne utføre funsjonen o Es: Innlesing i personregister + Kan teste hver funsjon hvis vi har utsriftsrutiner Må holde oversit over variable i mange lasser Vil følge denne reefølgen i Kaffebutien En lasse av gangen med de metodene som trengs for å utføre alle funsjoner + Konsentrasjon om variablene i denne lassen Må unne forutse hva en metode i en annen lasse an gjør IN5-javaNelson-5 Testing For å teste en funsjon, må vi ha en måte å observere hva den gjør lesfrafil lager endringer i modellen i primærlageret, så vi an ie vite hva den gjør før vi lager utsriftsmetoder IN5-javaNelson-4 Organisering av metodene Standard framgangsmåte for oding av en av de ordrene programmet sal utføre er å lage en metode i hvert objet som gjør sin jobb med å søe / lese av / oppdatere variablene i sitt objet for denne ordren Metoden i aller metoden i som igjen aller metoden i mange mange IN5-javaNelson-6
srivpåfil void srivpåfil() ; utfil = new Stream (fil, Stream.WRITE); utfil.println(.size()); Iterator it =.values( ).iterator ( ); while (it.hasnext ( )) { = () e.next();.srivpå( utfil ); utfil.close( ); fil innfil fil affe.data utførordre void utførordre () String ordre=""; while (!ordre.equals( "A" )) { System.out.println ("Ordre (Vis all affen, " + "nytt Kaffeslag, nytt Parti, " + "Selg, sje Utløpsdato, " + "Lagerverdi, Avslutt)?" ); ordre = in.readstring( ); if ( ordre.equals ( "V" )) { viskaffe ( ); else if ( ordre.equals ( "K" )){ nytt( ); else if ( ordre.equals ( "P" )){ nyttparti( ); else if ( ordre.equals ( "S" )){ selg( ); else if ( ordre.equals ( "U" )){ sjeutløpsdato( ); else if ( ordre.equals ( "L" )){ lagerverdi( ); // Slutt ommando-løa in IN5-javaNelson-7 IN5-javaNelson-9 og srivpå 3 void srivpå(stream utfil) utfil.println(+" "++" "+antallpartier()); for (int i=; i<=; i++) [i].srivpå(utfil); utfil fil void srivpå (Stream utfil) affe.data utfil utfil.println(+" "+); 6. 999723 IN5-javaNelson-8 viskaffe void viskaffe() ; Iterator it =.values( ).iterator( ); while ( it.hasnext( )) { = () it.next( );.vispåsjerm( ); IN5-javaNelson-2
og vispåsjerm 3 void vispåsjerm() System.out.println( ); System.out.println(); System.out.print( "Pris: r" + Stream.format(,6,2)); System.out.println(" Antall er: " + antallpartier( )); System.out.println(" Mengde Utløpsdato"); for (int i = ; i <= ; i++) [i].vispåsjerm( ); // slutt vispåsjerm void vispåsjerm() System.out.println( Stream.format (, 6, ) + " " + ); 6. 999723 IN5-javaNelson-2 Nytt affeslag-objet Brazilian 72.5 (String n, double p) // Konstrutør som får verdier tilsendt = n; = p; = new [+]; IN5-javaNelson-23 nytt void nytt( ) throws IOException System.out.print( "Navn? " ); String = in.readstring( ); System.out.print( "Pris? " ); double = in.readdouble( );.put(, new (,)); 72.5 Brazilian må ha en onstrutør som tar verdier gjennom parametre IN5-javaNelson-22 Design: Invariant for -arrayen Nye er settes inn sist i int er indesen for (nyeste) som er satt inn Gamle er tas ut fra begynnelsen int er indesen for (eldste) som stadig er med int er høyeste indes i Invariant: <=i<: [i] = <=i<=: [i]!= <i<=: [i] = Når == og det ommer et nytt, flyttes alle ene først i arrayen, sli at == IN5-javaNelson-24
selg void ; String ; System.out.print ( "Kaffeslag? " ); = in.readstring( ); // Leter fram affeslaget med dette et: = ().get(); if (!=) { // Et affeslag med dette et ble funnet.selg( ); else System.out.println( "Belager ingen affe som heter " + ); IN5-javaNelson-25 selg Testdata for salg; double selg(double vilselge) double solgt; if (>=vilselge) { = -vilselge; return vilselge; else { solgt = ; = ; return solgt; vilselge 6 Et affe som ie fins Mer enn på lager Mer enn det er i ett Mindre enn det et for salg 6. 999723 IN5-javaNelson-27 selg void double vilselge; System.out.print( "Hvor mange ilogram? " ); vilselge = in.readdouble( ); if (vilselge > pålager( )) System.out.println( "Belager, vi har bare " + pålager( )+ " på lager nå" ); else { double solgtnå =, igjenåselge = vilselge; for (int i = ; igjenåselge > ; i++) { solgtnå = [i].selg( igjenåselge ); igjenåselge = igjenåselge - solgtnå; fjerntommepartier( ); 5 9 vilselge solgtnå igjenåselge double pålager() double beholdning=; for (int i=; i<=; i++) { if ([i]!= ) beholdning = beholdning + [i].; // Slutt for return beholdning; beholdning IN5-javaNelson-26 fjerntommepartier void fjerntommepartier() 5 9 for (int i=; i<=; i++) { if ([i]!= ) { // Unødvendig test hvis invarianten holder if ([i].==) { [i]=; = i+; // Slutt if ([i]!= ) // Slutt for Testes enlest ved å sette til 3 eller et annet lite tall IN5-javaNelson-28
sjeutløpsdato void sjeutløpsdato( ) int dato; System.out.print( "Dato (ååååmmdd)? " ); dato = in.readint( ); ; Iterator it =.values( ).iterator( ); while ( it.hasnext( )) { = () it.next( );.sjeutløpsdato(dato); // slutt while dato 99935 IN5-javaNelson-29 void nyttparti() 7 if (== & ==) { System.out.println("Belager, programmet er fullt"); else { if (==) { // Her er > // Flytter alle objetene sli at de starter i [] for (int i=; i<=; i++) [i-+] = [i]; = antallpartier(); = ; ; ++; [] = new (); [].lesfraterminal(); // Slutt else 9 nyttparti IN5-javaNelson-3 sjeutløpsdato 7 double sjeutløpsdato(int dato) for (int i=; i<=; i++) { if ([i].<dato) { [i]=; = i+; // Slutt if // Slutt for 9 dato 99935 IN5-javaNelson-3 lesfraterminal void lesfraterminal() System.out.print ("Mengde? "); = in.readdouble( ); System.out.print ("Utløpsdato (ååååmmdd)? "); = in.readint( ); 6. 999723 Fullstendig program via programesempelsida IN5-javaNelson-32