Model Drevet Design i Praksis



Relaterede dokumenter
Udfordringer og problemstillinger. En liste over de udfordringer og problemstillinger, der er ved Java og JEE udvikling

Curriculum Vitae Jack Petersen

IT-Basecamp Real World Java EE Patterns Adam Bien. Real World Java EE Patterns, Adam Bien Copyright Lund&Bendsen A/S

Spring Schema Extension eller Spring Domain Specific Languages

Casper Fabricius ActiveRecord. O/RM i Ruby on Rails

A Profile for Safety Critical Java

Webserverprogrammering

SAS USER FORUM DENMARK 2017 USER FORUM. Rune Nordtorp

Curriculum Vitae PETER VILLADSEN MOBIL: RAVNSBORGVEJ 91 DK-4600 KØGE

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Version Dato Beskrivelse /11/2012 Initial version /03/2013 Tilføjet eksempel med Template Agent, generelt udvidet dokumentet.

Database for udviklere. Jan Lund Madsen PBS10107

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Databaseadgang fra Java

Oracle8i R8.1.5 JAVA. Oracle8i R Oracle8i Enterprise Edition Oracle8i R Oracle8i R Oracle8i R8.1.

WINDCHILL THE NEXT STEPS

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Who s to blame? Jeppe Rørbæk. Jeppe.rorbaek@teknologisk.dk Konsulent og underviser på Teknologisk Institut MCP, MCAD, MCSD, MCT

Online kursus: Content Mangement System - Wordpress

Indhold. Senest opdateret:03. september Side 1 af 8

Web services i brug. Anvendelse uden for biblioteksverdenen

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Software Construction 1 semester (SWC) Spørgsmål 1

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Arkitektur for begyndere

Singleton pattern i C#

SigmaT.

Dygtig.NET / C# udvikler med stor erfaring fra både offentlige organisationer og private virksomheder.

Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net)

IBM Software Group. SOA v akciji. Srečko Janjić WebSphere Business Integration technical presales IBM Software Group, CEMA / SEA IBM Corporation

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

Enterprise Search fra Microsoft

Curriculum Vitae for Søren Brønsted

Præsentation af BSK regionens identity and access management platform

Janich dk. Joomla Case sol.dk. Janich Rasmussen. Freelance Joomla! Professional. Joomladay Danmark 2011

Singleton pattern i Java

Zapier-integration mellem MailChimp og webcrm hos Azalea IT

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

CV for Christian Plougmann Hag

Indhold. Senest opdateret : 30. juli Side 1 af 5

TeamShare 2.1 Versionsnoter Oktober 2009

Database. lv/

Vejledning i skabelse og test af metadata

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

PLATYPUS. Praktisk erfaring Års erfaring Erfarings niveau Senest Teknisk arkitektur 6 Høj 2005 Applikations Design 11 Høj 2004 Performance 12 Høj 2005

Objektorienteret Programmering

Undervisningsbeskrivelse

Ribe Amts forslag til EPJ-arkitektur

FKG datamodellen Version ArcGIS integration Sidste revisionsdato: 23. maj 2014

APEX i Praksis Martin B. Nielsen. Navn. MBNDATA Emne

ProjectWise Tips & Tricks

SQL Server 2016 Data Adgang

Introduction til.net remoting i C#

VPN VEJLEDNING TIL MAC

SEARCH ENGINE OPTIMIZATION

Lektion 6. Grundlæggende programmering i VR

Automatisk build og deploy med Maven. Geek Night hos VP SECURITIES januar 2011 Mads Pultz <mpz@trifork.com>

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

edgemo SOFT2go Kristian F. Thomsen

Bypassing the. Brian Marick

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

En rekord er sat. SDC s PD-løsning til IFRS 9 15/6-2017

Succesfuld implementering af automatiseret test

Microsoft Dynamics NAV & Service Management

Introduction til.net remoting i VB.NET

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

Den røde tråd fra testdækning til releasemetrikker

Software 1 with Java. Recitation No. 7 (Servlets, Inheritance)

Opsætning af MobilePBX med Kalenderdatabase

Skriftlig eksamen i Datalogi

Tracking af YouTube i Google Tag Manager og Universal Analytics (Seneste version)

Tree klassen fra sidste forelæsning

Installation og Drift. Aplanner for Windows Systemer Version 8.15

Studieordning del

OFFENTLIGT KMD A/S EJ 0.0 NUMMERERET SLIDE 1 CCM USER GROUP KMD einvoicing. v/ Ole Sixhøi

Agil test tilgang - erfaringer fra projekter

