仔细想了下模块划分,其实也不简单-量化

2023-11-14

在这里插入图片描述
我们今天聊一聊研发的依赖问题。

一个App就是一堆git仓库+一堆逻辑的组合,就构成了完整的业务逻辑。

衡量模块划分的标准其实就是 “沟通量”

换个词语:职责划分、代码边界。


常用的划分是功能划分

通过引入各种仓库,给我们的研发带来了边界

api 'jp.wasabeef:glide-transformations:4.0.1'
api "com.github.bumptech.glide:glide:${glide_version}"
//黄油刀
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterknifeVersion"
api "com.jakewharton:butterknife:$rootProject.butterknifeVersion"

第三方库会明确的程序提供了什么功能,有个主入口。尽量将逻辑都包裹在内部。其主要的设计理念:职责明确出来。
通过编写一堆的interface来定义代码的能力。

这也引出了我们沟通的第一个问题:数据依赖
为了规矩数据依赖,接口定义需要充分考量。
如何定义接口定义是否合理?入参有哪些?


核心

  • 减少团队沟通频率,提升沟通质量

涉及到3个指标

  • 指标1:参数的必要性与和合理性
  • 指标2:接口变动频率
  • 指标3:接口的重合度

指标1:参数的必要性与合理性

fun navigate(name:String?, classId:Int, studentId:Int) {}

单从这里看,无法区分参数的必要性。
必要,即调用方都会使用到的。

若超过一定比例的调用方都传递这个参数,可以判定为有必要的。
比例的数值可以是90%

那剩下的10%,就属于小众场景。
我们就有必要考量下,是否这个参数可以通过其他方式取代。

每一个额外参数都会增加 使用者的 负担,这必然带来额外的学习和维护成本。


指标2:接口变动频率

MVP、MVVM这两种模式,就是典型的案例。若活动页面经常变化,用我们可以用MVVM,其优势在于改变UI不需要调整逻辑。换言之,就是interface没有变化。那么,页面变化,就不会增加很多的沟通成本。不需要跟其他端的同事对接。

我们应该尽量的减少接口的改动,而只是调整实现,这样才能减少跨端、跨库的沟通成本。
在这里插入图片描述
无论英雄技能怎么变,接口不变,其实也就只是增加个技能。这仍然是理想的情况。
研发人员之间,应尽量减少沟通次数,提升沟通质量。

更多的,是要关注业务逻辑是否分割的恰当?业务边界是否清晰?

不断的审查我们的拆分决策。适时地调整。以匹配我们的业务形态。

注意:业务是不能预测的,是有破坏性的。作为研发人员只能是去做适配。

接口变动/接口实现,其值越小,说明interface定义就越合理

实际开发中,将git提交commit次数作为一次变更。
git的提交次数越少,自然是越好的。频繁的变更会带来文件变化的波动。

业务逻辑的拆分粒度以 当前团队的 可支持的并发数 作为依据。
一个端有 10个人研发 跟一个端 仅2个人研发,其粒度差异是相当大的。

设计原则:SOLID中提及的 Single Responsibility Principle(单一职责原则),我们要把注意力放在静态的结构上。

interface的实现类,经历了多次变更,但interface类却并未变化?
这个接口的稳定性就非常好。
在这里插入图片描述


指标3:接口的重合度。是否过度设计?过度抽象?

首先,我们意识到一个问题:是否所有一样的功能,就要抽象出来做封装?
然后,所有调用的地方必须要使用这个功能。

这仅仅是为了保证 实现的一致性。

这种组合关系,能否通过,累加几个功能 实现呢?
这就是做加法还是做乘法的选择?

我们的出发点是 需求的内在统一,然后将实现整理成一份。

这里有严格先后顺序,先有需求的统一,再有功能的统一。
在这里插入图片描述
先有道,而后法,再尔术,放有器。
需求的内在统一,即是道;


是否无能为力?

我们还是会开技术研讨会,讨论新App的技术架构
在这里插入图片描述
这也并非是无效的。
我留意一下。
一般,会议最后,领导总是大腿一拍,我们选择了XXX,又舍弃了XXX。
我们对 取舍 达成共识的;

