Designmönster/Design patterns. Design patterns. Klassifikation av design patterns. Design patterns. Varför använda Design patterns?

Relevanta dokument
Designmönster/Design patterns

Classpath. Class loading + resurser. Class loader. jar-filer

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Akronymer. CD5130 OOP, fk. Mjukvarumönster. Mjukvarumönster. Mjukvarumönster, forts. Mjukvarumönster, forts

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Sample exam questions. Database exam TIG058

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Lösningar till tentamen i EDAF25

Klientprogrammering mot databaser

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Innehåll. Föreläsning 3. javax.naming.context. javax.sql.datasource. Vad är JDBC? Java Naming and Directory Interface(JNDI) Viktigaste metoder:

Denna laboration skapades för elever vid Roslagens Högskola men kan användas av vem som helst. Namnen på servrarna måste i så fall ändras.

Lösningar till tentamen i EDAF25

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Att skriva till och läsa från terminalfönstret

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag, tentamen i Databaser

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

LULEÅ TEKNISKA UNIVERSITET

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Laboration 2: Designmönster

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

DAT043 - Föreläsning 7

Vad är XML Schemas. XML Schemas. Varför XML Schmas. Namespace

INTRODUKTION TILL JDBC

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

F4. programmeringsteknik och Matlab

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Databasens består av: Tabell Kolumner fält Rader poster (varje post är unik)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Laboration 2: Designmönster

Tentamen Programmering fortsättningskurs DIT950

Design Patterns. En kort introduktion

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Recitation 4. 2-D arrays. Exceptions

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Föreläsning 3: Booleans, if, switch

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

" «Observable» DataGenerator" betyder att klassen DataGenerator ärver från den abstrakta klassen Observable.

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 8. Designmönster

TENTAMEN OOP

Genomgång av tentamen. Databasteknik ITHS 4/3 2016

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Generisk klass med typparameter Inre klass - ListIterator

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Chapter 4: Writing Classes/ Att skriva egna klasser.

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Den som bara har en hammare tror att alla problem är spikar

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Classes och Interfaces, Objects och References, Initialization

Fördjupande uppsats i datalogi

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad Programmering (TDDC77)

Tentamen i Objektorienterad modellering och diskreta strukturer

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Laboration 1 - Grunderna för OOP i Java

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Vyer, Prepared Statements, Triggers

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Beijer Electronics AB 2000, MA00336A,

Konstruktion av klasser med klasser

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Transkript:

Design patterns Designmönster/Design patterns Vad är det? Beprövade lösningar till återkommande programmeringsproblem Plattformsoberoende Beskrivs ofta med hjälp av UML Baseras på en bok Design Patterns, Gamma/Helm/Johnson/Vlissides (Gang of Four) Kan/bör återanvändas Ca 25 st i orginalboken Ger även en terminologi med vilken man kan 304 uttrycka designidéer på ett enklare sätt Varför använda Design patterns? Design patterns "Designing object-oriented software is hard and designing reusable object-oriented software is even harder." - Erich Gamma Beprövade lösningar sparar tid Man ska inte uppfinna hjulet igen Gör det möjligt för oss att dra nytta av andra personers erfarenheter på ett snabbt sätt Om jag t.ex. gör ett program som löser problem X och sedan ska göra ett helt annat system där samma problem X uppstår hur gör jag då för att återanvända lösningen? Design patterns är just en hjälpmedel för detta. Tillåter samtidigt oss att modifiera lösningarna så att de passar ett speciellt problem. 305 306 Design patterns Ett design pattern: Visar på hur man ska lösa ett problem rent allmänt (dvs inte i ett visst programspråk) Diskuterar olika för och nackdelar lösningen har. Hänvisningar till andra typer av lösningar på samma problem Ger exempel på hur man kan göra och även på "riktiga" användningar av lösningen. Klassifikation av design patterns Creational Patterns Handlar om hur objekt skapas Structural Patterns Handlar om hur klasser och objekt är strukturerade Behavioral Patterns Handlar om hur klasser och objekt interagerar 307 308

