一种新的架构设计思路,用户行为驱动开发

2023-05-16

前提

用户行为驱动开发是什么?

它是一种适用前端的面向用户行为的开发思想,是一个用户行为的产生到执行,驱动数据的产生,再由数据流驱动渲染的流程。我认为,前端要完成的工作就是接收用户行为,解析用户行为,到给用户一个反馈。在各种用户行为形成一个序列后,在之后的开发中可以得到很多方便。

用户行为驱动开发是如何诞生的?

由于每个 App 都需要采集数据进行分析,需要进行数据埋点,这些数据往往都是一个用户行为加上一些业务数据,如果使用代码埋点的方式,就会导致 UI 代码中总要掺杂着一些额外的埋点逻辑,比如一个 button 的 onClick 中有一段获取业务数据并发送埋点事件的代码,久而久之,代码就会变得臃肿不堪。现在虽然有无痕埋点的方案,但是成本过高,小公司去开发不是很现实。

出了上面的问题后,我意识到用户行为是一个关键点,其实每一个需要采集的数据都由一个或几个用户行为拼凑出来的,比如用户点击了登录按钮,其实就是由两个 Action 组成,ButtonClick 和 LoginAction。再比如,用户上拉加载更多数据,其实就是产生了 PullUpToLoadMore 和 GetXXXDataAction 。

带着这样的思考,我就开始尝试了面向用户行为开发。

其他说明

  • 我是 Android 开发,之后的一些例子可能更适用于移动端,但思路上适合各种前端的
  • 观察者(订阅\发布)模式,解耦利器,用户行为驱动开发使用了大量的观察者模式,让每一个部分职责单一明确
  • 本文不讲代码的具体实现,只讲思想,之后可能会写其他的文章具体讲实现

正文

一、UserAction 的类型
在这里插入图片描述

如图,展示的是移动端的一些基本操作,左边四个是针对列表页面的操作,分别为「下拉刷新」「上拉加载更多」「Item 曝光」「Item 点击」。剩下四个为「PageView -> 浏览页面」「UseDomainService -> 使用业务服务」「 ButtonClick -> 按钮点击」「ComponentShowUp -> 组件展示」。

这里具体解释一下「使用业务服务」和「组件展示」

  • 「使用业务服务」可以看做是用户在使用公司的业务,比如每个公司都会有登录注册,再比如公司中特殊的业务,如看视频或者获取一组新闻数据等
  • 「组件展示」是指一个控件或组件弹出,比如 Android 中的 Dialog\Toast\PopupWindow 以及自定义的
    Window 等

二、UserAction 驱动渲染的过程

首先说说,在一个简单的列表页中,UserAction 是怎样工作的
在这里插入图片描述

首先不考虑数据是怎么获得的,只想 UserAction 如何应用在 UI 代码中,就是图中的 5 个步骤。 UI 只负责生产对应的 UserAction,然后观察它,它在执行后会产生对应的结果,UI 只需要使用结果去渲染。

所以 UI 的职责很明确:

  • 产生 UserAction
  • 执行 UserAction
  • 接收数据,进行渲染

UI 中的代码大概就像这样:

//页面开始显示一个列表
start() {
     observer = List<xxx> result -> { 
        render(result);
    }
    new GetXXXListAction().execute(observer);
}

//登录
loginBtn.setOnClickListener(v -> {
    ButtonClickAction btnClickAction = new ButtonClickAction();
    btnClickAction.enqueue();

    LoginAction loginAction = new LoginAction();
    loginAction.execute(observer, params);// observer 用于观察登录状态变化,参数为用户名密码
})

三、UseDomainAction 的执行过程
在这里插入图片描述

用户选择使用我们的 app,就是在使用我们提供的业务服务,所以业务逻辑处理是我们平时开发精力投放最多的一部分,我具体说一下「UseDomainService」是如何工作的。基于模块化开发,我们每个业务应该对一个模块,所以 action 执行时就是调用我们的业务模块的接口,这里针对业务模块的异步请求会再次使用观察者模式或是个 CallBack ,action 观察业务模块,然后接收模块返回的结果,再将结果发给执行 action 的页面。

下面是针对数据流向的一个图,可概括为UI -> Action -> Data -> ViewModel -> Render,UI 产生用户行为,用户行为驱动数据产生,数据驱动 UI 渲染
在这里插入图片描述

