Not your Father s. Java EE. Lars Röwekamp CIO New Technologies. @mobilelarson @_openknowledge



Similar documents
Web Development in Java Live Demonstrations (Live demonstrations done using Eclipse for Java EE 4.3 and WildFly 8)

Search Engines Chapter 2 Architecture Felix Naumann

Managed Beans II Advanced Features

Smalltalk in Enterprise Applications. ESUG Conference 2010 Barcelona

Elena Chiocchetti & Natascia Ralli (EURAC) Tanja Wissik & Vesna Lušicky (University of Vienna)

An introduction to creating JSF applications in Rational Application Developer Version 8.0

JavaServer Faces 2.0. Bernd Bohmann. Matthias Weßendorf. Agenda. Agenda. IRIAN Deutschland Apache MyFaces Tobago CORE. Mehr als nur ein Web-Framework

Kapitel 2 Unternehmensarchitektur III

Web Anwendungen Entwickeln mit JSF, Spring und Tomcat

JSR-303 Bean Validation

The Java EE 6 Platform. Alexis Moussine-Pouchkine GlassFish Team

Is Cloud relevant for SOA? Corsin Decurtins

Web Development in Java Part I

Case Studies of Running the Platform. NetBeans UML Servlet JSP GlassFish EJB

Rapid Application Development. and Application Generation Tools. Walter Knesel

BP9 - Citrix Receiver Optimierung: So verbessern Sie Management und Benutzerkomfort. Systems Engineer, Citrix Systems GmbH

Supporting Multi-tenancy Applications with Java EE

Java on Guice Guice 1.0 User's Guide

Successful Collaboration in Agile Software Development Teams

BP1 Mobile App Management: Solutions for ios and Android. Gary Barton Mobility Architect Citrix Receivers and Gateways Group

The Oracle Fusion Development Platform

TIn 1: Lecture 3: Lernziele. Lecture 3 The Belly of the Architect. Basic internal components of the Pointers and data storage in memory

How To Write A Validator In Java 1.1.1

DV4 - Citrix CloudGateway: Access and control Windows, SaaS and web applications. Systems Engineer, Citrix Systems GmbH

Design Patterns in Java

Why IBM WebSphere Application Server V8.0?

Software / FileMaker / Plug-Ins Mailit 6 for FileMaker 10-13

Open Text Social Media. Actual Status, Strategy and Roadmap

Exemplar for Internal Achievement Standard. German Level 1

Mind The Gap! Setting Up A Code Structure Building Bridges

Aspects of using Hibernate with CaptainCasa Enterprise Client

Running and Testing Java EE Applications in Embedded Mode with JupEEter Framework

OTN Developer Day Enterprise Java. Hands on Lab Manual JPA 2.0 and Object Relational Mapping Basics

Spring Data JDBC Extensions Reference Documentation

Java EE 7: Back-End Server Application Development

Java EE 6 development with Eclipse, Netbeans, IntelliJ and GlassFish. Ludovic Champenois Oracle Corporation

Enterprise Java Web Application Frameworks & Sample Stack Implementation

... Introduction... 17

Tutorial on Building a web Application with Jdeveloper using EJB, JPA and Java Server Faces By Phaninder Surapaneni

Web Applications and Struts 2

Microsoft Nano Server «Tuva» Rinon Belegu

The Google Web Toolkit (GWT): The Model-View-Presenter (MVP) Architecture Official MVP Framework

Easy-Cassandra User Guide

Grails - Rapid Web Application Development for the Java Platform

Reusing Existing * Java EE Applications from Oracle SOA Suite

Exemplar for Internal Assessment Resource German Level 1. Resource title: Planning a School Exchange

OpenShift is FanPaaStic For Java EE. By Shekhar Gulati Promo Code JUDCON.IN

Domain-Driven Design

Domain Driven Design. Informatik IT-Uddannelse og IT-Udvikling

SAP Enterprise Portal 6.0 KM Platform Delta Features

<Insert Picture Here> GlassFish v3 - A Taste of a Next Generation Application Server

MySQL Cluster: HA als StorageEngine

Classes and Objects. Agenda. Quiz 7/1/2008. The Background of the Object-Oriented Approach. Class. Object. Package and import

Creating Models. Rob Allen, June 2014

