带有状态变量的java MVP模式Android Avoid presenter
我正在开发一个Android应用程序,我正在对几个月前就已经存在的一个类进行重构,我在presenter上遇到了一个问题,他们存储了一个服务的响应
private lateinit var itemDetail : ItemDetail
它可以工作,你可以测试它,但我不喜欢这种方式,因为你必须做一个“黑客”来测试它。假设我的演示者有这些方法
interface Contract {
interface Presenter {
fun onViewReady(itemId: String)
fun onButtonTap()
}
interface View {
}
}
然后,当打开DetailActivity
时,我会presenter.onViewReady(itemId)
并在演示者中调用细节项。
当点击按钮并执行presenter.onButtonTap()
时会出现问题。我确实需要知道此项的类型,并且此信息在第一次调用的结果中onViewReady()
,因此我理解presenter上的存储变量,因此我可以执行以下操作:
...
override fun onButtonTap() {
if(::itemDetail.isInitialized()){... do something with model}
}
但是当测试它时,如果我只想测试onButtonTap
,我需要执行完整的流程来存储这个变量,然后能够从该对象获取属性并避免NPE
我想既然我有了我的getItemDetailUseCase(itemId: String)
,我可以重新调用服务,这样测试就更容易了,我可以避免演示者中的变量,但性能不好
我还想过创建一个“存储库模式”,在那里我有一个“真相的来源”,但我看到了这种过分的杀伤力,因为这是哪种缓存?我不想将其存储在SharedReferences(Android的内部存储)或Room(Android数据库)中
另一个选择是这样做
internal interface ItemDetailDataSource {
fun retrieveItemDetail(): ItemDetail?
fun storeItemDetail(itemDetail: ItemDetail)
fun removeItemDetail()
}
@Singleton
internal class ItemDetailCacheDataSourceImpl : ResourcesCacheDataSource {
private var itemDetail: ItemDetail? = null
override fun retrieveItemDetail(): ItemDetail? {
return itemDetail
}
override fun storeItemDetail(itemDetail: ItemDetail) {
this.itemDetail = itemDetail
}
override fun removeItemDetail() {
itemDetail = null
}
}
但这是不安全的,因为Android可以在需要空间的时候删除这个类,同样的情况也会发生
你理想的方法是什么
共 (0) 个答案