四、其他 UserAction 的使用方式

  • 「PageView」:可在 LifecycleManager 的 onActivityResumed 方法中进行创建,然后取到每个
    Activity 的路由 url 或是类名,存放到 PageViewAction 中。如果你有一个 BaseActivity,也可写在
    BaseActivity 的 onResume 方法中
  • 「PullDownToRefresh/PullUpToLoadMore」: 可在列表刷新控件的 callback 中,创建这个
    Action,例如继承 SmartRefreshLayout 然后重写 refresh 和 loadMore 方法,在里面加上对应的
    Action
  • 「ButtonClick」:和上面?类似,继承 Button,在 onClick 中,添加 ButtonClickAction
  • 「ComponentShowUp」:也是继承基础控件,然后再 show 的时候添加这个 Action
  • 「ItemImpression」:这个比较特殊,是列表中每个 item 曝光的行为,我的做法是在 RecyclerView
    的OnChildAttachStateChangeListener 中的 onChildAttached
    方法中记录,并且要绑定一些业务数据

这些 Action 在生成或执行时需要存放到一个列表里,形成一个序列,下一节会具体介绍。

五、UserActionSequence 用户行为序列

以下展示的是从开屏页,跳转到登录页,然后点了登录按钮的一个 UserActionSequence

在这里插入图片描述
假如数据需要我们在登录按钮处埋点,我们只需要从序列中找到对应的 Action 组成事件发到后端即可。当然后端最好也抽象出一些通用事件配合前端,那样用户序列的威力就会发挥到极致,基本可以在 UI 代码中做到无痕。下一节会简单说一下用户序列如何配合埋点系统做到基本无痕的埋点方式。

六、浅谈埋点

在这里插入图片描述
按职能解释「EventTracker」的每一部分:

  • 「ProcessedActionBuffer」: 需要观察 UserAction 入队,当有新 Action 入队时,就将其存到
    ProcessedActionBuffer 中,并做一些特殊处理,比如「PageView」 我们是在 onResume 时生成的,但有时弹
    Dialog 再回来的时候又会触发一次「PageView」(Android Activity
    生命周期决定的,其他平台可能不会有这种问题),所以需要去重,保证发送没有冗余的数据给后端
  • 「EventActionMapper」: 用于映射 Action 和 Event,其实就是一套行为和事件的转换规则(需要前后端配合)
  • 「EventBuffer」: 存储转换过的
    Event,有一套自己的策略进行缓存(例如大于100条存入本地数据库),还有一套策略用于发送(1分钟轮训一次 EventBuffer
    进行发送)

图中还画了 Logger 和 Other 两个模块,Logger 可以根据行为序列记录一些日志,用于分析 Crash 和一些业务的异常,Other 大家就可以根据自己的脑洞和需要进行设计了,比如 UserActionSequence 是把 UserAction 序列化为 json 的过程,我们也可以把 json 反序列化成对象,然后再交给对应的 UI 去执行,这样就可以完成 UI 自动化测试。

总结

原来常使用的 MVP 或者最近比较火的 Android Architecture Component 使用的 MVVM,都不能很好的用代码来表示用户行为(代码可读性不够直观),虽然 Presenter 和 VM 的职能也是用来解释用户行为获取数据再到驱动渲染,但我觉得对于程序员来说还是不够友好。但使用 UserAction 来贯穿整个前端的流程,一切看起来就变得自然了,UI、模块、数据的职责也都显得更单一了。

重要的是这样开发是我们获得了用户的操作序列,一切的数据源于用户。有了它对以后的分析和其他的开发都会有很大帮助。