Specifikationsdokument for PDF Validator API

SAX Simple API for XML.

Database programmerings tips

Hvordan sikres investeringen i eksisterende systemer, når skyen tages i brug. Carsten Rasmussen, CTO, Capgemini Danmark A/S IDC Cloud Computing 2011

Linguistic support for unit testing

PID2000 Archive Service

Passioneret dotnet (.Net) programmør, med erfaring fra Dynamics Nav og integration

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

BACK-END OG DATA: ADMINISTRATION HVAD ER DE NYE MULIGHEDER MED VERSION 7.1? STEFFEN BILLE RANNES, 4. FEBRUAR 2015

Curriculum Vitae. Type År Sidst Niveau Type År Sidst Niveau

Visual Studio Team System. Team Build en grundpille i søgen efter it-projektproduktivitet?

DANMARKS TEKNISKE UNIVERSITET

Introduktion til ActionScript, fortsat

Real-time programming safety in Java and Ada

Kom godt i gang med Digital Transformation via din Microsoft ERP-platform

KURSER INDENFOR SOA, WEB SERVICES OG SEMANTIC WEB

Mennesker til forskel Alle typer kompetencer til dine it-projekter

Brian Bugge - CV. Curriculum Vitae 1. Telefon: bb@visionware.dk

Jan Hansen, AMP CMDB Specialist

Modern Concurrency Abstractions for C#

FESD-standardiseringsgruppen Att: Palle Aagaard IT- og Telestyrelsen IT-strategisk kontor Holsteinsgade København Ø

Navision Stat 7.x. Opsætning af NAS 1 til afvikling af GIS-automatisering, GIS med webservice og opgavekø. Overblik. Side 1 af 8

Curriculum vitae. Personlige oplysninger. Præsentation. Projekterfaring

Transkript:

Model Drevet Design i Praksis Dansk IT - På Vej Hjem møde d. 8/9-2009 Jeppe Cramon - TigerTeam ApS

Lidt om mig 15 års erfaring som software udvikler Partner i TigerTeam Første erfaring med model drevet udvikling i 2001 Siden erfaring med model drevet udvikling fra BEC Pension, letpension, Elektronisk Tinglysning samt et større ERP projekt med SAP integration. Facilitator for Dansk IT s Java kompetence netværk

Dansk IT Java kompetence netværk Et engageret netværk af Java professionelle Mødes 4 gange årligt Eksterne og interne foredragsholdere Debat emner Flere medlemmer vil sikre større udbytte af netværket...

Hvorfor Model Drevet Udvikling?

Fordi software udvikling stadig tager for lang tid!

Hvorfor tager det for lang tid?

Vi løser de forkerte problemer For dårlig kommunikation

Udvikling kræver stadig for store resourcer For lidt abstraktion og automatisering

Hvilke tiltag findes der til at løse disse udfordringer i dag?

Outsource eller bruge flere konsulenter

Agil udvikling

Bedre tekniske frameworks

Mere udtryksfulde programmeringssprog

Flere af disse tiltag virker fortrinligt, hvis de bruges rigtigt...

Men kan vi ikke bare få forretningen til at kode og fyre programmørerne? ;) Kommer ALDRIG til at ske!

Men vi kan få forretningen til at deltage mere aktivt i udviklingen, gennem...

Model Driven Software Development (MDSD)

MDSD er brugen af modeller til at...

Forenkle virkeligheden

Forbedre kommunikationen

Hæve abstraktions niveau

Forbedre kvaliteten

Der findes to forskellige typer modeller...

Tekstuelle modeller Domain Specific Languages (DSL)

Visuelle modeller

Fællesnævneren er...

Godt supplement til eksisterende metoder

Et højere udtryks- og abstraktions niveau

En elektrificeret beskrivelse af problem domænet

Er MDSD ikke bare CASE tools om igen?

NEJ - CASE tools betød One size fits all Generatoren var oftest låst af leverandøren Gav en 80-20 med 20-80 løsning Det var svært at ændre/tweake toolet MDSD handler om Pragmatisme - One Model Doesn t Fit All! Brug den model der hvor det giver mening for dit projekt Brug modeller til det de er gode til - skriv resten i hånden Brug en effektiv generator og skriv dine egne udvidelser - No lock in Fokus på 80-20 uden 20-80 Tillad specialisering på alle niveauer

Eksempler på anvendelse af MDSD

1: Advanced ebusiness applikation Business Engine Skrevet i C Custom Metadata SQL + DB2 Service kald JDBC Schema Metadata Admin Applikation +JSP Java Persistence Skrevet i Java klasser (CMP)