领导又说:后面,有变化了再说。
我们对 保持迭代更新 达成了共识。

完美~~~~~~


小结

我们很难定义如何拆分模块?无法做提前预测,有没办法一次到位。
这意味着,要坚持 日常反思。
我们是否有拆分不合理的地方?在哪些方面不合理?是否有更加的恰当方案?并记录在日志上,得空就看看,在业务迭代周期中,排上议程。

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

仔细想了下模块划分,其实也不简单-量化 的相关文章

  • 基于springBoot动态配置定时任务

    场景描述 在生产环境中 有时要临时调整定时任务时间 或者禁用 启用定时任务 以前都是修改cron表达式后重启项目 总是感觉这个操作有点麻烦 不够方便 于是 想实现一个动态的配置处理 功能实现 1 代码结构 2 代码实现 2 1 创建定时任务
  • 工程代码模板注释及C规范

    工程代码模板注释规范 效果 使用方法以IAR为例 C代码规范 工程注释模板 C文件模板 h文件模板 函数注释 函数或变量命名方式 文件编码 对齐方式 优化 防御性编程 完成 Doxygen全套工具下载 效果 chm文件 网页效果 使用方法以
  • service调用规范

    每个service中最好只注入该service对应的dao 若需要用到其他service的dao方法 则注入其他的service 而非直接注入其他service对应的dao
  • 基于elementUi,下拉分页组件封装

    文章目录 一 说明 二 组件封装 1 组件 PaginationSelect vue 代码 2 属性 3 事件 方法 三 组件引入 使用 注意 一 说明 虽然elementUi提供了丰富的组件 但是有些业务场景下 需要自己再封装适合自己的业
  • 编程(代码、软件)规范(适用嵌入式、单片机、上位机等)

    目录 前言 第1章 文件 1 1 头文件 1 2 定义文件 第2章 注释规范 2 1 共性注释规范 2 2 文档注释规范 2 3 C语言风格注释规范 第3章 排版规范 3 1 缩进与对齐 风格 3 2 空行 3 3 代码行 3 4 代码行内
  • 规范:前端代码开发规范

    一 前端静态代码检查工具 1 1 ESLint ESLint 是一个插件化的 JavaScript 代码检查工具 可以使用规则插件或者自定义规则对代码进行静态检查 1 2 JSLint JSLint 是由 Douglas Crockford
  • RK平台images打包细则

    IMGs打包细节 平台 RK3288 背景 RK3288编译产生了RK3288MiniLoaderAll V2 19 bin uboot img kernel img uboot img misc img recovery img reso
  • 最简单替换jar包class文件

    jar包右击 打开方式 360压缩 找到需要替换的地址 直接拖进去替换即可 方便快捷
  • Could not acquire change log lock. Currently locked by XXX

    Could not acquire change log lock Currently locked by XXX 在项目执行liquibase时 发现超过5分钟依然执行不完成 最后报错显示被被锁了 于是找公司的网络 结果被告知该ip不是公
  • 3个权威免费资源下载网站!

    hello大家好 这里是预计今天可以到家的老Y工作室 因为这几天在出差 也没花太多时间帮大家搜罗一些好玩有趣的网站 等回家后 会把补一些软件和教程 有朋友之前问老Y有没有免费的标准下载网站或者查询 于是老Y找了3个给有需要的朋友分享一下 0
  • C++中对ODBC的API详解和使用

    本文构成 定义 API 实例 实例在最下面 一 ODBC 1 定义 即开放数据库连接 Open Database Connectivity ODBC 是数据库API的规范 该API独立于任何一个DBMS或操作系统 是为解决异构数据库间的数据
  • AngularJS之组件化篇

    AngularJS组件化 将页面中可以重复使用的标签封装成一个组件 方便这一部分UI重复使用 类似于JS中的函数 封装了一部分处理代码 通过函数调用就可以重复使用这些代码 组件可以用 component 注册 在 angular modul
  • Long、Integer、Byte, Double, Float或 Short类型的比较

    开发遇到的一些基础问题 记录一下 场景 比较Long类型的大小 错误用法 或者 正确用法 Long compareTo 解释 Long是一个引用类型 不能通过 进行比较大小 基本数据类型才可以 对于Long Integer Byte Dou
  • Web Components 系列(八)—— 自定义组件的样式设置

    前言 通过前面的学习 对自定义组件的相关概念和知识点也有了一定了解 今天我们就来学习一下给自定义元素及其子元素设置样式的几种方法 直接给自定义标签添加样式 index html
  • 手写Vue个人组件库———fl-Cascader

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 接上文 封装了个人Vue组件库的Cascader级联选择器 源码附在了文章末尾 如下是文档使用说明 Cascader 级联选择器 当一个数据集合有清晰的层级结构
  • 【工作记录】MQTT介绍、安装部署及springboot集成@20230912

    背景 近期公司可能会有物联网设备相关项目内容 提前对用到的mqtt协议做预研和初步使用 最初接触到mqtt协议应该是早些年的即时通讯吧 现在已经是物联网设备最热门的协议了 作为记录 也希望能帮助到需要的朋友 MQTT介绍 MQTT 协议规范
  • 深入浅出UML类图

    在UML 2 0的13种图形中 类图是使用频率最高的UML图之一 Martin Fowler在其著作 UML Distilled A Brief Guide to the Standard Object Modeling Language
  • vue Antd单独隐藏Modal.confirm(this.$confirm方式)对话框的默认ok或cancel按钮

    有时候我们需要单独隐藏Modal对话框的默认确定或取消按钮 设置 footer null 会把两个按钮都隐藏 Antd有提供两个参数用于单独修改确定 取消按钮 对于确定按钮 设置 ok button props style display
  • mybatis的分批次插入

    最近在写mybati的分批插入 一直报错 一直在纠结自己的循环插入是不是有问题 但是数据量少的时候可以正常插入 但是插入数据量大的时候就会报错 后来查询是mysql限制插入的sqlMysql 对语句的长度有限制 默认是 4M Mybatis
  • Use gitk to understand git

    https lostechies com joshuaflanagan 2010 09 03 use gitk to understand git