Creational Patterns Abstract factory Skapar objekt med okänd klass Builder Skiljer skapandet från representationen Factory method Sparar instantierandet till subklasser Prototype Skapar nya objekt från en prototyp Singleton Försäkran om enbart ett objekt av viss klass Structural Patterns Adapter - Konverterar klassens gränssnitt Bridge - Skiljer abstraktion från impl Composite - Aggregat som träd Decorator - Lägger till egenskaper Facade - Ger enhetligt gränssnitt Flyweight - Hanterar många småobjekt Proxy - Surrogat för objekt (accesskontroll) 309 310 Behavioral Patterns:1 Chain of responsibility - Överlämnar objekt Command - Kommando som objekt Interpreter - Språk ger grammatik&tolk Iterator - Accessar element sekventiellt Mediator - Kapslar in objektsamarbete Memento - Sparar objektets tillstånd Behavioral Patterns:2 Observer - Sprider ett objekts ändring till andra State - Tillståndsmaskin som byter klass Strategy - Kapslar in algoritmer Template method - Låter subklassen göra delar av algoritmen Visitor - Representerar en operation som ska utföras på en objektstruktur 311 312 Designprinciper Programmera mot ett interface, inte en implementation Handlar om beroenden mellan klasser Lätt att lägga till beroenden, svårt att ta bort Avgränsa det som ändras Det ska vara lätt att byta ut/lägga till delar som kan ändras Sträva mot lösa beroenden mellan klasser Oftast ska klasser veta så lite som möjligt om varandra Synlighetsmodifierare Observer/Observable Pattern Basic Ideas: 1. The Observer pattern is used to keep consistency between related objects while minimizing their coupling and maximizing reusability (or independence) of the objects. 2. Creates a one-to-many relationship between a subject and its observers. All observers are notified when there is a change to the subject. The observers then query the subject to synchronize themselves. 313 314

Observer/Observable When to use this pattern: 1.When a change to one object requires the change of a variable number of other objects (not necessarily known at compile-time). 2.When an object should be able to talk to another object, but you don't want them essentially dependent on each other. Observer/Observable Benefits: 1.Can add new subjects and new observers all independently of all other subjects and observers. 2.Minimal dependence between subject and observer 3.Subject doesn't need to know how many observers it has. It simply broadcasts a change in state. 315 316 Observer/Observable Observer - observable Pitfalls: 1. Because observers don't know about each other, a simple update to an observer might cause a long chain of other updates. 2. Each observer decides whether it needs to update something when it receives the notification from the subject that something has changed. Therefore, complicated observers have to do a lot of work to figure out what changed when they receive a notification. 317 Ska den veta om de andra objekten? Ska dessa känna av om nåt har hänt? Observer - Observable Observ har en lista där intresserade klienter lagras Klienterna anmäler sitt intresse Java Basklass - Observable Interface - Observer Om nåt händer så signalerar Observ till klienterna om att något har hänt Observ Klient Klient Klient Klient Jan Erik Moström Jan Erik Moström

import java.util.observable; public class IntrusionDetector extends Observable public void someonetriestobreakin() // Vi låtsas att denna metod anropas när någon // försöker hacka sig in i datorn. Detta objekt // meddelar nu detta till alla som är intresserade setchanged(); notifyobservers(); import java.util.observer; import java.util.observable; public class SysAdm implements Observer private String name; public SysAdm( String name, IntrusionDetector id ) this.name = name; id.addobserver( this ); public void update( Observable server, Object err ) System.out.println( name + " förhindrar intrång" ); public class Demo public static void main( String[] argv ) // Skapa ett objekt som kollar om någon försöker // hacka sig in i systemet IntrusionDetector id = new IntrusionDetector(); // Skapa ett objekt som vill veta om någon // försöker hacka sig in. Ge det ett namn // och tala om vad det ska vara intresserad av SysAdm stric = new SysAdm( "stric", id ); Singleton Singleton (Creational pattern) Se till att en klass bara har en instans, och ge en global access till den T.ex. fönsterhanterare, filsystemhanterare Statiska metoder (t.ex. java.lang.math) är bättre för enskilda anrop public class MySingletonClass private static MySingletonClass instance = new MySingletonClass(); // Nu låtsas vi att någon försöker ta sig in id.someonetriestobreakin(); public static MySingletonClass getinstance() return instance; /** There can be only one. */ private MySingletonClass() 324 Factory Pattern Pizzerian Ett exempel på några design patterns Factory Pattern (Creational Pattern) Ge ett interface till att skapa relaterade objekt utan att specificera deras konkreta klasser Klienten använder sig av objektet, men vet inte vilken konkret klass det bygger på, det är upp till fabriken att bestämma. Pizzerian: Vi vill ha flera olika ugnar, utan att resten av programmet behöver bry sig om vilken som används 326

