The 3h workshop version of the 3d Advanced Architectures training (http://canonicalexamples.com/courses_ios/#iOSArch). I have delivered this one or the Android counterpart in more than 20 cities in Europe and America. This is version that I shared in Cluj Napoca.
3. #Swift3CA
Agenda
★ Goals
★ Before Clean Architecture
★ Clean Architecture Concepts
★ Implementation rules
★ Example App: RealProgrammers
★ Implement 1st User Story
★ Connect the pieces
★ References
4. #Swift3CA
Full Version: 3d
★ MVX
• Learn
• Extract MVP
★ 1st User Story
• Use Case
• Presenter
• View
• Entity Gateway
• Initial connection
★ Connectors
• Memory
Management
• Reuse
★ 2nd user story: add
• Navigation: Modal
vs Push
• Command pattern
• Immutables
• Observation
★ 3rd user story: detail
• Identity
• Use case factories
• 2nd use case in
the same view
★ Other use cases: just
logic
★ Forward flow
synchronization
★ Dependency Injection
★ Asynchrony
• Async entity
gateway
• Other tasks
5. #Swift3CA
LIVE Online Training
★ 3 days (same
weekday 3
continuous weeks)
★ 10 people max
★ Live coding shared
via video
conference
★ Chat running all the
time
★ Complete repo with
many commits and
Tests> 95%
★ Additional exercises
★ Ask as much as you
want!
13. – Martin Fowler
“Different people reading about MVC in different places take
different ideas from it and describe these as 'MVC'. If this doesn't
cause enough confusion you then get the effect of
misunderstandings of MVC that develop through a system of
Chinese whispers.”
14. #Swift3CA
Tricky question
★ If [Model] + [View] + [Controller /
Presenter / View Model] = [TheApp]
★ How can Controller != Presenter != View
Model?
★ Responsibilities matter!
★ Other components (patterns) might be
involved.
15. #Swift3CA
The goal
★ Separation of responsibilities into roles. Is
it? Not historically. Other motivations.
Solving problem d’jour.
★ Now why?
• Testability
• Reusability
• Extensibility
16. #Swift3CA
MVC: The early days
★ Separated presentation: Model <->
Presentation (= V+C)
★ Observer originated from MVC, but
observing full object (properties = scalars)
★ Variations: Passive model, i.e. model
cannot send updates (for example HTTP)
19. #Swift3CA
iOS MVC
★ View
• Only UIView subclasses
• Show information and handle
events to controller
• Fully reusable library of views.
Consistent L&F
★ Controller
• Views delegate+dataSources
control what’s displayed
• Receive the events and
converts them into calls to the
model
• Observe the model and update
what is displayed on the view
• Implement presentation logic
★ Model
• Implements domain knowledge
/ business logic. Provides data
and commands
• Can be observed
• No references to the UI
Flow synchronization vs Observer
synchronization
20. #Swift3CA
MVC: testability
★ The views are somebody else's (Apple’s) problem.
★ Model is easy to test.
★ Controller is huge & has dependencies on the
model and on the views => Complex to test.
★ Too many levels of abstraction, only a few
methods exposed.
★ Some stuff in view controller that it is usually not
tested.
31. #Swift3CA
Rules
★ We are going to develop one module at a
time
★ Follow the dependency rules
★ YAGNI
★ No early optimization applied
★ It is easy to add tests, but no TDD in 3h
OK??
33. #Swift3CA
Features
★ Add potential candidates (Name and important skills)
★ Show list of candidates with relative interview date
★ Remove candidates from list
★ Edit the data of any candidate
★ Contact candidate by email
★ Sync between devices
★ Universal app
★ Eye candy
★ iOS/macOS/watchOS/tvOS?
★ Credits
34. #Swift3CA
MVP Features
★ Add potential candidates (Name and important skills)
★ Show list of candidates with relative interview date
★ Remove candidates from list
★ Edit the data of any candidate
★ Contact candidate by email
★ Sync between devices
★ Universal app
★ Eye candy
★ iOS/macOS/watchOS/tvOS?
★ Credits
39. #Swift3CA
Interactor
★ Grab data from the entity gateway
★ Convert it to what is needed to be
presented
★ Pass the results to the presenter
★ Start by defining the protocols
41. #Swift3CA
Presenter
★ Direction: only from interactor to view
★ Configure the (dumb) view with the data
provided to it
★ Create the protocol for the view (Simplest
wins!)
43. #Swift3CA
View
★ Combination of Views + View Controller
★ Make it dumb (passive), but useful
★ Tell the presenter about the relevant
events
★ Keep them decoupled
45. #Swift3CA
Back to the Presenter
★ Implement responses to the user events.
★ Use the interactor
★ Add presentation logic to the presenter
part
46. #Swift3CA
Presentation Logic
★ Date should be relative (“Today”, “1d ago”,
“2w ago”)
★ That means current date is a dependency
that we want to control for tests
★ Use default value for the current date
48. #Swift3CA
Entity Gateway
★ Basic
★ Defer the decision of the persistence
framework for later.
★ Implement the minimum functionality in a
basic object.
★ Implications of the repository pattern.