免费获取安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、Kotlin、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加:936332305 / 链接:点击链接加入【安卓开发架构】:https://jq.qq.com/?_wv=1027&k=515xp64

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种新的架构设计思路,用户行为驱动开发 的相关文章

  • 海思芯片(hi3536av100)启动模式选择

    1 支持多种模式可配置 1 支持BootRom启动 2 支持从 SPI NOR Flash 启动 3 支持从 SPI NAND Flash 启动 4 支持从 eMMC 启动 5 支持 PCIe 从片启动 2 启动方式的选择 BOOT SEL
  • C语言头文件详解

    1 include的作用 简单一句话 xff1a 在include的地方 xff0c 把头文件里的内容原封不动的复制到引用该头文件的地方 2 头文件的引用 头文件引用有两种形式 xff1a include lt stdio h gt 和 i
  • wps云文档 wps自动备份怎么设置和取消

    转载请说明来源于 34 厦门SEO 34 本文地址 xff1a http www 96096 cc Article 169633 html wps云文档 WPS 为用户提供了自动备份的功能 xff0c 这为用户带来了方便的同时也给用户带来了
  • IDEA中Spring的配置使用

    IDEA中Spring的配置使用 1 首先创建JavaEE Web Application项目 xff0c 勾选Spring xff0c Libraries选择Set up library later xff08 有spring jar包的
  • content-type类型总结

    content type content type是http请求的响应头和请求头的字段 当作为响应头时 xff0c 告诉客户端实际返回的内容的内容类型 作为请求头时 xff0c 客户端告诉服务器实际发送的数据类型 前端开发过程中 xff0c
  • 外包干了6年,寄了

    前两天有读者想我资讯 xff1a 我是一名Android工程师 xff0c 工作已经四年多快五年了 现在正在找工作 xff0c 由于一直做的都是外包的项目 技术方面都不是很深入 xff0c 现在找工作都是会问一些 xff0c 四大组件 xf
  • java.lang.RuntimeException: Unable to instantiate activity ComponentInfo(不能实例化)异常解决

    java lang RuntimeException Unable to instantiate activity ComponentInfo xff08 不能实例化 xff09 异常解决 一 可能出现的原因及解决方法 xff1a xff0
  • Error:java: Compilation failed: internal java compiler error 的解决过程

    1 错误描述 xff1a IDEA导入一个新的项目 xff0c 运行时包编译失败 2 错误原因 这个错误的原因是因为 JDK 版本问题 xff0c 有两个原因 xff0c 一个是编译器版本不匹配 xff0c 一个是当前项目 JDK 版本不支
  • SpringCloud-21-Hystrix全局降级和解耦降级逻辑

    8 6 全局降级方法 通过上面的方式实现服务降级时 xff0c 需要针对所有业务方法都配置降级方法 xff0c 这极有可能会造成代码的急剧膨胀 为了解决该问题 xff0c 我们还可以为所有业务方法指定一个全局的回退方法 xff0c 具体步骤
  • Linux学习-61-Linux系统服务管理

    14 Linux系统服务管理 系统服务 xff1a 服务是在后台运行的应用程序 xff0c 并且可以提供一些本地系统或网络的功能 Linux 中常见的服务有那些 xff0c 这些服务怎么分类 xff0c 服务如何启动 xff0c 服务如何自
  • Linux学习-84-安装PHP

    17 13 安装PHP PHP xff08 PHP xff1a Hypertext Preprocessor递归缩写 xff09 中文名字是 xff1a 超文本预处理器 xff0c 是一种广泛使用的通用开源脚本语言 xff0c 适合于Web
  • redis学习-33-SpringBoot整合redis

    36 SpringBoot整合redis SpringBoot操作数据 xff1a 使用spring data项目 例如 xff1a jpa jdbc mongodb redis SpringData也是和SpringBoot齐名的项目 x
  • redis学习-34-PHP/Python使用Redis

    37 PHP使用Redis 首先需要熟练掌握 PHP 语言 xff0c 再者是已经安装了 PHP Redis 扩展程序 37 1 安装扩展程序 首先下载 PHP Redis 扩展程序 xff0c 下载的扩展程序要与 Redis 版本相符合
  • redis学习-35-Redis配置项汇总

    40 配置项汇总 对 Redis 的常用配置项和基本命令做简单的总结 xff0c 可以把本章看做简版的速查手册 不过 xff0c 需要注意的是由于 Redis 不同版本的差异 xff0c 配置项会多少存在一些不同 xff0c 但总体的来说
  • 韦东山:机会总是留给有准备的人(转)

    最近电子发烧友 xff08 以下称 39 发烧友 39 xff09 采访了韦东山老师 xff0c 本文是采访原稿 xff0c 展示出来让大家更深入了解韦老师的同时也进一步学习嵌入式Linux经验 机会总是留给有准备的人 发烧友 为什么要学习
  • matplotlib-animation--制作动画--制作各种图形-圆形矩形三角形

    目录 各个图形覆盖的问题 1 xff0c 画矩形并让其动起来 2 xff0c 画一个三角形 xff1a 动起来 xff01 3 xff0c 画一个三角形让其自动顺时针旋转 本教程基于前面的animation基础 xff0c 让各种图形动起来
  • 使用TS开发小程序中遇到的问题

    在使用ts开发小程序的过程中 xff0c 遇到了一些开发工具和关于ts的使用上的一些问题 xff0c 并记录解决方法 1 ts开发过程中类型指定问题 Type 39 number undefined 39 is not assignable
  • RecyclerView 使用总结以及常见问题解决方案

    1 RecycleView设置了数据不显示 本文主要讲一下我个人对于RecycleView的使用的一些思考以及一些常见的问题怎么解决 先来看一下使用RecycleView时常见的问题以及一些需求 这个往往是因为你没有设置LayoutMang
  • AidLearning中如何启动设置VNC和XFCE4

    第一步 xff1a 打开桌面的Service 第二步 xff1a 在Service Lists中选择中 Vncserver on port 5901 xff0c 点击启动 xff0c 点击保存 xff0c 保存服务后下次进入LECE4就会自
  • 自定义类加载器及其双亲委托机制

    自定义类加载器及其双亲委托机制 JAVA自带的类加载器自定义类加载器代码示例 双亲委托机制 JAVA自带的类加载器 JAVA的类加载器分为三种 xff0c 启动类加载器 系统类加载器 扩展类加载器以及系统类加载器 由前到后每一个都是下一个的

随机推荐