A place for everything, everything in its place Benjamin Franklin

<Insert Picture Here> Java EE 7. Linda DeMichiel Java EE Platform Lead

SPARROW Gateway. Developer Data Vault Payment Type API. Version 2.7 (6293)

Managed App Configuration for App Developers. February 22, 2016

Table of Content. Introduction to ObjectDB and JPA. Object Model: Types, Entities, Primary Keys. Database Connections

Oracle Application Development Framework Overview

GlassFish Security. open source community experience distilled. security measures. Secure your GlassFish installation, Web applications,

How To Extend Content Broker Storage On Libs Libs (Libs) With Libs 4.5) And Libs 5.5

Oracle SOA Suite Then and Now:

Gurkensalat statt Spaghetticode. Stuttgarter Testtage 2013

Portals, Portlets & Liferay Platform

<Insert Picture Here> Michael Hichwa VP Database Development Tools Stuttgart September 18, 2007 Hamburg September 20, 2007

Enterprise JavaBeans 3.1

Customer Bank Account Management System Technical Specification Document

CS 111 Classes I 1. Software Organization View to this point:

AD2 - The future of mobile enterprise applications: Live from the Citrix Labs

How To Talk To A Teen Help

Vergleich der Versionen von Kapitel 1 des EU-GMP-Leitfaden (Oktober 2012) 01 July November Januar 2013 Kommentar Maas & Peither

Mit einem Auge auf den mathema/schen Horizont: Was der Lehrer braucht für die Zukun= seiner Schüler

QAS DEBUG - User und Computer

Entwicklung von Integrationslösungen aus einem Guss mit AIA Foundation Pack 11g

JBoss JEE5 with EJB3.0 on NonStop. JAVA SIG, San Jose

JAXB Tips and Tricks Part 2 Generating Java Classes from XML Schema. By Rob Ratcliff

<Insert Picture Here> Building a Complex Web Application Using ADF and Siebel

Dozer v User's Guide

What's new in Java EE 6? Antonio Goncalves

How to Build Successful DSL s. Jos Warmer Leendert Versluijs

Please do not SUPER SIZE ME enterprise integration using the Camunda Fox Plattform Ralf Sigmund OPITZ CONSULTING

J2EE-Application Server

1. Wenn der Spieler/die Spielerin noch keine IPIN hat, bitte auf den Button Register drücken

RESIN APPLICATION SERVER JAVA EE 6 WEB PROFILE

Complete Java Web Development

Integrated Development of Distributed Real-Time Applications with Asynchronous Communication

Java EE Web Development Course Program

Table of contents. Reverse-engineers a database to Grails domain classes.

Transcription:

Not your Father s @mobilelarson @_openknowledge Java EE Lars Röwekamp CIO New Technologies

May I submit my billing info to your merchant account via your payment gateway?

Wo liegt das Problem... Too many times application architects focus on the technical problems instead of designing for the problem domain.

Wo liegt das Problem... User Interface UI CDI Managed Bean App TX Session EJB Session EJB Service EntityManager Entity Data

Es wäre doch viel schöner, wenn... User Interface UI UseCase Controller App TX Business Object Business Object Business Object Domain

Es wäre doch viel schöner, wenn... Business TX User Interface UI UseCase Controller App Business Object Business Object Business Object Domain

Es wäre doch viel schöner, wenn... Application Adapter Domain Model Adapter

Es wäre doch viel schöner, wenn... App Core mit Business TX Application Adapter Domain Model Adapter

Es könnte alles so einfach sein...

Das kleine 1x1 des DDD Eric Evans says For most software projects, the primary focus should be on the domain and domain logic. Complex domain design should be based on a model.

Das kleine 1x1 des DDD fachliche Domäne End User Die gemeinsame Domain Expert Technical Expert fachliche Welt in der wir leben.

Das kleine 1x1 des DDD Ubiquitous Language End User Fachsprache als Basis Domain Expert Technical Expert für ein gemeinsames Domain Model

Das kleine 1x1 des DDD Rich Domain Model End User Produce Software Domain Expert Technical Expert that makes perfectly sense to business, not only to coder

Das kleine 1x1 des DDD Access Layer Rich Domain Model Produce Software that is always Business Layer in a correct state, Domain Expert Technical Expert not only partially DB Layer

