Løsningsforslag Test 2 Oppgave 1.1: Interface definerer et grensesnitt som kan implementeres av flere klasser. Dette gir en standardisert måte å kommunisere med objekter av en eller flere relaterte klasser. Det ansees som god OOP å kommunisere via interfaces fremfor klassene direkte, da dette gir muligheten til å bytte implementasjoner bare ved å bytte ut et objekt med et annet som implenterer det samme interfaces. Oppgave 1.2 Multiple arv kan være problematisk på flere måter. Et par eksempler: Hver av subklassene kan ha en metode eller egenskap med samme navn. Hver av subklassene kan igjen arve fra samme klasse. I begge disse tilfellene vil det være problematisk å skille variable og metoder fra hverandre. En ulempe kan være at dette gir noen begrensninger på måten man kan bygge opp trestrukturen av klasser. Java gjør opp for denne mangelen ved at man kan implementere flere interface. En annen ulempe er at interfaces ikke kan ha deler av koden ferdig og at det ikke kan definere klassevariabler. Oppgave 1.3 En Comparator gir muligheten å sortere en samling objekter på flere måter enn den ene måten definert av Comparable.compareTo. F.eks. En klasse, Person implementerer Comparable.compareTo slik at den sammenligner navnene til personene. En comparator kan da lages som i stedet sammenligner alderen til to personer eller en annen egenskap den saks skyld. Oppgave 1.4 Bedre sikring av data (både backup og tilgangskontroll). Ekstremt mye raskere uthenting av mere kompliserte utvalg. osv. Spesialisert spørrespråk som gjør uthentign av kompliserte spørringer "enkelt"
Oppgave 1.5 Det hele er basert på et eneste interface, Collection som definerer en rekke standard operasjoner man skal kunne utføre på en dynamisk datastruktur. Alle klasser som implementerer dette grensesnittet kan brukes på samme måte. Hvordan data blir lagret, er skjult for brukeren. I tilegg har man flere spesialiseringer, slik som Set (uordnet mengde) og List ( ordnet liste) Arven medfører også at man kan skiller datastruktur og implementasjon. Man jobbe ri programmet med kode tilhørende en datatruktur og kan dermed veldig enkelt endre implementasjons klassen. Oppgave 1.6 Gjenbruk - Gjenbruk - Gjenbruk Det er viktig å tenke ut gode grensesnitt og prøve å skjule detaljene. Plasser gjerne grensesnittet i et eget interface for ytterligere bedre skille. Gjenbruk - Gjenbruk - Gjenbruk Tenk på: Enkelhet i bruk ( forstålige medtode/variablenavn, metodene skal kunne kjøres i ulike rekkefølger Gjenbruk - Gjenbruk - Gjenbruk Sikkerhet for upåtenkte verdier ( get/set metoder) God dokumentasjon ( javadoc) Gjenbruk - Gjenbruk - Gjenbruk God feilhåndtering ( Exceptions) Totalt uavhengig fra en konkret applikasjon ( mest mulig generell i bruk) Gjenbruk - Gjenbruk - Gjenbruk Gjenbruk Og sist men ikke minst: GJENBRUK!
Oppgave 2.1 public LinkedList<String> lesinn( String filnavn ) LinkedList<String> res = new LinkedList<String>( ); BufferedReader br = new BufferedReader( new FileReader( filnavn ) ); String line; while( ( line = br.readline( ) )!= null ) res.add( line ); catch( FileNotFoundException e ) catch( IOException e ) return res; Oppgave 2.2 public LinkedList<String> filter( LinkedList<String> liste, String pattern ) LinkedList<String> res = new LinkedList<String>( ); Pattern p = Pattern.compile( pattern ); Matcher m = null; for( int i = 0; i < liste.size( ); i++ ) String str = liste.get( i ); m = p.matcher( str ); if( m.matches( ) ) res.add( str ); return res;
Oppgave 2.3 public void sendmail( LinkedList<String> liste, String id, String tittel, String melding, String fra ) BufferedWriter bw = new BufferedWriter( new FileWriter( id + ".dat" ) ); for( int i = 0; i < liste.size( ); i++ ) String mottaker = liste.get( i ); boolean sendt_mail = Email.sendMail( fra, mottaker, tittel, melding ); if(! sendt_mail ) bw.write( mottaker ); catch( IOException e ) bw.close( ); catch( FileNotFoundException e )
Oppgave 2.4 import java.io.*; import java.util.*; class sentcheck public static void main( String[] args ) if( args.length == 1 ) sentcheck res = new sentcheck( ); LinkedList<String> m = res.lesinn( args[ 0 ] + ".dat" ); System.out.println( "Antall: " + m.size( ) ); else for( int i = 0; i < m.size( ); i++ ) System.out.println( m.get( i ) ); System.out.println( "Kor e parameterane?" );+ //Oppgave 2.1... Kan dere bare skrive at dere referer til denne... public LinkedList<String> lesinn( String filnavn ) LinkedList<String> res = new LinkedList<String>( ); BufferedReader br = new BufferedReader( new FileReader( filnavn ) ); String line; while( ( line = br.readline( ) )!= null ) res.add( line ); catch( FileNotFoundException e ) catch( IOException e ) return res;
Oppgave 3.1 Vi trenger et interface: interface ConnectionOKListener public void checkperformed(string url, boolean success); Vi trenger en liste I ConnectionMonitor, som holde rpå alle ConnectionOKListerene: ArrayList<ConnectionOKListener> coklisteners = new ArrayList<ConnectionOKListener>(); Vi trenger en metode i Connectionmonitor som vi kan legge til lyttere i lista gjennom: public void addconnectionoklistener(connecionoklistener cokl) coklisteners.add(cokl); Vi trenger et kall til alle registrerte listeneres for hver sjekk som blir utført i ConnectionMonitor. for(connectionoklistener col:coklisteners) col.checkperformed(????,????); Vi trenger også en klasse som lytter.. her kun et eksempel: class Lytter implements ConnectionListener public void checkperformed(string url, boolean success) System.out.println(url + " " + success); Vi må registrere denne lytteren i ConnectionMonitor. cm.addconnectionoklistener(new Lytter());
Oppgave 3.2 class DBListener implements ConnectionOKListener public void checkperformed(string url, boolean success) Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); con = DriverManager.getConnection("jdbc:microsoft:sqlserver://donau.hiof.no:1 433;databaseName=db", "user", "pass"); stmnt = con.createstatement(); String sql = "INSERT INTO ServerLogg VALUES(' NOW()','" + url + "','" + (success?"ok":"ikke OK") + "');"; int res = stmnt.executeupdate(sql); catch (Exception e) e.pringstacktrace(); Oppgave 3.3 class Reliability implements ReportPrint public String formatreport( ArrayList<LoggLine> al, String url ) int ok = 0; int alle = 0; for(loggline l:al) boolean status = l.status; alle++; if( status == true ) ok++; return "Oppeprosent: " + (( 100 / alle ) * ok );