Konklusion på JSP/Template baseret og DB drevet MDSD Det virkede Java gruppen var agil, da den nemt kunne reagerer på DB ændringer DB ens Schema MetaData havde begrænset indhold => behov for ekstra meta data Ekstra meta data forårsagede behov for Web app til at holde dem ved lige JSP erne blev rodede, det var svært at tilføje ortogonale udvidelser Hang ikke sammen med build systemet

2: Forsikrings domæne model Opgaven var: Byg et nyt Java baseret pensionskasse system (GALOP) til flere samtidige pensionskasser med vidt forskellige og komplicerede pensions produkter Skulle bygges op omkring Spring Framework (Teknisk infrastruktur framework) Hibernate/JPA (Objekt-Relationel Mapping framework) bidrog med Process, Metode samt Teknisk ekspertise indenfor JEE, Spring, Hibernate og Web bidrog med Pensions domæne viden samt ekspertise i software og model drevet udvikling

Løsning Pensionskasse X Model Pensionskasse Y Model Høj niveau beskrivelse af domænet vha. UML modeller GALOP Pensions Model Lagdelte domæne modeller med specialisering Model til Model transformation af de generelle modeller til den pågældende løsning (modellen er generel, implementationen er specifik) Dansk Pensions Model En-vejs iterativ kode generering vha. plugin baseret kode generator Generel Pensions Model

Højniveau beskrivelse af domænet UML:

Højniveau: Bitemporal historik Giver frihed til at vælge den rette implementation uden at afsløre det i modellen 1 * 1 1

Højniveau: Versionering (Temporal Object Pattern)

Konklusion på UML baseret domæne model Det virker RIGTIG godt til domæne modeller Super kommunikations form - Teknikken støjer ikke Agilitet: Remodellerer når der er behov og regenererer Learn as you go along: Når vi blev klogere på Hibernate udfordringer var det nemt at rette det gennem generatoren. Lille indsats => Stor effekt Ensartet kvalitet Stor fleksibilitet i hele processen

3: SOA model Opgaven var: BEC/Schantz forsikringskerne skulle specialiseres til letpension Forsikringskernen skulle integreres i en lagdelt SOA model med tilhørende orkestrering SOAP / WSDL / XML Schema (WS-I Basic) - Aka. the usual suspects!

Løsning: Beskrivelse af service grænsefladen vha. UML En-vejs iterativ kode generering af WSDL XML Schema Serverside service skelet Klient stub (for test) HTML beskrivelse af forskellene mellem to model versioner

Service grænseflade i UML

Konklusion på UML baseret SOA model Det virkede så godt at det gik fra kun at være forsikrings projektet der brugte det til det var hele letpensions SOA model der blev beskrevet i UML og genereret Super kommunikations form - Teknikken støjer ikke Agilitet: Remodellerer når der er behov og regenererer - Mulighed for at lave automatiseret dokumentation af model ændringer mellem versioner Adaptability: Når service principperne ændrede sig (i starten) var forsikrings projektet oftest 10 gange så hurtigt til at rette servicene til (i forhold til de andre projekter) Ensartet kvalitet Stor fleksibilitet i hele processen

4: Elektronisk tinglysning Opgaven var: Få Elektronisk tinglysning i mål så hurtigt som muligt TigerTeam deltog i at få den meget komplekse domæne model persisteret vha. Hibernate/JPA (Objekt-Relationel Mapping framework) Oracle 10.x TigerMDSD (Model baseret kode generator)

Krav vi skulle kunne leve op til Oracle har en begrænsning på 30 karakterer for tabeller, kolonner, etc. Det skal være muligt at udvide den genererede kode uden at tabe udvidelserne ved regenerering Automatiseret integrations test af den genererede kode op mod Oracle databasen Fast definerede regler (defaults) der skal kunne overstyres enten via generatoren eller via modellen

Hvordan laver man en generel og fleksibel generator der kan leve op til disse krav?

TigerMDSD proces for kode generering + UML modellering TigerMDSD XMI Eksport konfiguration MODEL is KING Java/C# kode JPA konfiguration Database konfiguration Integrations test Test data generator WSDL XML Schema...

Trin 1 MagicDraw + XmiReader XMI UML Model object graf

TigerMDSD - På UML Model Niveauet XmiReader reader = new EAXmiReader(); XmiReader reader = new MagicDrawXmiReader(); MetaModel metamodel = reader.read("model.xml");

