Alessandro Recchi Antonello Fodde Android Software Engineer Android Software Engineer “One line of code, one ⌘ + ⌥ + L to clean it up” “Everything that Antonello says it’s probably wrong”
this page to load faster. How can we do it? A C Sure. The page is pretty new and uses a modern architecture. Let’s put a DB as a cache. It will take no time Nice!
Principle “separation of concerns … even if not perfectly possible is yet the only available technique for effective ordering of one’s thoughts” Edsgar Dikjstra, 1974
“Good architecture makes the system easy to understand, easy to develop, easy to maintain, and easy to deploy” Robert C. Martin, Clean Architecture UI Controllers Use Case Entity Repository DB External interfaces Devices Web Presenters
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Case Entity Repository Data Source Dependency Rule “Nothing in an inner circle can know anything at all about something in an outer circle” Robert C. Martin, Clean Architecture
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity RepositoryImpl Remote Data Source Local Data Source Repository Repository
Case Entity Repository Data Source Data Mappers Presentation Domain Data Domain Model UI Model Domain Model UI Model asDomainModel asUIModel Network Model DB Model
you must see the future. You must guess-intelligently. You must weigh the costs and determine where the architectural boundaries lie, and which should be fully implemented, and which should be partially implemented, and which should be ignored.” Robert C. Martin, Clean Architecture
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Case Entity Repository Data Source Layers Presentation Domain Data MVVM View View Model Use Case Entity Repository Remote Data Source Local Data Source Repository
Truth Single Source of Truth, in short SSOT, refers to the concept where certain data has only one official source to be used by data consumers (i.e. humans and software) for the true current version of that data. Source: https://www.dragon1.com/concepts/single-source-of-truth
UPDATED ABOUT ALL JAKE ONLINE ACTIVITIES? YOU WILL NEVER MISS A SINGLE JAKE QUOTE! Showcase App Jakebook “I love Jake!” by @lollipop.lover77 “thanks to this app I became a better developer!” by @honeycomb “The app crashes on Android 9…” by @PisForPankakes
Source data class TwitterUserTimelineItem( val id: Long, val created_at: String?, val text: String?, val user: User? ) data class Feed( val id: String, val image: String, val name: String, val content: String, val date: Date, val source: FeedSource ) TwitterUserTimelineItem.asDomainModel() Domain Data
@Dao interface RoomFeedDao { @Query("SELECT * FROM feed ORDER BY date desc") fun getFeed(): Flowable<List<RoomFeed>> @Query("SELECT * FROM feed ORDER BY date desc") fun getAllPaged(): DataSource.Factory<Int, RoomFeed> @Query("DELETE FROM feed") fun deleteAll() @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertFeed(feed: RoomFeed) @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertFeedList(data: List<RoomFeed>?) } interface LocalDataSource { fun getFeed(): Flowable<List<Feed>> fun insertFeeds(list: List<Feed>) fun getPagedFeeds(): DataSource.Factory<Int, Feed> }
fun getFeed(): Flowable<List<Feed>> fun insertFeeds(list: List<Feed>) fun getPagedFeeds(): DataSource.Factory<Int, Feed> } Paging with Room @Dao interface RoomFeedDao { @Query("SELECT * FROM feed ORDER BY date desc") fun getFeed(): Flowable<List<RoomFeed>> @Query("SELECT * FROM feed ORDER BY date desc") fun getAllPaged(): DataSource.Factory<Int, RoomFeed> @Query("DELETE FROM feed") fun deleteAll() @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertFeed(feed: RoomFeed) @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertFeedList(data: List<RoomFeed>?) }