Das kleine 1x1 des DDD Services access with Repositories access with Model-Driven Design express model with express model with express model with Entities maintain integrity with act as root of Aggregates Value Objects encapsulate with encapsulate with encapsulate with X mutually exclusive choices isolate domain with Layered Architecture encapsulate with Factories Smart UI

Das kleine 1x1 des DDD keep model unified by names enter Bounded Context assess/overview relationships with Context Map Continous Integration Overlap allied contexts through relate allied contexts as Shared Kernel Customer Supplier Teams overlap unilaterally as Conformist Ubiquitous Language translate and insulate unilaterally with free teams to go support multiple clients through Open Host Service formalize as Published Language Anticorruption Layer Separate Ways

Passt das zu Java EE?

Passt das zu Java EE? Klar Java EE Next Generation BluePrint a.k.a. Java EE meets DDD

Passt das zu Java EE? Klar

Passt das zu Java EE? Klar, aber You must follow the Chuck-Norris Rules!

Always follow the Rules RULE #1 Design a Rich not an Anemic Domain Model

Rule #1: Rich not Anemic Domain Model /** * Represents a business customer with a * full qualified name, a date of birth indicating * if the customer is sui juris and a valid address * that may change after a relocation. */ public class Customer { private String firstname; private String lastname; Fachlichkeit? private Date birthdate; private Address address; public void setfirstname(string afirstname) {... public String getfirstname() { return firstname; public void setlastname(string alastname) {... public String getlastname() { return lastname; public void setbirthdate(date birthdate) {... public Date getbirthdate() { return birthdate; public void setaddress(address address) {... public Address getaddress() { return address;

Rule #1: Rich not Anemic Domain Model /** * Represents a customer data access object to * encapsulate all db relevant activities */ public class CustomerDao { sprechend?... public List<Customer> findbyzipcodeorcity( String zipcode, String city) { return...; public List<Customer> findbyzipcodeorcityorcitylimit( String zipcode, String city, int order) { return...;

Rule #1: Rich not Anemic Domain Model Zur Erinnerung Wir möchten ein sprechendes Domain Model, mit einem sprechenden API, welches wir in sich konsistent erzeugen und im weiteren Verlauf konsequent konsistent erhalten.

Rule #1: Rich not Anemic Domain Model Anforderungen sprechendes Modell sprechendes API konsistent erzeugen konsistent erhalten Fachlichkeit, Validierung, Konvertierung, Normalisierung und Konsistenzprüfung!

Mut zur Fachlichkeit

Rule #1: Rich not Anemic Domain Model Anforderungen sprechendes Modell sprechendes API konsistent erzeugen konsistent erhalten

Rule #1: Rich not Anemic Domain Model // (JPA) Entity with Value Objects public class Customer extends HumanBeing { sprechend private FirstName firstname; private LastName lastname; private FamilyStatus familystatus; private Customer partner; private Address postaladdress; private Map<PhoneNumberType, PhoneNumber> phonenumbers;... public void marry(partner partner,lastname newlastname) { lastname = notnull(newlastname) familystatus = FamilyStatus.MARRIED; // Ensure bidirectional integrity for partner entity!... public boolean ismarried() { return (familystatus == FamilyStatus.MARRIED);

Rule #1: Rich not Anemic Domain Model // (JPA) Entity with Value Objects public class Customer extends HumanBeing { sprechend... private Map<PhoneNumberType, PhoneNumber> phonenumbers;... public void changehomephonenumber( PhoneNumber changedhomephonenumber) {... public void disconnecthomephone() {... public void changemobilephonenumber( PhoneNumber changedhomephonenumber) {... public void disconnectmobilephone() {......

Rule #1: Rich not Anemic Domain Model /** * Represents a customer data access object to * encapsulate all db relevant activities */ public class CustomerDao { sprechend... public List<Customer> findbyzipcodeorcityorstreet( String street, String city, String zipcode) { return...; public List<Customer> findbyanyof( ZipCode zipcode, City city, Street order) { return...;

Hmm, passt das wirklich zu Java EE?

Rule #1: Rich not Anemic Domain Model /** * Simple value object for first name using the * common base <code>simplevalueobject</code> */ public class FirstName extends SimpleValueObject<String> { public FirstName(String avalue) { super(avalue); public String gettext() { return super.getvalue(); Common Base Passt das wirklich: Value Objects?

