浅度学习模块化与解耦

2023-11-03

目录

1、为什么要模块化

2、模块设计原则

3、模块化开发的的优缺点

4、解耦与通信

4.1 公共模块的下层

4.2 面向接口调用

4.3 面向协议的调用


 

在开篇之前引用一句话:

一派是说app开发并不需要什么狗P架构,第二派说我们有自己NB的架构,第三派说只要模块化够好,每个模块应该有自己的架构。

 

Ricardo.M.Tan:

作为初学者,在这里借鉴他人经验与总结自己过往的编码历程,分享一些浅度的模块化设计与解耦经验,当然,现在的观念任然可能会被以后的观念所覆盖,因为我一直致力于更新自己。

 

 

1、为什么要模块化


 

  • 代码设计原则:“Don`t repeat yourself.” ,避免重复造轮子。
  • 每个程序设计都应当有自己的架构
  • 通常单独的代码应当拿出来,做成单独的模块,提高模块的复用性。

2、模块设计原则


  • 越底层的模块,应该越稳定,越抽象,越具有高度复用性。
  • 不要让稳定的模块依赖不稳定的模块,减少依赖。

例如:B模块依赖A模块,但是B稳定而A不稳定,这样B模块也会变得不稳定。

怎么办?最好不要依赖。但如果B确实必须依赖A怎么办?提出A中B依赖的代码块X,单独建一个模块。但如果X是一个方法或者函数怎么办?将X拷贝至B模块中,曾强B的稳定性和完备性。都不行怎么办?解耦。

  • 提升模块的复用度,自完备性优于代码复用性。

 自完备性指什么?就是尽可能的减少模块间的依赖,来提高代码的可复用性。

在平时的设计中,我们会依赖某些模块中的方法,例如Math函数中的各种方法,但是在设计更为基础的模块时,不适合再引用,这样会产生依赖。应当自己重新去实现这些方法。

  • 每个模块只做一件事,不要让Common出现 。

 模块结构的设计是为了让代码更具可读性,设计结构更清晰。每个模块只做一件事便于良性发展,如同一个人在一个团队中,分工明确最合适,因为这样精力最集中,运行与维护的效率更高。

当然,在一个设计中,一个模块的工作几乎穿插了整个设计,如同团队中的Leader,他们要胜任更多的事务。但这样的模块设计并不一定合适,假如假以时日,Leader处理能力越强,能担任的事务越多,那么将他放到那个部门最合适呢?这也说明如果某个模块实现的功能越多,日积月累,他就越“冗杂”,越庞大,那它相对于其他的模块来说会形成高度的被依赖,这样会产生耦合,不稳定。模块的复用性会变差。平时应当将某些功能的实现单独建块。

  • 按照自己的结构设计,从上到下,不要出现下层模块依赖上层模块的现象,或者尽可能的去避免。
  • 业务模块之间尽量不要耦合。

3、模块化开发的的优缺点


在这一类问题上,我可能知之甚少,毕竟做开发的时间还不及前辈已写的一篇文章的存在的时间长。

优点:

1、模块代码复用性

2、功能复用

3、业务逻辑隔离

4、符合封装性与合理性的要求

缺点:

1、门槛高

2、使得开发成本与效率成反比,毕竟团队中模块的开发与使用需要通过成员交流

无论怎么说,在整体上来看,后期的利大于弊。

4、解耦与通信


这里要叙述的东西实在过多,概念也较为复杂,尽量都说清楚。

为什么要解耦?

模块化并不只是将设计分块,分成多个代码块就行的,真正的模块化是实现模块之间真正的解耦,否则模块之间还是会互相调用,产生循环依赖。

模块解耦的目标是在基于模块设计的原则上,让模块之间没有循环依赖,让业务模块之间解除依赖。

4.1 公共模块的下层

 开发的过程中,不注意很容易发生处于较底层的模块依赖了上层的模块,这种情况下应该对模块的设计进行改造实现单向依赖。

4.2 面向接口调用

虽然说公共模块可以通过架构设计来避免耦合业务,但是业务模块之间还是会有耦合的啊,而且这种情况是最多的,比如页面跳转啊,数据传递啊,这些情况前面的方法已经不够用了。那如何解耦不同业务模块之间的代码调用呢?

那就是面向接口调用。

直接调用方法会产生依赖,例如:

// A 模块
(void)getSomeDataFromB {
       B.getSomeData();
}
// B 模块
(void)getSomeData {
       return self.data;
}

那么我们可以实现一个 getSomeDataFromB 的接口,让 A 只依赖这个接口,而 B 来实现这个接口,这样就实现了 A 与 B 的解耦。

// 接口
(void)getSomeData;


// A 模块, 只依赖接口
(void)getSomeDataFromB {
     int i=new B().getSomeData;
}


// B 模块,实现BService接口
(void)getSomeData {
     return self.data;
}

 这样就可以实现了即满足了模块之间调用,也实现了解耦。接口类似代码,可以非常灵活的定义函数和回调等。可是接口定义文件需要放在一个模块以供依赖,但是这个模块不会贡献代码,这点还好。麻烦的是每各调用都需要定义实现接口的方法,并实现, 对于一些具有普适性规律的场景不太合适。

4.3 面向协议的调用

面向接口调用的缺点导致并不能满足所有的需求,也解耦的不够彻底,可以通过定义一套协议来实现模块间的通信,协议可以是现成的,如URL跳转协议,这就是通信

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

浅度学习模块化与解耦 的相关文章

  • 开源P2P视频流媒体源代码研究

    1 Azureus http azureus sourceforge net 这是java版的betorrent 最新版本2 4 0 2 从网上直接下载的源代码是没法构建的 所用的库没有在包里面 可以到 http azureus cvs s
  • 手把手教你安装Eclipse最新版本的详细教程 (非常详细,非常实用)

    简介 首先声明此篇文章主要是针对测试菜鸟或者刚刚入门的小伙们或者童鞋们 大佬就没有必要往下看了 写这篇文章的由来是因为后边要用这个工具 但是由于某些原因有部分小伙伴和童鞋们可能不会安装此工具 为了方便小伙伴们和童鞋们的后续学习和不打击他们的
  • FastJSON、Jackson、Gson性能测试

    起因是公司原先用的是阿里开源的FastJSON 大家用的也比较顺手 但是在出现了两次严重的漏洞后 公司决定放弃FastJSON 使用其他序列化 反序列化工具 考虑大家常用的无非就是FastJSON Jackson和Gson这三种 因此领导让
  • 用Python让奇怪的想法变成现实,2023年继续创作

    2023年继续写作 用文章记录生活 时间过得真快 一下就到2023年了 由于疫情肆虐 在网络的游弋的实现也长了 写作的自然也多了 回想一下 2018 2021年这三年时间里一篇文章也没写过为0 哈哈 没错 为0 这段时间总是忙于自己的工作
  • 软件测试要学习的基础知识——黑盒测试

    黑盒测试概述 黑盒测试 也叫功能测试 通过测试来检测每个功能是否都能正常使用 在测试中 把程序看作是一个不能打开的黑盒子 在完全不考虑程序内部结构和内部特性的情况下 对程序接口进行测试 只检查程序功能是否按照需求规格说明书的规定正常使用 程
  • APP测试设计要点

    app的安装与升级 升级中用户数据 设置 状态的保留 特别注意新版本已去掉的状态或设置 是否可以隔开版本覆盖安装 是否可以覆盖安装更低版本 卸载安装 安装目录清理 SD卡存储数据不被清理 在没有更新或网络时 需要给予用户正确的信息表达 如果
  • 现在的00后,实在是太卷了......

    现在的小年轻真的卷得过分了 前段时间我们公司来了个00年的 工作没两年 跳槽到我们公司起薪18K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个人
  • 银行测试要求高吗?从业人员来为你解答!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 5k次 点赞69次 收藏10次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 还记得当初自己为什么选择计算机?

    还记得当初自己为什么选择计算机 当初你问我为什么选择计算机 我笑着回答 因为我梦想成为神奇的码农 我想像编织魔法一样编写程序 创造出炫酷的虚拟世界 谁知道 我刚入门的那天 电脑却故障了 我只能用巨大的打字机来编程 我感叹道 果然这个魔法圈子
  • 网络安全之等保 2.0 测评

    一 身份鉴别 a 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 1 登录 mysql 查看是否使用了口令和密码的组合鉴别身份 mysql h 192 168 100 16 u root p 2
  • 从一个程序员的角度看东方甄选“小作文”事件

    最近东方甄选 小作文 风波愈演愈烈 开始小编和观众吵架 后面东方小孙本来想要平息风波 而 摔手机 和泄漏董宇辉薪资待遇有激起更大的风波 导致东方甄选粉丝每天都几万 几十万的下降 作为一个消费者 开始是不太能理解东方甄选的这些骚操作 东方甄选
  • 石头纪 Stone Story RPG免安装中文版

    石头纪 Stone Story RPG 从众多优秀的游戏作品中汲取灵感 并且利用独特的ASCII艺术动画 结合放置挂机玩法 RPG 机制 可编程要素等诸多内容 打造出完全独特的游戏体验 在 石头纪 中 玩家无法直接操控游戏角色本身 AI会自
  • 抓包干什么用?

    抓包是一种网络分析工具 用于捕获和分析网络流量 它可以用于各种测试和调试场景 包括但不限于以下几个方面 1 网络故障排除 当网络出现问题时 抓包可以帮助你捕获和分析数据包 以确定问题的根本原因 你可以检查数据包的源和目标地址 协议 端口等信
  • 达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版

    DaVinci Resolve Studio 18是一款业界领先的视频后期制作软件 它集成了剪辑 调色 视觉特效 动态图形和音频后期制作等功能 为用户提供了完整的创作解决方案 该软件不仅适用于电影 电视和网页内容的制作 还广泛应用于广告 纪
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • MySQL忘记密码了怎么办

    MySQL忘记密码 今天在写jdbc时很悲催的发现自己的MySQL密码忘记了 没有办法了 重新设置一下密码吧 先关闭mysql服务mysql server stop 跳过权限检验 在使用该命令的时候要确保mysql服务是关闭的 不然是无法正
  • 外包干了2个月,技术退步明显了...

    先说一下自己的情况 大专生 19年通过校招进入湖南某软件公司 干了接近4年的功能测试 今年8月份 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋
  • [大厂实践] 零配置服务网格与按需集群发现

    本文介绍了Netflix通过扩展Envoy支持按需集群发现机制帮助团队无缝迁移服务网格的实践 原文 Zero Configuration Service Mesh with On Demand Cluster Discovery 在这篇文章
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 如何打赢稳定性之战?

    文章目录 前言 为什么总会出现问题呢 如何证明你的稳定性做的有效果 既是持久战 也是防御战 1 提前建筑好防御工事 2 以攻为守 3 找外部支援和配合 前言 随着23年年末期间 各大厂争先恐后的出现的各种线上

随机推荐

  • timedate如何查看当前时间并去除毫秒

    import datetime dt datetime datetime strptime str datetime datetime now replace microsecond 0 Y m d H M S datetime datet
  • 一个批量数据导入的实现方案

    数据导入作为系统常用的功能 几乎所有的系统都应该支持 主要用于系统初期 大批量初始化数据 或者需要输入的数据行比较多的情况 导入在建项目的交付清单 通常成百上千项 数据导入的一般过程是 用户按照模板格式Excel文件 然后程序读取这个文件
  • Ubuntu部署基于Fabric的虚拟区块链服务

    关于Hyperledger Fabric的部署适合在Ubuntu或其它Linux上进行 本例在Ubuntu16 04LTS上操作 如果是Windows MacOS系统 建议安装Virtual Box 在虚拟机上部署区块链环境 准备 1 源需
  • js宏任务和微任务有哪些?执行顺序是怎样的?

    宿主 浏览器 发起的任务我们可以称之为宏观任务 macrotask 引擎 js 自己也可以发起任务 这个任务就叫做微观任务 microtask 一 js宏任务和微任务分别有哪些 1 js宏任务有
  • java.sql.SQLException: There is no DataSource named ‘null‘

    报错信息 当配置dataSource后 即使配置文件中已经指定了JobStoreTX 实际还是使用LocalDataSourceJobStore 2023 07 10 11 15 51 636 WARN main org quartz im
  • Smali文件详解

    往期推荐 Java层逆向 Dalvik指令集 Java层逆向分析 Dalvik字节码 修改资源去广告 修改包名实现分身 篡改Apk名称 图标 Smali是Dalvik VM内部执行的核心代码 是Dalvik自己的语法规范 在反编译出的代码中
  • PyCharm 中选中一个变量/函数后,所有用到这个变量/函数的地方高亮显示,改配色方案

    由于 PyCharm 原来的配色方案里面 选中一个变量 函数后 所有用到这个变量 函数的地方高亮显示得实在太不明显了 有的时候阅读别人的代码 找得眼睛都要瞎了 所以要改成高亮 找了好久才找到 所以在博客里记录一下 希望对大家有帮助 当然也是
  • windows 获取已插入U盘

    static int GetUdisk vector
  • HDOJ 1052 Tian Ji -- The Horse Racing

    Tian Ji The Horse Racing Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 2
  • Java自定义注解参数ElementType.PARAMETER

    1 创建自定义参数注解 import org springframework core annotation AliasFor import java lang annotation Target ElementType PARAMETER
  • python对字符串使用min和max

    今天日常刷题 看到了一个最长公共前缀比较高级的解法 题目如下 在评论区看到一个比较聪明的解法 class solution def st strs if not strs return str1 min strs str2 max strs
  • nacos频繁挂

    背景 公司使用的nacos 频繁挂 查看日志发现 Java HotSpot TM 64 Bit Server VM 25 144 b01 for linux amd64 JRE 1 8 0 144 b01 built on Jul 21 2
  • word2vec词向量训练及中文文本相似度计算

    本文是讲述如何使用word2vec的基础教程 文章比较基础 希望对你有所帮助 官网C语言下载地址 http word2vec googlecode com svn trunk 官网Python下载地址 http radimrehurek c
  • matlab armax 预测,MATLAB中ARMA模型预测差分问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是我MATLAB预测风速的程序 程序不是我自己写的 我也是拿来参考自己的毕业作业的 每条程序旁的中文是我自己的理解 我也不知道对不对 程序1 X load C Users asus Deskt
  • 华为OD机试 - 计算礼品发放的最小分组数目(Java)

    题目描述 又到了一年的末尾 项目组让小明负责新年晚会的小礼品发放工作 为使得参加晚会的同事所获得的小礼品价值相对平衡 需要把小礼品根据价格进行分组 但每组最多只能包括两件小礼品 并且每个分组的价格总和不能超过一个价格上限 为了保证发放小礼品
  • vue 和 js 获取 dom节点下的某个元素,然后设置样式

    vue获取dom节点下的类名 然后修改样式 div div class a 提到岁月 你们总说它是长河 流得头也不回 div div class a 少不更事的年纪 我也用过老成口气 念过孔夫子的 逝者如斯乎 不舍昼夜 div div cl
  • 手写数字识别——算法

    识别方法一 基于结构模式 脱机识别 例子 基于基元和七段式数字的手写数字识别 日常生活中经常可以看到用七段式数字表示数字 如电子手表的数字显示等 它用火柴棍拼图的方式能够简单有效的表示出0 9 10个阿拉伯数字 例子 基于三次样条和整体特征
  • css img自适应盒子尺寸

    首先保证图片可以填满 然后纵向居中 img cantainer position relative width 260px height 150px overflow hidden img position absolute top 50
  • 最详细的Java入门完整教程,学Java先收藏了!

    从 1995 年第一个版本发布到现在 Java 语言已经在跌宕起伏中走过了 26 年 最新的 Java 版本也已经迭代到 Java 16 java是有一个庞大的生态系统 它的覆盖范围非常广 而且已经连续十几年位居开发语言的榜首 所以java
  • 浅度学习模块化与解耦

    目录 1 为什么要模块化 2 模块设计原则 3 模块化开发的的优缺点 4 解耦与通信 4 1 公共模块的下层 4 2 面向接口调用 4 3 面向协议的调用 在开篇之前引用一句话 一派是说app开发并不需要什么狗P架构 第二派说我们有自己NB