Factory Pattern public interface PizzaOven public Pizza bakepizza(pizza mypizza); public class StoneOven implements PizzaOven public Pizza bakepizza(pizza mypizza) //Baka på stenugnssätt.. public class MetalOven implements PizzaOven public Pizza bakepizza(pizza mypizza) //Baka på metallugnssätt.. public class PizzaOvenFactory private String useoven = stone ; Factory Pattern public static PizzaOven getoven() if(useoven.equals( stone ) return new StoneOven(); else if(useoven.equals( metal ) return new MetalOven(); Man kan också tänka sig att getoven() tar useoven strängen som argument. Vi har ändå fortfarande skapandet i fabriken. 327 328.. //lite kod Pizza myunbakedpizza = new Pizza();.. //lite kod (lägga på fyllning) PizzaOven myoven = PizzaOvenFactory.getOven(); myoven.bakepizza(myunbakedpizza).. //lite kod Factory Pattern Hur ser klienten (användaren) ut? Vad har vi uppnått? Programmerat mot ett interface Lätt att lägga till/byta ut implementationen av ugnar utan att behöva ändra i klienten Builder Pattern Vi har en bra struktur för pizzaugnen, men vi saknar något PIZZA! Vi vill kunna ha flera olika pizzor och alla är på olika sätt (olika såser, ingredienser, osv.) Builder Pattern (Creational Pattern) Separera konstruktionen av ett komplext objekt från dess representation Till skillnad från factory pattern är vi alltså intresserade av hur ett objekt skapas, inte vilket objekt som skapas. 329 330 class Pizza private String sauce = ""; private String topping = ""; public void setsauce(string sauce) this.sauce = sauce; public void settopping(string topping) this.topping = topping; abstract class PizzaBuilder //abstrakt builder protected Pizza pizza; public Pizza getpizza() return pizza; public void createnewpizzaproduct() pizza = new Pizza(); public abstract void buildsauce(); public abstract void buildtopping(); //Konkret builder för hawaii class HawaiianPizzaBuilder extends PizzaBuilder public void buildsauce() pizza.setsauce("mild"); public void buildtopping() pizza.settopping("ham+pineapple"); //Konkret builder för salamipizza class SalamiPizzaBuilder extends PizzaBuilder public void buildsauce() pizza.setsauce( hot"); public void buildtopping() pizza.settopping("ham+salami+pepperoni"); 331 332

//Pizzakocken class PizzaChef public Pizza constructpizza(pizzabuilder pb) pb.createnewpizzaproduct(); pb.buildsauce(); pb.buildtopping(); return pb.getpizza(); //Ett exempel på beställning av pizza Builder Pattern Vad har vi uppnått? Separerat objektet (Pizza) och dess uppbyggnad (konkreta Builders) Lätt att lägga till/byta ut konkreta builders utan att ändra i objektet (Pizza). Man kan t.om. tänka sig arvshierarkier av builders. PizzaChef chef = new PizzaChef(); HawaiiPizzaBuilder hawaiianbuilder = new HawaiiPizzaBuilder(); Pizza hawaii = chef.constructpizza(hawaiianbuilder);... //lite mer kod 333 334 Ledningen bestämmer sig för att alla pizzor ska gå att få både inbakade och med ostfyllda kanter. Hur ska vi lösa detta?! Skapa flera builders? - Dålig ide.! Arvshierarki av Pizza? Dålig ide. Vi vill kunna lösa detta utan att ändra för mycket i nuvarande implementation och ändå få en lösning som är utbyggbar och inte skapar för hårda beroenden. Leder oss in på nästa design pattern Decorator Pattern Decorator Pattern (Structural Pattern) Ge ytterligare funktionalitet till ett objekt, utan att ärva från det Används ofta då arv skulle ge alldeles för många barnklasser eller inte är lika applicerbart Vi kommer att dekorera Pizza klassen med olika decorators BakedInPizzaDecorator CheeseCrustPizzaDecorator Kanske kommer fler i framtiden 335 336 Component +Operation() Vi måste göra om Pizza klassen till en abstrakt klass och lägger till en metod public abstract Pizza public String sauce; public String topping; ConcreteComponent +Operations() Decorator +Operation() public abstract void prepare(); public void setsauce(string sauce) this.sauce = sauce; public void settopping(string topping) this.topping = topping; ConcreteDecoratorA -addedstate +Operation() ConcreteDecoratorB +Operation() +AddedBehaviour() public class SimplePizza extends Pizza public void prepare() //tom implementation 338

