Jens Bennedsen 2002Objektorienteret systemudvikling1.1 Objektorienteret design Persistens - introduktion
Jens Bennedsen 2002Objektorienteret systemudvikling1.2 Mål Hvilke mål er der for persistens? –Transparens Det er ikke synligt i koden at systemet er persistent Systemet kan køre uden fil el. andet er tilstede –Sikkerhed Alle data er intakte uanset crash –Kun relevante dele af systemet i memory ad gangen Gigantisk model –Data er tilgængelige andre steder fra Standardiseret format data gemmes i –Kode ændringer i model medfører små ændringer i persistensdel Det skal være muligt at tilføje/fjerne/ændre i model uden at persistensdelen skal radikalt ændres –Platformsuafhængighed mht persistensdel Der skal kunne anvendes flere databaser el. andet.
Jens Bennedsen 2002Objektorienteret systemudvikling1.3 Undervisningsform Vi ser overordnet på en række løsninger –Stigende kompleksitet –Stigende mængde af ønsker der imødeokmmes –Som applikationsprogrammør Brug af framework (Gen-)brug af andres kode
Jens Bennedsen 2002Objektorienteret systemudvikling1.4 Overordnede løsninger 1.Hent og gem ved opstart/afslutning 2.Som 1 men med transparens 3.Sikkerhed mod crash - løbende hent/gem 4.”Persistenslager” altid synkront med model Transparensgrad Opdateringshyppighed Start/slutpr. x minutter”altid” 1 234
Jens Bennedsen 2002Objektorienteret systemudvikling1.5 Gennemgående system
Jens Bennedsen 2002Objektorienteret systemudvikling Load/store ved opstart/nedluk Controlleren holder hele modellen og henter/gemmer den Controller.loadModel("model.dat"); /* Here we could go into the message- * processing loop of a message driven * GUI application. Instead we just call a * method on the TestDriver. */ TestGUI.runCommandLoop(); Controller.storeModel("model.dat");
Jens Bennedsen 2002Objektorienteret systemudvikling Hent/gem m. transparens Der skal laves kode i Controlleren til at gemme/hente alle containere – det kan gøres generelt Man skal registrere de objekter der ønskes gemt public static void registerRoots(PersistenceController pc) { pc.registerRoot("Controller", "teachers"); pc.registerRoot("Controller", "students"); pc.registerRoot("Controller", "courses"); }
Jens Bennedsen 2002Objektorienteret systemudvikling Sikkerhed mod crash Ved den forrige løsning er modellen i memory og på disk kun konsistent ved opstart og nedlukning Gem modellen med faste mellemrum –”Persistenslager” overholde evt. ikke invariant
Jens Bennedsen 2002Objektorienteret systemudvikling Opdateringshypighed: ”Altid” Serialisering giver ikke mening! Anvendelse af en relationel database –Simpel mulighed for mere finkornet opdatering –andre kan anvende de genererede data –få alle fordele fra en RDB I de tidligere løsninger kan RDB også anvendes!
Jens Bennedsen 2002Objektorienteret systemudvikling1.10 Arkitektur af persistensframework Model Persistens- controller Observer Observer Subject (Observable) Observer DB
Jens Bennedsen 2002Objektorienteret systemudvikling1.11
Jens Bennedsen 2002Objektorienteret systemudvikling1.12 Konkret løsning Persistens- controller Observer Observer Subject (Observable) Observer Model Controller DB 1: notifyObservers2: update 3: UPDATE … SET … WHERE …
Jens Bennedsen 2002Objektorienteret systemudvikling1.13 Konkret løsning Database skema konstrueres automatisk på baggrund af klassemode –refleksion –transient Anvendt database: MySQL –mapning af typer til DB-typer
Jens Bennedsen 2002Objektorienteret systemudvikling1.14 Applikationsprogrammør Modeltilstandsændrende operationer –Konstruktør –Modifiers (f.eks. set-metoder) public Student(…, boolean graduated) { … this.graduated = graduated; Controller.notifyObservers( new ModelChangeDescription(this, ModelChangeDescription.created, null) ); } public void setGraduated(boolean graduated) { this.graduated = graduated; Controller.notifyObservers( new ModelChangeDescription(this, ModelChangeDescription.changed, "graduated") ); }
Jens Bennedsen 2002Objektorienteret systemudvikling1.15 Applikationsprogrammør (2) Hvem skal være observable? –Alle modelobjekter eller Containerklasserne public class Controller { private static PersistentLinkedList teachers; … private static class publicSetChangedObservable extends Observable { // make the setChanged method public, so that Controller can call it public void setChanged() { super.setChanged(); } }; private static publicSetChangedObservable modelObservable = new publicSetChangedObservable(); …
Jens Bennedsen 2002Objektorienteret systemudvikling1.16 Registrering hos Observer