Currencify
Tech Stack, Architecture & Code Style
- App implementation tries to follow SOLID and Clean Code and Clean Architecture principles.
- App uses Dagger 2 for dependency injection purpose.
- Network operations are done via the combination of Retrofit, RxJava 3, and Moshi.
- The app uses the principles/technologies mentioned above and RxJava 3 to increase cohesion and decrease the coupling between the layers/classes.
- Although it is a bit overkill for this small task, the app tries to demonstrate the Uncle Bob's Clean Architecture. There are 5 layers in the app:
- UI -> Dumb as much as possible, almost all of the view and presentation logic has been moved to the presentation layer. Uses ViewBinding to eliminate the boilerplate.
- Presentation -> Implements MVVM presentational design pattern by using Android Architecture Components (ViewModel, LiveData).
- Domain -> Pure Kotlin/Java layer that is responsible for the business/domain logic although there is not much for this app.
- Data -> Pure Kotlin/Java layer to decouple the library dependencies of the remote layer.
- Remote -> Pure Kotlin/Java layer to retrieve the data from the API.
Known Flaws
- UI is not the best since I thought the main scope of this task was not the UI. I still tried to do my best and tried to improve the UX at least.
- Unit and UI tests are missing due to the time limitations I have.
- Packages do not really represent the pure clean architecture as they can access each other's content (although they do not access). I would prefer having separate modules for each layer but wanted to keep it simple since the task is not that complex.
- There might be too much boilerplate code for some developers but I would prefer to keep the readability of the code as high as possible.
- I could not make a memory leak check due to the time limitations.
Repository
- My main work can be seen on the 'development' branch.
- If you would like to see my progress please refer to this link https://github.com/tartarJR/Currencify/projects.
- Each issue/task has the linked pull request that has the corresponding changes.
- One of my close friends did the code reviews for me and you might see his name and his comments in the repository.
- He has no Android knowledge(he is an IOS dev) and he has no impact on my solution. He only helped me to demonstrate a decent development flow.