Nu behöver vi en basklass för våra decorators (ärver från Pizza) abstract class PizzaDecorator extends Pizza //Vi måste hålla en referens till vår dekorerade pizza protected Pizza decoratedpizza; Decorator Pattern public PizzaDecorator(Pizza pizza) decoratedpizza = pizza; //klassen är abstract eftersom den inte impl. prepare() Konkret decorator för inbakade pizzor class BakedInPizzaDecorator extends PizzaDecorator public BakedInPizzaDecorator(Pizza pizza) super(pizza); //sparar undan referensen public void prepare() //Först gör vi det vi ska, sen låter vi prepare() //anropet gå vidare bakein(); decoratedpizza.prepare(); public void bakein() //kod för att förbereda en inbakad pizza. 339 340 Konkret decorator för pizzor med ostfyllda kanter class CheeseCrustPizzaDecorator extends PizzaDecorator public CheeseCrustPizzaDecorator(Pizza pizza) super(pizza); //sparar undan referensen public void prepare() //Först gör vi det vi ska, sen låter vi prepare() //anropet gå vidare addcheesecrust(); decoratedpizza.prepare(); public void addcheesecrust() //kod för att lägga till en ostfylld kant 341 Decorator Pattern Hur har detta hjälpt oss? Vi går tillbaka till vår PizzaBuilder abstract class PizzaBuilder //abstrakt builder protected Pizza pizza; public Pizza getpizza() return pizza; public void createnewpizzaproduct() //alla dessa är möjliga: pizza = new SimplePizza(); pizza = new BakedInPizzaDecorator(new SimplePizza()); pizza = new CheeseCrustPizzaDecorator( new SimplePizza()); // och tom. denna (vilket vi var ute efter) pizza = new BakedInPizzaDecorator( new CheeseCrustPizzaDecorator( new SimplePizza())); pizza.prepare(); //Olika resultat beroende på typ public abstract void buildsauce(); public abstract void buildtopping(); 342 Decorator Pattern Med hjälp av decorators och builders kan vi nu konstruera flera olika objekt (pizzor) (builder pattern) ha egenskaper som ska gå att applicera på alla objekt (decorators) fortfarande ha en arkitektur som är skalbar och har lösa beroenden Det är fortfarande en aning komplicerat att beställa pizzor Användaren (kunderna) måste veta om vilka builders och decorators som finns Leder oss in på vårt sista design pattern Façade The Façade Pattern (Structural pattern)erbjud ett enhetligt gränssnitt till en mängd klasser och objekt i ett subsystem En fasad till sub-systemet skulle göra det enklare att använda, då man inte behöver veta alla ingående komponenter Detta betyder dock inte att det inte går att komma åt komponenterna Låt oss titta på hur en fasad till pizza-systemet skulle kunna se ut 343 344