随机推荐

  • 离散数学——成真赋值与成假赋值

    今天复习离散数学的时候饱受一个问题的困扰 为什么主析取范式和主合取范式的小项和大项采用不一样的赋值方式 查阅一些资料后得出答案 在这里分享给大家 首先给大家明确一下赋值 成真赋值 成假赋值的概念 对于一个命题公式P中的所有命题变项指定一组真
  • 魅蓝note6救砖_魅蓝NOte6获取完美root 框架教程步骤+救砖完整线刷固件

    魅蓝note6真正可以root的版本是Flyme6 1 4 6A 而官网已经下架了这个版本的ROM包 需要下载的朋友可私信发我 1 通过官方REC 版本降级为Flyme6 1 4 6A 然后打开魅族手机自带的root 打开它的原因 便是给第
  • 【统计学】分类数据分析 相关分析 方差分析 比较 研究思路 spss

    分类数据分析是针对类别型变量之间是否有影响进行的分析 而相关分析是类别型变量之间有影响的前提下 研究变量间相关的程度 以及正相关还是负相关 方差分析稍有不同 是研究分类型变量对数值型变量的影响 而不是类别型变量之间的关系 上统计学课的时候这
  • ubuntu pycharm卡住的解决办法

    pycharm界面卡住 无法关闭也无法执行任何操作 解决办法 1 终端输入 ps ef命令 获得所有进程信息 2 找到pycharm进程对应的PID号 第二列即为PID 3 输入kill s 9 PID号 如kill s 9 2136将会结
  • go实战学习——context包学习理解笔记

    context包学习理解笔记 context包 context接口 context实例 valueCtx 控制 cancelCtx 核心cancel方法 timerCtx context包使用注意事项 学习golang时 在看一下项目的源码
  • vsce报错The Personal Access Token verification has failed.,vsce login登录时同报此错的解决办法

    本篇文章主要讲解vscode插件开发提交插件版本时出现的token报错问题的解决办法 日期 2023年6月15日 作者 任聪聪 报错现象 1 vsce login 用户id报错如下 具体报错内容 The Personal Access To
  • mysql 与sybase小知识

    MySQL与Sybase不同点 MySQL没有if exists Sybase有if exists MySQL中无select into语句 sybase中可用select into MySQL查询其他表数据并插入到新表 create ta
  • 11.Vuex学习

    Vuex学习 一 Vuex是什么 为什么要用它 1 vue中各个组件之间传值 2 Vuex 3 vuex使用步骤 二 Vuex异步加载 一 Vuex是什么 为什么要用它 1 vue中各个组件之间传值 1 父子组件 父组件 gt 子组件 通过
  • # 经典目标检测识别方法概述RCNN/FAST/FASTER RCNN/MASK RCNN/SSD/DSSD/YOLO V1/YOLO V2等

    经典目标检测识别方法概述 陈子逸 经典目标检测识别方法概述 由于水硕期间自学了一些目标探测的方法 这里做一个概述 肯定有不完美的地方 还请指正一起进步 综述 1 分别简单描述一下RCNN系列 在我看来 RCNN 是一个benchmark 首
  • 基于element-ui Table 进行二次封装

    基于 ElTable 组件进行二次封装 创建 BaseTable vue 文件
  • C++ 继承(1): 继承方式(public, protected, private)

    C 继承 1 继承方式 public protected private 继承中的特殊关系 隐藏 is a 在水一方xym的博客 CSDN博客 C 远征之继承篇 视频教程 笔记 方便自己查阅和复习 温故而知新 目录 1 c 继承简介 代码示
  • 2021年蓝桥杯赛题【Python】

    填空 1 卡片 小蓝有很多数字卡片 每张卡片上都是数字 0 到 9 小蓝准备用这些卡片来拼一些数 他想从 1 开始拼出正整数 每拼一个 就保存起来 卡片就不能用来拼其它数了 小蓝想知道自己能从 1 拼到多少 例如 当小蓝有 30 张卡片 其
  • 中国历代王朝大排名

    中国自秦以降 一共出过九个大王朝 它们是 秦 汉 晋 隋 唐 宋 元 明 清 另外 还出过五十几个小王朝 它们是 三国时的魏 蜀 吴 共三个 转自铁血社区 http bbs tiexue net 十六国时的东晋 前赵 北凉 夏 后赵 鲜卑
  • JVM参数介绍

    一 JVM参数分类 根据jvm参数开头可以区分参数类型 共三类 X XX 标准参数 所有的JVM实现都必须实现这些参数的功能 而且向后兼容 例子 verbose class verbose gc verbose jni 非标准参数 X 默认
  • python输出百分数

    方式1 直接使用参数格式化 2 2 之作用 显示小数点后2位 例如 1 显示两位小数 gt gt gt print percent 2 format 40 50 percent 83 35 2 不显示小数 0 即 将2改为0 gt gt g
  • 教你如何使用接口根据关键词取视频列表

    请求参数 请求参数 q 耳机 page 1 sort 参数说明 q 关键词 page 页数 sort 排序 sort new 最新发布 sort credit 最多点赞 sort bid 综合排序 API接口工具 page 1 real t
  • Linux的常用命令

    Linux的常用命令 一 系统信息 1 who或w 查看所有终端 2 uname m 显示及其的处理器架构 3 uname r 显示正在使用内核版本 4 date 显示系统日期 5 cal 2019 显示2019年的日历表 6 clear
  • Windows10安装ubuntu18.04双系统教程

    写在前面 本教程为windows10安装ubuntu18 04 64位 双系统教程 是我多次安装双系统的经验总结 安装方法同样适用于ubuntu16 04 64位 为了直观和易于理解 我会尽量图文并茂 并用最通俗的语言完成这篇教程 虽然安装
  • 【最优PID 整定】PID性能指标(ISE,IAE,ITSE和ITAE)优化、稳定性裕量(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 PID控制器是工业系统中使用最广泛的控制器
  • 仔细想了下模块划分,其实也不简单-量化

    我们今天聊一聊研发的依赖问题 一个App就是一堆git仓库 一堆逻辑的组合 就构成了完整的业务逻辑 衡量模块划分的标准其实就是 沟通量 换个词语 职责划分 代码边界 常用的划分是功能划分 通过引入各种仓库 给我们的研发带来了边界 api j