是否有必要在Android项目中使用IOC框架

 能然然520 发布于 2022-11-07 06:13

是否有必要在Android项目中使用IOC框架?


本来只是想找个注解库用一下
结果顺便看了看相关的库

首先是

butterknife https://github.com/JakeWharton/butterknife

在任何项目中使用butterknife都是正确且没有问题的. 非常轻量级的库.
可以缩减一部分代码.

其次是

Dagger https://github.com/square/dagger

Dagger其实和butterknife一样也是 JakeWharton 写的, 算是一家的产品吧.
View binding注解部分和butterknife几乎一致.可以认为没有区别.
Dagger额外提供了 IOC框架 功能

最后是

RoboGuice https://github.com/roboguice/roboguice

google guice https://github.com/google/guice

RoboGuice在View Binding上和以上2个库没有区别
也额外提供了 IOC框架功能

它和 Dagger 的区别是
RoboGuice 是 运行时 通过反射实现的IOC
Dagger 是通过 APT(Annotation Process Tool) 在运行时 生成辅助类 实现的 IOC

参考了一些分析资料
https://github.com/android-cn/android-open-project-analysis/tree/master/dagger

又翻了一下Spring中使用IOC的例子...

IOC的核心是解耦...
解耦的目的是 .... 修改耦合对象时不影响另外一个对象...降低模块之间的关联

在Spring中IOC更多的是依靠 xml的配置...

而以上Android上的IOC框架均不使用xml配置系统....而且也没有必要....
毕竟不是web要去考虑server/system/db/web容器的差异...

常见的例子..

public class MainActivity extends Activity {
    @Inject Boss boss;
    ...
}

就看 扔物线 写的这个例子好了..

对于这个设计而言...谁被解耦了?

我认为MainActivity和Boss被解耦了.....更确切的讲....MainActivity和Boss的构造方法解耦了...
如果你下面需要使用Boss对象,仍然需要调用Boss中的方法...那么Boss和MainActivity依然存在依赖关系..
好处是,我修改Boss的构造方法不会影响MainActivity了...我可以修改Provider去自己获取参数..

Android中 Activity 一般不会参与复用..你不会去再写一个Activity继承MainActivity,也不会去生成多个MainActivity....即使同时存在多个MainActivity实例也是归系统管理..和你没有关系.... 所有通常我认为只有Boss是会复用的会变化的会被继承的...MainActivity的变化只和它自身有关系,不会影响系统中其它部分..

仔细思考,即使是在IOC框架中,耦合性也并没有消失,只是将耦合的部分从 Class之间转移到了 Class和IOC容器之间
回到上面这个部分...

你觉得 Activity 在 Android app中 处于 一个什么角色??
Activity不能充当容器角色么?

UI / 业务逻辑 / DB / Conection / Cache
所有组件都只和Activity产生依赖关系,互相之间互不影响....

在Activity外再嵌套一层IOC容器来解耦偶到底有无必要?
Activity为什么还需要解耦?

画一下2个模型图

我觉得本质上没有区别?

我构造一个场景
Activity需要做请求网络的操作,操作完成后写DB和Cache,IOC给你注入一个 HttpMananger / DBManager / CacheManager 又如何,你不要调用它们的方法吗? 耦合性并没有降低啊?

4 个回答
  • Dagger等IOC框架一般配合MVP等设计模式使用。
    IOC框架可以很好地解决大项目里,构造函数膨胀、依赖过于复杂等问题。
    所以你举这例子不太妥当,建议看一下Dagger2作者做的那个演讲,有提到IOC解决什么问题和如何解决这些问题。

    2022-11-12 01:37 回答
  • 场景:服务器没开发完…

    IHttp 接口
    MockHttpImpl 随便实现一下,返回个值
    HttpImpl 等服务器开发完了再实现

    这样就不用等服务器开发了

    2022-11-12 01:37 回答
  • cache = container.get('cache')
    至于这个cache的implementation是什么,你无需关心,这就是解耦
    如果你没有container.get('cache'),cache init代码就在activity里面
    如果你要修改cache implementation,如果没有container,你是不是要一个个activity改过去?

    2022-11-12 01:37 回答
  • 这么做也一方面是为了让代码写的更加优雅,可维护性更加好。

    2022-11-12 01:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有