public class Waitress public Pizza orderhawaii(boolean bakedin, boolean wcheese) PizzaChef chef = new PizzaChef(); HawaiiPizzaBuilder hawaiianbuilder = new HawaiiPizzaBuilder(); Pizza hawaii = chef.constructpizza(hawaiianbuilder bakedin, wcheese); return hawaii; public Pizza ordersalami(boolean bakedin, boolean wcheese) PizzaChef chef = new PizzaChef(); SalamiPizzaBuilder salamibuilder = new SalamiPizzaBuilder(); Pizza salami = chef.constructpizza(salamibuilder bakedin, wcheese); return salami; // Här lägger vi till om vi har fler pizzor Hur ser det då ut från kundens perspektiv? public class TestClass public static void main(string[] args) Waitress waitress = new Waitress(); Façade Pizza mypizza = waitress.orderhawaii(true, false); Pizza mypizza2 = waitress.ordersalami(false, true); Detta är alltså allt som användaren behöver känna till 345 346 Databaser - kortfattat Förenklad beskrivning - om ni vill veta mer bör ni gå den ordinarie databaskursen Databaser, SQL och JDBC Vilken ide finns bakom databaser Lagra information i en strikt struktur Fritext sökning Göra det möjligt att snabbt hämta information Representera information Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Men matchar allting detta? 090 123 45 67 Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Kalle Svensson Karlsson Box 21 234 56 Tomby Svea Grahn Västgötagatan 45, 3tr 345 78 Gamby Clark Kent 21th Super Street Hero City 123-2389

Lena Andersson Kurt Olssons Väg 12 123 45 Långtbortistan 090 123 45 67 Erik Karlsson Videvägen 18 987 65 Långtbortistan 090 890 123 Mia Grahn Videvägen 1289 876 54 Långtbortistan 090 222 22 22 Fia Talltopp Storgatan 1 129 21 Långbortistan 090 123 4857 Förnamn Efternamn Jobbar Telefon Förnamn Efternamn Jobbar Telefon Förnamn Efternamn Jobbar Telefon Förnamn Efternamn Jobbar Telefon Företag Efternamn Jobbar Telefon Företag Efternamn Jobbar Telefon 1 XX XX XX 2 XX XX XX 1 XX XX XX 3 XX XX XX 2 XX XX XX 4 XX XX XX 3 XX XX XX 4 XX XX XX 1 XX XX XX 2 XX XX XX 1 1 3 XX XX XX 2 2 4 XX XX XX 2 4 2 1 1 XX 3 XX 2 XX 2 XX 3 XX 2 XX 4 XX 4 XX 3 1 3 4 1 XX XX XX 2 XX XX XX 3 XX XX XX 4 XX XX XX Hur gör man rent praktiskt?? Olika implementationer, t.ex: 1 XX XX XX 2 XX XX XX 3 XX XX XX 4 XX XX XX 1 1 2 2 2 4 2 1 3 3 1 4 1 XX XX XX 2 XX XX XX 3 XX XX XX 4 XX XX XX MySQL Postgresql Oracle SQLite SQLServer...

Databas Inte sann men ger en översikt Förenklad bild av hur det fungerar SQL Standard Query Language app Select SELECT XXX FROM YYY WHERE ZZZ JDBC app app Insert INSERT INTO XXX VALUES YYY SQL tolk Databashanterare API Delete DELETE FROM XXX WHERE YYY Update UPDATE XXX SET YYY WHERE ZZZ JDBC - princip Fyra begrepp Statement MySQL Query Java program JDBC Driver Driver Postgresql ResultSet Transaction Driver Driver Oracle... Ladda drivrutinen Class.forName( driverpath ) Öppna förbindelse con = DriverManager.getConnection( url, user, password ) Fixa till ett statement ms = con.createstatement() Gör nåt res = ms.executequery( sqlstuff ) nr = ms.executeupdate( sqlstuff ) final private static String driver = "org.postgresql.driver"; final private static String url = "jdbc:postgresql://postgres.cs.umu.se/x"; final private static String user = "X"; final private static String passwd = "X"; public static void main( String argv[] ) throws java.sql.sqlexception Connection connection; try Class.forName( driver ); catch ( java.lang.classnotfoundexception e ) System.err.println( "Problem - Kunde inte hitta drivrutinen" ); return; Jan Erik Moström