Rule #1: Rich not Anemic Domain Model /** Abstract value object as a common base */ public abstract class SimpleValueObject<T extends Comparable> implements Serializable, Comparable<SimpleValueObject<T>> { private T value; public SimpleValueObject(T avalue) { value = avalue; protected T getvalue() { return value; public boolean equals(object o) { return...; Common Base public int hashcode() { return...; public String tostring() { return...; public int compareto(simplevalueobject<t> o) { return...;

Rule #1: Rich not Anemic Domain Model /** * Embeddable date of birth for (re)use in value objects */ @Embeddable public class DateOfBirth { private Date dateofbirth;... /** * Customer entity making use of date of birth embeddable */ @Entity public class Customer { VO, Entities & JPA @Embedded @AttributeOverride(name= dateofbirth", column=@column(name= CUST_BIRTHDATE )) private DateOfBirth dateofbirth;...

Rule #1: Rich not Anemic Domain Model /** * Using JPA-QL and ValueObjects */ @Entity @Table(name = "TAB_USER",...) @NamedQueries({ @NamedQuery(name = "User.findByEmail", query = "select u from User u where u.email = :email"), @NamedQuery(name = "User.findByEmailString", query = "select u from User u " + " where u.email.value = :emailstring ) ) public class User extends AbstractEntity { protected static final String EMAIL_COLUMN = "EMAIL"; @AttributeOverride(name = "value", column = @Column(name = EMAIL_COLUMN, unique = true, nullable = false)) private Email email;... VO & JPA Queries

Rule #1: Rich not Anemic Domain Model /** CDI based JSF Controller managing user related input */ @Named("customerController") @RequestScoped public class CustomerController { private DateOfBirth dateofbirth; private ZipCode zipcode;...; public DateOfBirth getdateofbirth() { return dateofbirth; public void setdateofbirth(dateofbirth newdateofbirth) { dateofbirth = newdateofbirth; public ZipCode getzipcode() { return zipcode; public void setzipcode(zipcode newzipcode) { zipcode = newzipcode;... VO & JSF

Rule #1: Rich not Anemic Domain Model <!-- Value Object binding in JSF xhtml page via Unified Expression Language & JSF Faces Converter --> <!-- using JSF converter for Value Object of type ZipCode (read) > <h:outputtext value= #{customercontroller.zipcode /> <!-- using JSF converter for Value Object of type ZipCode (write) > <h:inputtext value= #{customercontroller.zipcode... /> VO & JSF @FacesConverter(forClass = ZipCode.class) public class ZipCodeConverter extends SimpleValueObjectConverter <ZipCode> {

Rule #1: Rich not Anemic Domain Model Anforderungen sprechendes Modell sprechendes API konsistent erzeugen konsistent erhalten

Rule #1: Rich not Anemic Domain Model // JPA entity @ValidPaymentMethod // cross-field constraint @Entity public class Customer { konsistent? @Name // common constraint for type Name private FirstName firstname; @Name // common constraint for type Name private LastName lastname; @Valid // delegate validation to Class private CreditCard creditcard; @Valid // delegate validation to Class private BankAccount bankaccount; @Address(area = AddressArea.GERMANY) // special constraint private Address postaladdress;...

Rule #1: Rich not Anemic Domain Model // Builder Pattern - IN ACTION (easy version) konsistent // create AddressBuilder AddressBuilder builder = new AddressBuilder(); // set all known values // BTW: could be also used in JSF and other frameworks builder.setstreet(...); builder.setstreetnumber(...); builder.setzipcode(...); builder.setcity(...); builder.setstate(...); builder.setcountry(...); // build valid and immutable Address object Address address = builder.build();

Rule #1: Rich not Anemic Domain Model // Builder Pattern - IN ACTION (extended version) // create AddressBuilder Address address = newaddress() // set values // BTW: could be also used in JSF with own EL Resolver.forStreetNumber(...).ofStreet(...).inCity(...).withZipCode(...).lyingInState(...).ofCountry(...) // build Address object.build(...); konsistent

