The aim of this post is just to explain how to organise the domain layer in an architecture. A possible definition of domain layer is where the application business logic is implemented, or the told in the contrary way what is nor view neither data acquisition.
The domain layer is the fuzzy invisible border between View and Data layer. But as app grows in complexity (and in lines of code) is the cornerstone of your development, so this is why is important to have this layer under control.
The sequencer is the component that will handle the start up sequence, this is something thats starts very simple at the beginning of the implementation, but as time (and requirements) goes on could turn into a really nightmare 🎃. You can find the implementation details in the following post.
Managers is the wrapper class for accessing to a unique device services like bluetooth, maps, gyroscope… Or in case that you wanted to centralize a behaviour in a single class, for instance, a Session Manager for controlling wether a user was logged properly or not. This class is a singleton implementation.
Up to here this is good about this component. But watch out, to start abusing them! Is quite common that will start appear singletons as mushrooms. I recommend to read the following post.
Use cases functions are the entry point for any functionality requested by views. The reason for living of this component lies in:
- Unload task from views. Helps to reduce Massive View Controllers problem.
- Reusability. Is likely that you use the same functionality from different views.
- TDD. You can apply unit test to this function class.
Coordinators controls the flow of screens presented, is the coordinator who decides which is the next screen to present, not the view any longer…
This will help to reduce the amount of code to put in the view, and also its reusability, the same view can be placed in a totally different screen flow.
Use cases and coordinators working together but not mixed
Presenters interacts with use cases when some functionality has to be performed (e.g request data from a service, try to connect to a bluetooth device, get a map pinpoints,…). But in case that presenter considers that is no more longer usable (e.g. user select dismiss button to remove the view, or selected an item for pushing another view with the item details) it has to interact with the coordinator and will be the coordinator who will decide which is the next view to present.
In this post we have reviewed which is the role of Domain layer and its components.
In the next post will be presented the Data Layer and how to retrieve data independently where is phicially stored (ddbb, service, keychain, user defaults… ).