Transformation - Fra UML model til Resultat UML Model object graf Transformation (TigerMDSD konfiguration) Java/C# kode JPA konfiguration Database konfiguration Integrations test Test data generator WSDL XML Schema...

TigerMDSD - Transformation til Java JavaGenerator javagenerator = new JavaGenerator(); List<ClazzOrInterface> allgeneratedclazzes = javagenerator.execute(metamodel); Meta Type MetaPackage MetaClazz MetaAssociationClazz MetaEnumeration MetaInterface MetaProperty MetaOperation Java Model JavaPackage Clazz Clazz Enumeration Interface Property (Består af Field, GetterMethod og SetterMethod) Method

TigerMDSD - Java Model

TigerMDSD - Udvidelser baseret på Events

TigerMDSD - Udvidelser public interface GeneratorEventListener { boolean handle(generatorevent event);... }

TigerMDSD - Eksempel på udvidelse @OneToMany @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private Set<Tire> tires; public class HibernateDeleteOrphanListener extends BaseJpaGeneratorEventListener { @Override protected boolean handleonetomanyownerofassociation(onetomanyassociationevent event) { } if (isdeleteorphancandidate(event)) { event.getproperty().getfield().addannotations( new Annotation(Cascade.class).addAnnotationAttribute("value", CascadeType.DELETE_ORPHAN) ); event.getproperty().removesettermethod(); } return true; } protected boolean isdeleteorphancandidate(onetomanyassociationevent event) {... }

TigerMDSD - Eksempel på udvidelse protected boolean isdeleteorphancandidate(onetomanyassociationevent event) { } if (event.getmetaproperty().isownerofassociation() &&!event.getmetaproperty().getassociation().isbidirectional() && }!event.getmetaproperty().getassociation().isselfreferencing()) { // Check the clazz of the opposite property to see what kind of associations it has for (MetaProperty submetaproperty : event.getmetaproperty().gettype().getproperties()) { if (submetaproperty.ispartinanassociation()) { } } if (submetaproperty.isownerofassociation()) { if (submetaproperty.getassociationtype() == AssociationType.ManyToMany } submetaproperty.getassociationtype() == AssociationType.OneToMany) { return false; } } else if (submetaproperty.getassociation().isbidirectional()) { return true; return false; // The type of the our sub property is not an owning association and we have // a java association in both directions (bidirectional), which hibernate doesn't handle return false;

TigerMDSD - Indbyggede udvidelser Built-in Types Bidirectional associations Property Sugar methods Get Or New Property methods Constructor (immuteable properties) Class Hierarchy Java doc generator Serial Version UID generator MetaType Java doc generator Serializable Pojo s ToString/Equals/HashCode JPA Field based persistence JPA Named Tables and Columns Hibernate Foreignkey Constraints Hibernate Foreignkey Index Hibernate Fetch Optimization Hibernate Association Unproxying Hibernate Table Comments Hibernate HH-3544 bug fix

TigerMDSD - Java konfiguration JavaGenerator javagenerator = new JavaGenerator(); javagenerator.addeventlisteners(new BuiltInTypesListener() { @Override protected void resolvebuiltintypes(type type) { if (type.getname().equalsignorecase("datetime")) { type.setwrappedjavaclass(datetime.class); } else { super.resolvebuiltintypes(type); } } }); javagenerator.addeventlisteners(new JPAGeneratorEventListener().setShouldMakeBaseClazzesMappedSuperClassesIfPossible(true).setShouldGeneratePresentFieldInEmbeddables(false).setDefaultToLazyFetchingForAllAssociations(true) ); javagenerator.addeventlisteners(new JPANamedTablesAndColumnsListener()); javagenerator.addeventlisteners(new BidirectionalGeneratorEventListener()); javagenerator.addeventlisteners(new HibernateAssociationUnproxyListener()); javagenerator.addeventlisteners(new SerialVersionUIDGeneratorListener()); javagenerator.addeventlisteners(new PropertySugarMethodsEventListener()); javagenerator.addeventlisteners(new MetaTypeJavaDocListener()); javagenerator.addeventlisteners(new HibernateIndexingListener()); javagenerator.addeventlisteners(new HibernateDeleteOrphanListener()); javagenerator.addeventlisteners(new HibernateValidatorNotNullListener()); javagenerator.setcreateextensionclazzes(true);

TigerMDSD - YAML konfiguration

3 level inheritance - Udvikler udvidelser Hvad vi modellerer: Hvad vi genererer: Optionel Alternativer: Partial Classes Mixins / Traits Priviledged Aspects Protected Regions

Best practices

Tak for opmærksomheden! For mere information jeppe@tigerteam.dk