--- title: "12-modelling-behaviour" tags: - info201 - lecture sr-due: 2022-08-28 sr-interval: 86 sr-ease: 250 --- [slides](https://blackboard.otago.ac.nz/bbcswebdav/pid-2892846-dt-content-rid-18407618_1/courses/INFO201_S1DNIE_2022/2022/lectures/lecture_12_slides.pdf) [modelling-behaviour](notes/modelling-behaviour.md) - method signatures - inheritance of behaviour - lower level sequencing and flow of control - compartmentalisation into "subsystems" 1. Compare and contrast the two typical approaches to inheriting behaviour in OO systems. 2. What does it mean to “program to an interface�? and why is this important? 3. Compare and contrast “rich�? versus “anaemic�? domain models with regards to behaviour. 4. Give an example of a “processor�? in the context of OO system design and explain why these are useful. # Garbage Notes # 1 Example of Linked UML (not realistic) ![](https://i.imgur.com/SAp9l60.png) ![200](https://i.imgur.com/sDLFeRe.png) ![150](https://i.imgur.com/JXSxAKy.png) ![200](https://i.imgur.com/RhQZdep.png) # 2 Inheritance ## 2.1 Inheriting behaviour via specialisation e.g., - subclass of item - inherit all public members of Item - can replace or customeise any intherited method - can add their own specialised methods (including constructors) - can’t concurrently be subclasses of anything else (single inheritance) - Things that know how to use Item will also accept Book or Disc. ![](https://i.imgur.com/Nul5ECp.png) ### 2.1.1 Specialisation in Java ![300](https://i.imgur.com/D7nZ2ON.png) ## 2.2 Inheriting behaviour via implenting an interface ![](https://i.imgur.com/tZX8uQT.png) - Search specifies a set of common behaviour. - public methods and constant fields only (no variable fields) - effectively an “inheritable�? public API (no implementation) ⇒ Catalogue must implement all Search methods - independent of inheritance via specialisation - a class can implement multiple interfaces - Things that know how to use Search will also accept Catalogue. ### 2.2.1 Interface in java ![](https://i.imgur.com/2cXr5CM.png) - Examples of built-in Java interfaces: (also see INFO 202) - Collection: collections of objects (lists, sets, maps, …) - Iterable: collections that can be iterated over - Comparable: objects that have a concept of ordering ## 2.3 Public API vs private implementation - The public API defines what a class can do - e.g., read and write data, manage a list of items - effectively a “promise�? or “contract�? to other classes that use it - should be as stable as possible - The private implementation defines how a class behaves - e.g., data stored in memory vs. CSV files vs. SQL DBMS vs. …, unsorted lists vs. sorted vs. unique vs. … - can change to improve speed, reduce memory, redesign architecture, take advantage of new language features, … - shouldn’t be exposed to other classes ## 2.4 Why public and private are decoupled - More stable public API: - doesn’t expose internal implementation details - can change internals without breaking promised behaviour - More flexible public API: - less coding required to switch implementations - can easily switch internal implementations on the fly (e.g., print receipt vs. save as PDF vs. send as email) - Programming to an interface (i.e., public API): - encapsulate public API into a class or (Java) interface - subclass or implement this to create specific implementations - use the top-level class or interface everywhere you would otherwise use the specialised implementations ## 2.5 Java collection interface example - A collection is a container for groups of objects: - e.g., lists, sets, stacks, trees, … - common behaviour (public API): add, remove, count items, … - specialised behaviour (private implementation): indexing, uniqueness, sorting, … - Java’s Collection interface defines common behaviour: - add() or remove() items - get size() of collection - … - All Java collection types implement Collection. Anything coded to work with Collection will accept *any* Java collection type. (e.g., ArrayList, HashSet, TreeMap, …) ### 2.5.1 Bad example ![](https://i.imgur.com/89PjFdT.png) - Internal details (ArrayList) are exposed in public API. - What if requirements change so that each product can appear only once? (requires HashSet) - Could change all ArrayList to HashSet, but: - need to update everywhere getAllProducts() and getProductsByName() are called! (⇒ massive breakage potential) - what if requirements change again ### 2.5.2 Good Example ![](https://i.imgur.com/j33SjYm.png) - Public API specifies Collection. (general) - Private implementation uses ArrayList. (specific) - Everything outside Inventory sees only Collection. (internal details not exposed) - Can switch to HashSet, TreeSet, … without breaking anything. # 3 Behaviour in Domain models ## 3.1 Rich domain models - True OO involves sending objects “native instructions�? beyond basic getter/setter methods: - e.g., they can save, display, update, validate, etc., themselves - often requires communicating with other objects - Advantages: - better encapsulation ⇒ more scope for reuse - methods are highly cohesive (focused) - natural fit with programming to an interface - Disadvantages: - many “chicken and egg�? situations ⇒ harder to use - bordering on taking things too far (too much abstraction) - well beyond comfort zone of many developers (“exotic�?) ### 3.1.1 Rich domain example: Library system ![](https://i.imgur.com/TCNp6vY.png) ## 3.2 Contrast with anaemic domain models - Objects have relatively little “native�? behaviour: (if any) - mostly just state - don’t inherit from anything else (class or interface) - getters/setters don’t really encapsulate much - methods manipulate only internal state (no external communication) - generally referred to as JavaBeans in Java (also POJO) - Require a lot of “plumbing�? code to shift data into and out of objects so we can do something useful with it. - De facto standard for most programmers/systems ![](https://i.imgur.com/snGpG4m.png) ## 3.3 Reducing the plumbing in anaemic models - Frequently need to move data between domain objects and other (sub)systems, e.g.: - GUI components (see INFO 202) - data stores (also see Lecture 17) - barcode management subsystem - shipping (sub)system - inventory (sub)system - … - “Processor objects�? can encapsulate these interactions: - effectively “(sub)system APIs�? that group related behaviour - either classes or (Java) interfaces, as appropriate - methods take relevant domain objects as arguments - Third-party frameworks can reduce the amount of code you need to write even further. (see INFO 202) ![](https://i.imgur.com/EoX8sTA.png) # 4 Lecture summary - There are a variety of behavioural diagrams in UML. - Behaviour can be inherited directly via specialisation, or indirectly by implementing an interface. - interfaces decouple public API from private implementation - programming to an interface - Domain models can be “rich�? or “anaemic�?. - anaemic more common - use “processors�? to encapsulate “plumbing�? code