name: inverse layout: true class: center, middle, inverse --- # Anemic Domain Model .footnote[Martin Fowler 25. Nov 2003 [AnemicDomainModel](http://www.martinfowler.com/bliki/AnemicDomainModel.html)] --- layout: false # Anemic Domain Model:
A software domain model where the domain objects contain little or no business logic --- class: middle, inverse # "People think that anemic objects are real objects, and thus completely miss the point of what object-oriented design is all about" --- # Problemer ## Ingen innkapsling (minimal) ## Dumme domeneobjekter (nærmest et map av data) ## Strider mot basic OO: å kombinere data og oppførsel ## Procedural stil - Transaction Script (Patterns of EAA) --- class: inverse # Symptomer ## Duplisert kode ## Vanskelig å gjenbruke ## Uønskede avhengigheter --- class: inverse # Symptomer++! ## Vanskelig å teste! ## Vanskelig å mocke! --- # Backbone.Model ```javascript var Forside = Base.View.extend({ url: '/side' }); ``` ```javascript var forside = new Forside(); forside.get('sider').push(side); forside.get('sider').remove(annenSide); forside.save(); ``` --- # Backbone.Model ```javascript var Forside = Base.View.extend({ url: '/side', leggTilSide: function (side) { this.get('sider').push(side); }, fjernSide: function (side) { this.get('sider').remove(side); } }); ``` ```javascript var forside = new Forside(); forside.leggTilSide(side); forside.fjernSide(annenSide); forside.save(); ``` --- # Hva er feil? ```javascript // SomeView.js // Fjern alle omrader som har omradeId etter denne datoen trykkDatoBegrensning.set("omradeBegrensninger", _.filter(trykkDatoBegrensning.get("omradeBegrensninger"), function(omrade) { return omrade.omradeId != omradeId; }), {silent: true}); ``` -- # Forslag ```javascript trykkDatoBegrensning.fjernAndreOmråderEnn(områdeId); ``` --- class: middle, inverse # [Backbone-eksempel](https://github.com/Inatur/Inatur/commit/dfafd672ceecc68f9a7a972e6b2105b988553331) fra Inatur --- # Java-eksempel ```java // KjopService.java private List
filtrerKjøpsliste(List
kjopliste, ...) { List
returliste = new ArrayList<>(); for (Kjop kjop: kjopliste) { Date kjøpFradato = kjop.getKjoptKort().getStartDato(kjop.getKjøpsdatoer()); Date kjøpTildato = kjop.getKjoptKort().getSluttDato(kjop.getKjøpsdatoer()); ... } return returliste; } ``` --- # Java-eksempel ```java // KjopService.java private List
filtrerKjøpsliste(List
kjopliste, ...) { List
returliste = new ArrayList<>(); for (Kjop kjop: kjopliste) { Date kjøpFradato = kjop.getStartdato(); Date kjøpTildato = kjop.getSluttdato(); ... } return returliste; } ``` --- class: middle, inverse # [Java-eksempel](https://github.com/Inatur/Inatur/commit/4b607bb59b00ac389fd81a57145ab29900e96f0b) fra Inatur --- class: center, middle, inverse # Oppsummering ## Rik domenemodell i stedet for stygge views og services? ## .fancy[Legg logikken i modellen!] ---