Rule #1: Rich not Anemic Domain Model // Class with Builder - extended version public class Address { konsistent public static Builder newaddress() { return new Builder();... public static class Builder { private Address address = new Address(); public Builder ofstreet(string initialstreet) { address.street = validatestreet(initialstreet); return this; public Address build() { validate(); Address validaddress = address; address = new Address(); return validaddress;

Always follow the Rules RULE #2 Inject Business not Infrastructure

Rule #2: Inject Business not Infrastructure // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { // inject CustomerService and MailService via @Inject @Inject // CDI managed controller layer bean (SessionScoped) private AuthenticationController authcontroller; private Customer customer; public String createcustomer() { currentcallcenteragent = authcontroller.getloggedincca(); customer.setauditinformation(currentcallcenteragent); customerservice.create(customer); mailservice.sendwelcomemail(customer); return CUSTOMER_CREATED; // getter / setter for customer...

Rule #2: Inject Business not Infrastructure // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { // inject CustomerService and MailService via @Inject @Inject @Current private CallCenterAgent currentcallcenteragent; private Customer customer; public String createcustomer() { customer.setauditinformation(currentcallcenteragent); customerservice.create(customer); mailservice.sendwelcomemail(customer); return CUSTOMER_CREATED; // getter / setter for customer...

Rule #2: Inject Business not Infrastructure // Authentication Controller @SessionScoped @Named( authenticationcontroller ) public class AuthenticationController implements Serializable { private CallCenterAgent loggedincca; public String authenticate() {... @Produces @Current @RequestScoped public CallCenterAgent getloggedincca() { return loggedincca;... @Inject @Current CallCenterAgent

Rule #2: Inject Business not Infrastructure package de.openknowldege.qualifier import... // self-made qualifier to indicate current instance of something @Qualifier @Target({TYPE, METHOD, PARAMETER, FIELD) @Retention(RUNTIME) public @interface Current{

Rule #2: Inject Business not Infrastructure // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { // inject CustomerService and MailService via @Inject @Inject @Current private CallCenterAgent currentcallcenteragent; private Customer customer; public String createcustomer() { customer.setauditinformation(currentcallcenteragent); customerservice.create(customer); mailservice.sendwelcomemail(customer); return CUSTOMER_CREATED; // getter / setter for customer...

Rule #2: Inject Business not Infrastructure // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { // inject CustomerService and MailService via @Inject @Inject @Current // still bounded to controller layer? private CallCenterAgent currentcallcenteragent; private Customer customer; public String createcustomer() { customer.setauditinformation(currentcallcenteragent); customerservice.create(customer); mailservice.sendwelcomemail(customer); return CUSTOMER_CREATED; // getter / setter for customer...

Rule #2: Inject Business not Infrastructure // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { // inject CustomerService and MailService via @Inject @Inject @Current // still bounded to controller layer? NO! private CallCenterAgent currentcallcenteragent; private Customer customer; public String createcustomer() { customer.setauditinformation(currentcallcenteragent); customerservice.create(customer); mailservice.sendwelcomemail(customer); return CUSTOMER_CREATED; // getter / setter for customer...

Rule #2: Inject Business not Infrastructure // Customer Service EJB @Stateless public class CustomerService { @Inject @Current private CallCenterAgent currentcallcenteragent; @PersistenceContext private EntityManager em; // transactional by default public void createcustomer(customer customer) { customer.setauditinformation(currentcallcenteragent); em.persist(customer);...

Rule #2: Inject Business not Infrastructure <html...> <h:body> <h:form> Vorname: <h:inputtext value= #{createcustomercontroller.customer.firstname"/> Name: <h:inputtext value= #{createcustomercontroller.customer.lastname"/> </h:form> </h:body> </html> Aber was ist mit der View?

Rule #2: Inject Business not Infrastructure <html...> <h:body> <h:form> Vorname: <h:inputtext value= #{customertocreate.firstname"/> Name: <h:inputtext value= #{customertocreate.lastname"/> </h:form> </h:body> </html> Fachlichkeit auch in der View?

Rule #2: Inject Business not Infrastructure // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { @Inject private CustomerService customerservice; private Customer customer; // getter for customer @javax.inject.produces @javax.inject.named( customertocreate ) public Customer getcustomer { return customer;... #{customertocreate

