几天前我正在接受采访。招聘人员问了我这个问题,但他回答后我不知道也不明白。问题是:
“我有一个多模块系统。我有一个数据模块和一个应用程序模块。假设我没有在我的数据模块中放入任何android库,这是禁止我添加它的。我如何注册或访问此数据模块中的共享偏好设置?”
我无法回答这个问题,但他用依赖倒置的方式说道。有人可以解释一下这是如何工作的吗?他的回答对我来说还不够。
这实际上是一个好问题,它验证了候选人是否知道如何设计模块化应用程序。
我们的想法是抽象数据加载和保存的方式。我们创建的界面不以任何方式引用 Android。根据具体情况,可能是这样的:
interface DataRepository {
fun load(): MyData
fun save(data: MyData)
}
该接口要么存储在数据模块中,要么存储在公共模块中,并且不以任何方式引用Android。
数据模块使用该接口。它使用它来加载和保存数据,但是它没有实现它,所以它不知道后面的数据库是什么类型。数据模块也不知道如何创建存储库 - 它从外部接收它。在数据模块中处理此问题的类可能如下所示:
class DataHandler(private val repo: DataRepository) {
fun doSomething() {
val data = repo.load()
...
repo.save(data)
}
}
应用程序模块知道如何访问数据,它实现了存储库:
class SharedPrefRepository : DataRepository {
override fun load() = {
// load the data from shared prefs
}
override fun save(data: MyData) {
// save the data to shared prefs
}
}
然后应用程序使用这样的数据模块:
val dataHandler = DataHandler(SharedPrefRepository())
dataHandler.doSomething()
这样,只有应用程序模块知道 Android 和共享首选项,但数据模块仍然可以访问共享首选项中的数据。
这种方法称为依赖倒置,因为数据模块知道它需要存储库作为其依赖项,但它不会直接获取此依赖项 - 它是提供给它的。