try connection = DriverManager.getConnection( url, user, passwd ); catch ( java.sql.sqlexception e ) System.err.println( "Problem - Kunde inte ansluta till databasen" ); return; ResultSet result = statement.executequery( "select last, first from names" ); System.out.println( "\n\ntest 1" ); while( result.next() ) System.out.println( result.getstring(1).trim() + ", " + result.getstring(2).trim() ); Statement statement = connection.createstatement( ); statement.execute( "create table names (first char(20), last char(20))" ); statement.execute( "insert into names (first, last) values ('Kalle', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Kajsa', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Knatte', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Fnatte', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Tjatte', 'Anka')" ); statement.execute( "insert into names (first, last) values ('Joakim', 'von Anka')" ); statement.execute( "insert into names (first, last) values ('Kalle', 'Johansson')" ); statement.execute( "insert into names (first, last) values ('Anna', 'Andersson')" ); Test 1 Anka, Kalle Anka, Kajsa Anka, Knatte Anka, Fnatte Anka, Tjatte von Anka, Joakim Johansson, Kalle Andersson, Anna result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 2" ); while( result.next() ) System.out.println( result.getstring(1).trim() + ", " + result.getstring(2).trim() ); result = statement.executequery( "select last, first from names where last = 'Anka' order by last, first" ); System.out.println( "\n\ntest 3" ); while( result.next() ) System.out.println( result.getstring(1).trim() + ", " + result.getstring(2).trim() ); Test 2 Andersson, Anna Anka, Fnatte Anka, Kajsa Anka, Kalle Anka, Knatte Anka, Tjatte Johansson, Kalle von Anka, Joakim Test 3 Anka, Fnatte Anka, Kajsa Anka, Kalle Anka, Knatte Anka, Tjatte statement.execute( "update names set first = 'Karl' where first = 'Kalle'" ); result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 4" ); while( result.next() ) System.out.println( result.getstring(1).trim() + ", " + result.getstring(2).trim() ); statement.execute( "delete from names where last = 'Anka'" ); result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 5" ); while( result.next() ) System.out.println( result.getstring(1).trim() + ", " + result.getstring(2).trim() ); Test 4 Andersson, Anna Anka, Fnatte Anka, Kajsa Anka, Karl Anka, Knatte Anka, Tjatte Johansson, Karl von Anka, Joakim Test 5 Andersson, Anna Johansson, Karl von Anka, Joakim

String first = "Arne"; String last = "Anka"; statement.execute( "insert into names (first, last) values ('" + first + "', '" + last + "')" ); result = statement.executequery( "select last, first from names order by last, first" ); System.out.println( "\n\ntest 6" ); while( result.next() ) System.out.println( result.getstring(1).trim() + ", " + result.getstring(2).trim() ); Precompiled statements first = "Arne', 'Anka'); drop table names; insert into funny ( woop, miff) values ('Kalle"; last = "Anka"; PreparedStatement prep = con.preparestatement( "INSERT INTO XXX (a,b,c) VALUES (?,?,?)" ) prep.setxxx( index, value ) statement.execute( "insert into names (first, last) values ('" + first + "', '" + last + "')" ); prep.executeupdate... etc Datatyper i databaser Olika databaser stödjer olika datatyper postgresql - smallint, integer, bigint, decimal, real, serial, money, varchar, text, timestamp, date, time, byte, boolean, etc. mysql - char, varchar, tinytext, text, blob, longtext, tinyint, int, bigint, date, datetime, timestamp, time, etc. Vad ska man tänka på? Tänk några steg framåt - Förändringar i framtiden - Överdesigna inte Lagra information på ett ställe Ofta bra att ha ett unikt id på (nästan) varje post Gör inte en databashanterare i ditt program!!! - Utnyttja databashanteraren och låt den göra jobbet

Validera att dokument är riktiga Varför validera? Jo, för att få enklare kod Validera XML dokument <person!id="89">!!!!<first>kalle</first>!!!!<last>anka</last> </person> Jan Erik Moström Alternativ XML Schema DTD - Document Type Definition <!ELEMENT font (name,size)> XML Schema Beskriver hur XML dokumentet ska se ut Är själv ett XML dokument Vad gör ett XML Schema definierar element <xsd:element!name="font">!!!!<xsd:sequence>!!!!!!!!<xsd:element!name="name"!type="xsd:string"!/>!!!!!!!!<xsd:element!name="name"!type="xsd:int"!/>!!!!</xsd:sequence> </xsd:element> definierar attribut definierar datatyper Jan Erik Moström Vad innehåller ett schema <?xml!version="1.0"?> <xsd:schema!xmlns:xsd="http://www.w3.org/2001/xmlschema"> </xsd:schema> Innehåll Type defintion - simple eller complex Elementdefinitioner Attributdefinitioner Simple type Inga sub-element Inga attribut Complex type Har sub-element, element eller attribut Globala definitioner Dokumentens rotelement Kan refereras

