Objektorienterad programmering E Telefonboken, än en gång Föreläsning 5 Wrapper classes Exempel, histogram. Inldening om undantag. Mer om klassen Påminnelse Vår senaste version bestod av två klasser, bägge på cirka 35 rader (inklusive tomma rader). SimplePhoneBook, en klass vars instanser kan lagra många par (namn,nummer) samt tillhandahåller metoderna put och get. Main, som innehåller main-rutinen, som sköter interaktionen med användaren. Ett scenario Tänk er att de två klasserna är så omfattande att två skilda programmeringsteam måste ansvara för utvecklingen av de två delarna. Vilken överenskommelse måste de göra innan de kan börja arbeta var för sig? Gränssnitt En generell princip För att delsystem ska kunna utvecklas var för sig och ändå samverka måste man noga specificera gränssnittet (eng interface) mellan de två systemen. Exempel Exempel Telefonboken med gränssnitt specificerat, del 1 PhoneBook.java public interface PhoneBook { public void put(string name, String nr); public String get(string name); SimplePhoneBook.java public class SimplePhoneBook implements PhoneBook { 19mm långa stift, 4.8 mm diam, 19 mm centrumavstånd. 230 V växelström, 50 Hz. Vänster koppling, mitten broms, höger gas.... Resten av klassen oförändrad Kompilatorn kontrollerar att klassen verkligen har metoderna i interfacet, med rätt parametrar.
Telefonboken med gränssnitt specificerat, del 2 Interaction.java import java.util.; public class Interaction { public static void interact(phonebook book) {... All kod från den tidigare main Kompilatorn kontrollerar att parametern book används på rätt sätt (bara book.put och book.get, med rätt parametrar). PhoneMain.java public class PhoneMain { public static void main(string[] args) { Interaction.interact(new SimplePhoneBook(100)); Otaliga tillämpningar Kan vi definiera generella klasser för många situationer? Två grundidéer Modellklassen som objekt Det är naturligt att tänka på histogram som objekt. Vi kan skapa ett histogram med given klassindelning, lägga till nya datavärden, rita histogrammet,... Vi vill därför definiera en klass från vilken vi kan skapa flera olika histogramobjekt. Separera modell och vy Definiera en klass för att hålla reda på data och en annan (eller flera andra) för att visualisera data. Många frågor 1 Vilken typ av data? (int, double?) 2 Vilken intervallindelning? 3 Kan data hamna utanför intervallen? Vad gör man då? Slutsats: Ingen lösning passar alla situationer. Ett exempel på tänkbara svar 1 Data är av typ double. 2 Givna min- och maxvärden; lika breda intervall. 3 Var beredd på data utanför [min,max]. Räkna dessa också. Definiera först ett interface baserad på dessa svar.
Interfacet.java public interface { public void addobs(double obs); public double getmin(); public double getmax(); public int getnrclasses(); public int getobscount(int i); public int getsmallvalues(); public int getbigvalues(); Att definiera en klass för histogram Vilka tillståndsvariabler behövs? Vilka parametrar ska konstrueraren ha? Implementera alla metoder., inledning Ett undantag (eng exception) är en händelse under exekvering som bryter den vanliga exekveringsordningen. I enklaste fallet avbryts programmet och ett felmeddelande skrivs ut. i Java Java har komplicerade regler och mekanismer för undantag. Dessa är delvis kontroversiella. Vi kommer bara att hantera enkla fall i den här kursen. ; några exempel Ett exempelprogram public class Exceptions { public static void main(string[] args) { String[] a = new String[5]; int n = Integer.parseInt(args[0]); System.out.println(a[n].length()); Vad händer vid exekvering i dessa tre fall? > java Exceptions > java Exceptions abc > java Exceptions 3 ; olika typer Programmeringsfel En vanlig anledning till undantag är att programmeraren tänkt fel och missat något möjligt fall. Typiskt avbryts programmet med ett felmeddelande. Några vanliga undantag och motsvarande programmeringsfel ArrayIndexOutOfBoundsException Försök att indicera i ett fält till ett element som inte finns. NullPointerException Försök att anropa en metod hos ett objekt, men där referensen är null. NumberFormatException Försök att konvertera en sträng till tal, där strängen innehåller otillåtna tecken.
Att skicka undantaget vidare En metod som kan råka ut för undantag när den anropar andra metoder måste deklarera att den själv kan kasta undantaget: import java.util.; import java.io.*; public class Exceptions3 { public static void main(string[] args) throws FileNotFoundException { in = new (new File(args[0])); int count = 0; while (in.hasnext()) { in.next(); count++; System.out.println(args[0]+" contains "+count+" words"); En användning av histogram Temperaturdata för Göteborg På SMHI s webbplats kan man finna datafiler med dagliga temperaturdata från och med 1973 för 52 mätstationer. Filen för Göteborg börjar 7142 GÖTEBORG A 1973 2008 0101 1231 577000. 119800. DATUM TT1 TT2 TT3 TTN TTTM TTX 19730101-0.4-0.2-0.3-1.1-0.3 0.5 19730102 0.8 2.0 3.7-0.6 2.1 3.8 19730103 5.0 5.8 1.8 1.7 3.9 6.3 Kolumnen TTX är maxtemperaturen för den aktuella dagen. Skriv ett program som visualiserar maxtemperaturen i Göteborg. Att söka i textfiler Mer om klassen En webbservers loggfil En webbserver lagrar normalt information om varje access i en loggfil, typiskt i formatet Combined Log Format. Varje access beskrivs med en rad. En sådan rad (radbruten här av utrymmesskäl) 148.123.045.101 - - [23/Jan/2010:09:05:35-0100] "GET schedule.html HTTP/1.0" 200 3427 "-" "-" En loggfil innehåller ett stort antal sådana rader. Vi vill rensa bort allt utom storlekarna på de hämtade filerna (3427 bytes i ovanstående rad). Hur gör man? Sökning efter mönster (eng. patterns) Klassen innehåller metoden String findinline(string pattern) som försöker hitta en sträng som matchar pattern på den aktuella raden. Misslyckas detta returneras null och aktuell position är oförändrad. Reguljära uttryck Matchningen utnyttjar reguljära uttryck. Reguljära uttryck utnyttjas i många sammanhang för sökning.
Reguljära uttryck Härnäst Ett reguljärt uttryck är en sträng där vissa tecken (metatecken) har särskild betydelse. Metatecken är + *? [ ] ^. Matchning Vi ger exempel på när ett reguljärt uttryck matchar en sträng. "a[dg]a" matchar "ada" och "aga". "a[d-g]a" matchar "ada","aea", "afa" och "aga". "a[1-4]" matchar "a1","a2", "a3" och "a4". "ab+a" matchar "aba","abba", "abbba"... "ab*a" matchar samma strängar och också "aa". "[0-9]+" matchar alla icke-tomma strängar med bara siffror. Labbar Gör färdigt labb 3 (deadline på måndag). Labb 4 utnyttjar sökning med reguljära uttryck. Nästa föreläsning Mer om grafiska program och undantag.