Rule #2: Inject Business not Infrastructure // EJB based Service @Named( shoppingcartservice ) @ApplicationScoped public class ShoppingCartService {... // call from JSF via #{shoppingcartservice.add(...) public void add( ShoppingCart shoppingcart, Article article) {...... BTW: Service Access via EL

Rule #2: Inject Business not Infrastructure // JPA Repository public class CustomerRepository { @Inject EntityManager em; // CDI producer method for current Customer @Produces @Current @Named( currentcustomer ) public Customer findcustomer ( @Parameter( customerid ) Integer customerid) { return em.find(customer.class, customerid)... BTW: Repository als Producer

Always follow the Rules RULE #3 Business drives TX not Technology

Rule #3: Business drives TX not Technology // Customer Service EJB @Stateless public class CustomerService { @Inject @Current private CallCenterAgent currentcallcenteragent; @PersistenceContext private EntityManager em; // transactional by default public void createcustomer(customer customer) { customer.setauditinformation(currentcallcenteragent); em.persist(customer);...

Rule #3: Business drives TX not Technology // Customer Service EJB - no EJB annotation required! @ApplicationScoped @Stateless public class CustomerService implements Serializable { @Inject @Current private CallCenterAgent currentcallcenteragent; @PersistenceContext private EntityManager em; // transactional by default public void createcustomer(customer customer) { customer.setauditinformation(currentcallcenteragent); em.persist(customer);...

Rule #3: Business drives TX not Technology // Customer Service @ApplicationScoped public class CustomerService implements Serializable { @Inject @Current private CallCenterAgent currentcallcenteragent; @PersistenceContext private EntityManager em; @Transactional public void createcustomer(customer customer) { customer.setauditinformation(currentcallcenteragent); em.persist(customer);... Java EE 7, DeltaSpike or home brewn

Rule #3: Business drives TX not Technology @Transactional @Interceptor public class TransactionAdvice { @Inject private UserTransaction utx; @AroundInvoke public Object applytransaction( InvocationContext ic) throws Throwable {... // 1. implement utx.begin() ic.proceed(); // 2. call original method... // 3. implement utx.commit() *XML registration omitted

Rule #3: Business drives TX not Technology // Customer Service - no annotation required! @ApplicationScoped public class CustomerService implements Serializable { @Inject @Current private CallCenterAgent currentcallcenteragent; @PersistenceContext private EntityManager em; @Transactional public void createcustomer(customer customer) { customer.setauditinformation(currentcallcenteragent); em.persist(customer);...

Rule #3: Business drives TX not Technology User Interface UI UseCase Controller App TX Business Object Business Object Business Object Domain

Rule #3: Business drives TX not Technology Business TX User Interface UI UseCase Controller App Business Object Business Object Business Object Domain

Rule #3: Business drives TX not Technology // JSF UI Controller @javax.enterprise.context.requestscoped @javax.inject.named( createcustomercontroller ) public class CreateCustomerController { @Inject private CustomerService customerservice; private Customer customer; @Transactional public String createcustomer() { customerservice.create(customer);... // some additional use case tx related work return CUSTOMER_CREATED; // getter / setter for customer...

Rule #3: Business drives TX not Technology Business TX User Interface Danger: LIE! UseCase Controller App Business Object Business Object Business Object Domain

Rule #3: Business drives TX not Technology Lazy Initialization Problem besteht nach wie vor! EntityManager ist an Transaktion gebunden Probleme bei lesenden Zugriffen ohne TX Varianten EXTENDED EM (@Stateful CM) EXTENDED EM (@RequestScoped AM) Fachliche Queries via EntityGraph (seit JPA 2.1)

Always follow the Rules and You are my (wo)man!

Always follow the Rules Business TX User Interface UI UseCase Controller App Business Object Business Object Business Object Domain

Es wäre doch viel schöner, wenn... App Core mit Business TX Application Adapter Domain Model Adapter

Erkenntnis des Tages - bitte mitnehmen! The Design is the Code, the Code is the Design.

Erkenntnis des Tages - bitte mitnehmen! Muss ich denn jedes Mal den Code ändern, wenn sich die Fachlichkeit ändert?

Erkenntnis des Tages - bitte mitnehmen! Zur Hölle, ja! Wann denn bitte sonst?

Not your Father s @mobilelarson @_openknowledge Java EE Lars Röwekamp CIO New Technologies