你的业务代码,是不是都写在了Activity里?

互联网分层架构演进有两条核心原则:
(1)让上游更高效的获取与处理数据复用);
(2)让下游能屏蔽数据的获取细节封装);
你的业务代码,是不是都写在了Activity里?
数据从数据库/缓存层,到微服务层,到站点应用层,最终都汇聚到客户端。服务端的分层架构设计已经讲了很多,客户端的分层架构设计应该怎么玩呢,服务端的分层架构设计是否有能够借鉴的地方呢,今天和大家简单聊一聊。
 
先来看小诗一首:
 
《Android猿》
曾经
    所有代码
    都被写在Activity里
几乎
    没有代码
    可以复用
每当
    看到Activity里
    2000行的函数
我就
    想要离职
 
上面,是团队中一个文艺Android程序员的自述,表达的核心观点是:几乎所有代码都写在了Activity里(不理解Activity的,暂且认为是MVC里的view层),完全没有封装和复用。
 
假设一个具体的例子,微信登录的界面,点击登录按钮,此时可能要执行:
(1)验证用户名密码;
(2)拉取好友列表;
(3)拉取用户信息;
(4)拉取好友信息;
(5)拉取离线消息
(6)...
画外音:那个大月亮的画面,要卡很久。
 
如果把这些都写在微信“登录Activity”里,会发现一些很严重的问题:
(1)登录整个逻辑不能复用;
(2)登录过程中的每个子逻辑也无法复用;
 
假设产品里有一个“离线后重新登录”的功能,步骤与登录相同,就需要把上述在“重新登录Activity”里代码复制一遍
 
又假设产品里有一个地方需要“拉取用户信息”,也将把“登录Activity”里“拉取用户信息”的代码复制一遍
 
封装复用的道理谁都懂,拷贝代码的坏处也谁都明白,那为什么大家还这么做,代码越来越“腐烂”呢?
 
根据个人经验,主要是这么几点原因:
(1)早期业务压力大,APP是少数几个同学的,没有提前做规划;
 
(2)后期代码越来越臃肿,不敢动,一动怕影响功能,怕出问题,怕担责任;
 
(3)项目中,是以功能界面进行编码划分的,一个同学会同时负责MVC三部分编码,加之项目压力又大,既然是一个人写,就没必要分层了,搞多了调用反而麻烦;
 
(4)项目中,有个需求好像之前做过,代码一看,写在Activity里,纠结。抽象成函数?还得改别人的代码,算了,还是拷贝一份吧;
 
(5)…
 
不管历史原因,项目原因,个人的原因,大家都知道分层抽象,代码复用是正确的,那有什么方案能够将这个分层抽象落地,从后端的分层架构中是否有可借鉴的地方呢?
 
你的业务代码,是不是都写在了Activity里?
一个典型业务系统的后端架构如上:
(1)web-server层调用RPC接口,从service层获取数据,拼装html/json,完成数据展现;
(2)biz-service/data-service向上游提供可复用的原子接口,实现业务逻辑,并通过DAO层,从db层获取数据;
(3)db层提供数据;
 
APP端的分层架构不是非常相似么?
 
还是以登录业务为例:
你的业务代码,是不是都写在了Activity里?
(1)登录Activity有两个按钮,一个确认按钮,一个取消按钮,这两个按钮的点击,分别只能调用一个函数:

 - on_LoginConfirm_Click

 - on_LoginCancel_Click

这里相当于展现层,除了交互与展现,View层只能调用这两个函数。
 
(2)这两个函数的实现,是通过若干可复用的“原子业务逻辑”函数实现的:

 - 验证用户名密码:bool verifyPass(name, pass)

 - 拉取好友列表:ListgetFriendList(uid)

 - 拉取用户信息:Use rgetUserInfo(uid)

 - 拉取好友信息:ListgetUserInfo(List)

 - 拉取离线消息:ListgetOfflineMst(uid)

这相当于服务层,实现业务逻辑,提供封装和复用
 
(3)“原子业务逻辑”函数执行的过程中,需要访问数据,数据的获取又分为两类:

 - 同步获取:通过文件,内存,本地数据库获取

 - 异步获取:从server获取,往往通过回调实现

这里相当于数据层,向上游屏蔽数据获取的复杂性,分别用不同的Proxy去实现。
 
在这种结构下:
(1)展现层非常轻,只调用一个函数,用于展现数据;
(2)“原子业务逻辑”可以复用,不同的展现层Activity可以随意组合,实现不同的业务逻辑,用于处理数据;
(3)Proxy对上游屏蔽的数据获取的复杂性,向上游提供数据获取接口,用于获取数据;
 
分层架构封装复用的思想,前后端有共通的地方。
 
Activity里一坨坨复杂的代码,也是你曾经的痛么?
推荐文章
每秒100W次的计数,架构这样设计
竞价排名真不是谁出价最高,一定排前面
数据库软件架构,到底要设计些什么
 
明明知道要封装和复用,为何实现起来如此的困难呢?

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5921

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月11日 下午8:07
下一篇 2022年5月11日 下午8:08

相关推荐

  • Windows日志事件ID说明

    日志路径:C:WindowsSystem32winevtLogs查看日志:Security.evtx、System.evtx、Application.evtx如何查看:右键我的电脑-管理-系统工具-事件查看器,或者eventvwr查看事件查看器 打开Windows系统的事件查看器,右键单击系统或安全日志,选择筛选当前日志,在筛选器中输入下列事件ID即可。 &...

    技术 2022年6月13日
    22700
  • 应用开发安全指南

    1.概述 本指南是IT安全保障体系建设规范的一个组成部分,全面阐述了IT系统应用开发整个软件生命周期所必须遵照的设计、编码、测试方面的安全要求,阐述了不同开发环境和编码语言条件下安全开发的相关规范要求。   1.1.目的 本指南针对xxxx应用系统应当遵循的应用开发安全标准进行了规范性说明,旨在指导应用系统设计人员、代码开发人员和安全检查管理人员进...

    技术 2022年5月27日
    1200
  • 为什么MySQL要升级组复制?1分钟系列

    前几天发了《Galera,MySQL主从之外的另一种选择》之后,很多朋友在评论里留言: “这不就是Oracle Rac吗?” “这不就是MGR吗?” …   思路比结论重要,为什么比是什么重要,今天就花1分钟,说下这里面架构演进的思路。 画外音:大家不想听底层细节,就不深入细节了。   最早的数据库都是单机的,其最大的痛点是啥? 无法线性扩展。   磁盘能力...

    2022年5月11日
    1700
  • 零基础学Java第六节(面向对象二)

    本篇文章是《零基础学Java》专栏的第六篇文章,文章采用通俗易懂的文字、图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号【编程攻略】 继承 创建一个Person类 我们创建一个用于描述人的类。我们怎么抽象出一个人这个类呢?我们以不同的角度做抽象,得到的属性和行为都会有些区别。这里,我们主要从人的社会属性来抽象。为了表示性别,我们先顶一个枚...

    2022年5月22日
    1500
  • MySQL事务已提交,数据却丢了(MySQL事务提交,数据丢失)

    有个水友提问: 老师,我们有一次MySQL崩溃,重启后发现有些已经提交的事务对数据的修改丢失了,不是说事务能保证ACID特性么,想问下什么情况下可能导致“事务已经提交,数据却丢失”呢?   这个问题有点复杂,得先从redo log说起。   为什么要有redo log? 事务提交后,必须将事务对数据页的修改刷(fsync)到磁盘上,才能保证事务的ACID特性...

    2022年5月10日
    4000

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信