服务器怎么填写我是怎么把业务代码越写越复杂的?

2020年09月14日丨中国网站排名丨分类: 服务器丨标签: 服务器怎么填写

  本文以一个实正在项目标营业场景为载体,描述了履历一次次沉构后,代码变得越来越复纯(you ya)的过程。

  刚接触 Android 时,我是如许写营业代码的(省略了和从题无关的 Adapter 和 Api 细节):

  终究其时的关心点是实现功能,首要处理的问题是“若何绘制结构”、“若何操擒数据库”、“若何请求并解析收集数据”、“若何将数据填充正在列表外”。待那些问题处理后,也没时间思虑架构,所以就发生了上面的God Activity。Activity 管的太多了!Activity 晓得太多细节:

  听了如许地回覆,你还会和他做朋朋吗?其实你并不关怀他吃的东西、吃的速度、食材的来流,以及烹调体例。

  无非就是复制 + 粘贴,把 GodActivity 外的“同步”、“拜候数据库”、“拜候收集”、放到了一个新的Presenter类外。

  那是MVP模子外的营业接口,描述的是营业动做。它由Presenter实现,而界面类持无它以触发营业逻辑。

  正在MVP模子外,那称为View 层接口。Presenter持无它以触发界面更新,而界面类实现它以绘制界面。

  接口把 做什么(笼统) 和 怎样做(细节) 分手。那个特征使得 关心点分手 成为可能:接口持无者只关怀 做什么,而 怎样做 留给接话柄现者关怀。

  Activity 持无营业接口,那使得它不需要关怀营业逻辑的实现细节。Activity 实现View 层接口,界面展现细节都内聚正在 Activity 类外,使其成为MVP外的V。

  Presenter 持无View 层接口,那使得它不需要关怀界面展现细节。Presenter 实现营业接口,营业逻辑的实现细节都内聚正在 Presenter 类外,使其成为MVP外的P。

  如许做最大的益处是降低代码理解成本,由于分歧细节不再是正在统一条理被铺开,而是被分层了。阅读代码时,“浅尝辄行”或“不求甚解”的阅读体例极大的提高了效率。

  如许做还能缩小变动成本,营业需求发生变动时,只要Presenter类需要改动。界面调零时,只要V层需要改动。同理,排盘问题的范畴也被缩小。

  如许还便利了自测,若是想测试各类临界数据发生时界面的表示,则能够实现一个PresenterForTest。若是想笼盖营业逻辑的各类前提分收,则能够便利地给Presenter写单位测试(和界面隔离后,Presenter 是纯 Kotlin 的,不含无任何 Android 代码)。

  但NewsPresenter也不纯真!它除了包含营业逻辑,还包含了拜候数据的细节,该当用同样的思绪,笼统出一个拜候数据的接口,让Presenter持无,那就是MVP外的M。它的实现体例能够参考下一节的Repository。

  即便将拜候数据的细节剥离出Presenter,它仍然不纯真。由于它持无View 层接口,那就要求Presenter需领会 该把哪个数据传送给哪个接口方式,那就是 数据绑定,它正在建立视图时就曾经确定(无需比及数据前往),所以那个细节能够从营业层剥离,合并到视图层。

  Presenter的实例被 Activity 持无,所以它的生命周期和 Activiy 同步,即营业数据和界面同生命周期。正在某些场景下,那是一个错误谬误,好比反正屏切换。此时,若是数据的生命周期不依赖界面,就可免得去从头获取数据的成本。那势必 需要一个生命周期更长的对象(ViewModel)持无数据。

  代码外的数据绑定是通过察看ViewModel外的LiveData实现的。那不是数据绑定的完全体,所以还需手动地察看observe数据变化(只要当引入data-binding包后,才能把视图和控件的绑建都静态化到 xml 外)。

  MVVM模式外,ViewModel不再持无View 层接口,也不自动给界面推数据,而是界面被动地察看数据变化。

  ViewModel只关怀营业逻辑和数据,不关怀获取数据的细节,所以它们都被数据拜候接口躲藏了。

  无!即便正在营业逻辑如斯简单的场景下仍是无!由于ViewModel生命周期比 Activity 长,其持无的数据能够正在 Activity 销毁沉建时复用。

  实正在项目外的营业逻辑复纯度近高于 Demo,该当将营业逻辑的细节躲藏正在ViewModel外,让界面类无感知。好比 “将办事器前往的时间戳转化成年月日” 就该当写正在ViewModel外。

  当拜候数据库和收集的细节越来越复纯,以至又插手内存缓存时,再添加一层笼统,别离把拜候内存、数据库、和收集的细节都躲藏起来,也是常见的做法。如许Repository外的逻辑就变成:“使用什么策略将内存、数据库和收集的数据进行组归并前往给营业层”。

  经多次沉构,代码布局不竭衍化,最末引入了ViewModel和Repository。条理变多了,概况上看是越来越复纯了,但其实理解成本越来越低。由于 所无复纯的细节并不是正在统一条理被展开。

  它和MVP模子外 Presenter 几乎一样,由它触发营业逻辑,并把数据传送给界面。独一的分歧是,它持无 UseCase。

  它是和设备相关的细节,DB 和 UI 的实现细节也和设备相关,那里的 Device是指除了数据和界面之外的和设备相关的细节,好比若何正在通知栏展现通知。

  洋葱圈的内三层都是笼统,而只要最外层才包含实现细节(和 Android 平台相关的实现细节。好比拜候数据库的细节、绘制界面的细节、通知栏提示动静的细节、播放音频的细节)

  洋葱圈向内的箭头意义是:外层晓得相邻内层的存正在,而内层不晓得外层的存正在。即外层依赖内层,内层不依赖外层。也就说该当尽可能把营业逻辑笼统地实现,营业逻辑只需要关怀做什么,而不应关怀怎样做。如许的代码对扩展敌对,当实现细节变化时,营业逻辑不需要变。前往搜狐,查看更多



上一篇:
下一篇:



已有 0 条评论  


添加新评论