<?xml!version="1.0"?> <xsd:schema!xmlns:xsd="http://www.w3.org/2001/xmlschema">!!!!<xsd:element!name="purchaseorder"!type="purchaseordertype">!!!!<xsd:element!name="comment"!type="xsd:string"!/>!!!!<xsd:complextype!name="purchaseordertype">!!!!!!!!</xsd:complextype> </xsd:schema> <?xml!version="1.0"?> <xsd:schema!xmlns:xsd="http://www.w3.org/2001/xmlschema">!!!!<xsd:element!name="purchaseorder"!type="purchaseordertype">!!!!<xsd:element!name="comment"!type="xsd:string"!/>!!!!<xsd:complextype!name="purchaseordertype">!!!!!!!!<xsd:sequence>!!!!!!!!!!!!<xsd:element!name="shipto"!type="usaddress"!/>!!!!!!!!!!!!<xsd:element!name="billto"!type="usaddress"!/>!!!!!!!!!!!!<xsd:element!ref="comment"!minoccurs="0"!/>!!!!!!!!</xsd:sequence>!!!!</xsd:complextype>!!!!<xsd:complextype!name="usaddress">!!!!!!!!!!!!</xsd:complextype> </xsd:schema> Finns fördefinerade typer (simple) xsd:string xsd:date xsd:qname xsd:time xsd:int xsd:datetime xsd:long xsd:decimal xsd:double xsd:boolean <xsd:element!name="lastname"!!type="xsd:string"!/> <xsd:element!name="age"!!!!!!!type="xsd:int"!/> <xsd:element!name="birthdate"!type="xsd:date"!/> <lastname>andersson</lastname> <age>34</age> <birthdate>2006-12-18</birthdate> <xsd:attribute!name="nationality" type="xsd:string"!/> <person!nationality="sweden">kalle!anka</person> Begränsningar <xsd:simpletype!name="cartype">!!!!<xsd:restriction!base="xsd:string">!!!!!!!!<xsd:enumeration!value="audi"!/>!!!!!!!!<xsd:enumeration!value="ford"!/>!!!!!!!!<xsd:enumeration!value="volvo"!/>!!!!</xsd:restriction> </xsd:simpletype> <xsd:element!name="car"!type="cartype"> minoccurs, maxoccurs default = 1, max kan vara "unbounded" Sequence - Choice - All

Validera vid parsning String schemalang = "http://www.w3.org/2001/xmlschema"; SchemaFactory schemafactory = SchemaFactory.newInstance(schemaLang); //create schema by reading it from an XSD file Schema schema = schemafactory.newschema( new StreamSource("classes.xsd")); factory.setschema(schema); //add validation using the schema DocumentBuilder parser = factory.newdocumentbuilder(); Document document = parser.parse( new InputSource( r ) ); Validera separat import!javax.xml.transform.stream.streamsource; import!javax.xml.validation.schema; import!javax.xml.validation.schemafactory; import!javax.xml.validation.validator; import!org.xml.sax.saxexception; public!class!test!!!public!static!void!main(string[]!args)!!!!!try!!!!!!!//!define!the!type!of!schema!-!we!use!w3c:!!!!!!string!schemalang!=!"http://www.w3.org/2001/xmlschema";!!!!!!//!get!validation!driver:!!!!!!schemafactory!factory!=!schemafactory.newinstance(schemalang);!!!!!!//!create!schema!by!reading!it!from!an!xsd!file:!!!!!!schema!schema!=!factory.newschema(new!streamsource("sample.xsd"));!!!!!!validator!validator!=!schema.newvalidator();!!!!!!//!at!last!perform!validation:!!!!!!validator.validate(new!streamsource("sample.xml"));!!!!catch!(saxexception!ex)!!!!!!!//!we!are!here!if!the!document!is!not!valid:!!!!!!//!...!process!validation!error...!!!!!catch!(exception!ex)!!!!!!!ex.printstacktrace();!!!!!! Validera mha DTD // Create a new DOM Document Builder factory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // Turn on validation factory.setvalidating(true); // Create a validating DOM parser DocumentBuilder builder = factory.newdocumentbuilder();