Slide 1

Slide 1 text

Android Modular Architecture

Slide 2

Slide 2 text

Christopher Alexander “It is the first steps in a design process which count for most. The first few strokes, creates the form.”

Slide 3

Slide 3 text

Challenges

Slide 4

Slide 4 text

Challenges • Independence: be able to work in a feature without impacting other developers.

Slide 5

Slide 5 text

Challenges • Independence: be able to work in a feature without impacting other developers. • Encapsulation: effective use of access modifiers to hide information from different modules.

Slide 6

Slide 6 text

Challenges • Independence: be able to work in a feature without impacting other developers. • Encapsulation: effective use of access modifiers to hide information from different modules. • Growth: a module should not increase size without bounds.

Slide 7

Slide 7 text

Module by Layer In Module by Layer, the highest level modules reflect the various application "layers", instead of features.

Slide 8

Slide 8 text

:app

Slide 9

Slide 9 text

:app :ui

Slide 10

Slide 10 text

:app :domain :ui DI injects use case in the presentation.

Slide 11

Slide 11 text

:app :domain :ui :data DI injects repository implementation in the domain. DI injects use case in the presentation.

Slide 12

Slide 12 text

:app :domain :ui :data DI injects repository implementation in the domain. DI injects use case in the presentation. :app knows about all modules, and need to set up the DI.

Slide 13

Slide 13 text

Challenges

Slide 14

Slide 14 text

Challenges • Independence: features has its implementation spread out over multiple modules.

Slide 15

Slide 15 text

Challenges • Independence: features has its implementation spread out over multiple modules. • Encapsulation: modules contains items that usually aren't closely related to each other.

Slide 16

Slide 16 text

Challenges • Independence: features has its implementation spread out over multiple modules. • Encapsulation: modules contains items that usually aren't closely related to each other. • Growth: As an application grows, the number of modules remains the same, while the number of classes in each module will increase without bound.

Slide 17

Slide 17 text

This results in modules with low cohesion with high coupling between each other.

Slide 18

Slide 18 text

The fundamental flaw with Module by Layer is that it puts implementation details ahead of high level abstractions.

Slide 19

Slide 19 text

Module by Feature Module by Feature uses modules to reflect the feature set. It tries to place all items related to a single feature (and only that feature) into a single module.

Slide 20

Slide 20 text

What is a feature?

Slide 21

Slide 21 text

What is a feature? A feature is fully independent, fine-grained and self contained service those messages are delivered over Intent by URLs.

Slide 22

Slide 22 text

:app

Slide 23

Slide 23 text

:app :feature1

Slide 24

Slide 24 text

:app :feature1 :feature2

Slide 25

Slide 25 text

:app :feature1 :feature2 :feature3

Slide 26

Slide 26 text

:app :feature1 :feature2 :feature3 :feature4

Slide 27

Slide 27 text

Challenges

Slide 28

Slide 28 text

Challenges • Independence: all items needed for a given feature are in the same module.

Slide 29

Slide 29 text

Challenges • Independence: all items needed for a given feature are in the same module. • Encapsulation: allows classes to decrease their scope from public to internal.

Slide 30

Slide 30 text

Challenges • Independence: all items needed for a given feature are in the same module. • Encapsulation: allows classes to decrease their scope from public to internal. • Growth: the number of classes within each package remains limited to the items related to a specific feature.

Slide 31

Slide 31 text

This results in modules with high cohesion and low coupling between each other.

Slide 32

Slide 32 text

Micro-Module Architecture

Slide 33

Slide 33 text

:app

Slide 34

Slide 34 text

:app :feature1

Slide 35

Slide 35 text

:app :feature2 :feature1

Slide 36

Slide 36 text

:app :feature2 :feature1 :component1

Slide 37

Slide 37 text

:app :feature2 :common :feature1 :component1 :design :testing

Slide 38

Slide 38 text

:app :feature2 :common :feature3 :feature1 :component1 :design :testing

Slide 39

Slide 39 text

:app :feature2 :component2 :common :feature3 :feature1 :component1 :design :testing

Slide 40

Slide 40 text

Module Structure

Slide 41

Slide 41 text

:module

Slide 42

Slide 42 text

:module ui

Slide 43

Slide 43 text

:module ui activity fragment viewmodel

Slide 44

Slide 44 text

:module domain ui activity fragment viewmodel

Slide 45

Slide 45 text

:module domain ui model usecase 
 repository activity fragment viewmodel

Slide 46

Slide 46 text

:module domain data ui model usecase 
 repository activity fragment viewmodel

Slide 47

Slide 47 text

:module domain data ui model usecase 
 repository activity fragment viewmodel repository

Slide 48

Slide 48 text

:module domain data ui model usecase 
 repository activity fragment viewmodel store repository local remote

Slide 49

Slide 49 text

Thank you.