您的位置  > 互联网

老夫带你撸个框架,进可重振雄风,退可养精蓄锐

时间从来没有等过我们。 时间是一把刺在你脸上的刀。 它让你充满沧桑。 你一定很担心你的工作。 我不知道你现在在哪里,是否有你爱的人照顾你。 活得幸福还是活得委屈?

哦,我忘了。 你是一个有故事的人,“你想让她过得比你好,我希望你永远不会知道。”

年轻的时候不要惊慌,我来帮你布置一个框架。 进则可以重振雄风,退则可以养精蓄锐!

这篇文章适合什么样的人?

从这篇文章中你能得到什么?

前言

本文是在反复挖掘、总结、分享的基础上摘录自在线APP。 但由于商业原因,无法透露。 因此,任何与业务相关的用例都不会被提及。 并且不会包含任何商业项目的提及。 所有技术仅供技术学习交流。 本文不会是一篇纯粹的代码解释文章。 文中的故事也是虚构的。 具体技术实现请逐步参考,地址在文末。 特此声明。

致谢

感谢、、、几位前辈的无私分享。

踩到陷阱

什么? 要求一个月后上线? 我只是一个摆渡车。 只需复制并粘贴并将它们拼凑在一起即可。

上线一周后。 小王. 和老板讨论完产品后,我们下一步就是把首页的XX改掉。 后面主要流程就不再这样了。 你接下来要做什么……?

他妈的! 你们之前为什么没有考虑一下呢? 如何改变这一点。 代码是一团糟。 稍有动静,就有可能导致它到处倒塌。

项目中的代码如下:

请问劳资双方如何改变? 是你说一个月内上线的。 以前只有上帝和我能看懂这个项目的代码。 现在只有上帝了。

分析

想想就让人恼火。 这都是你们加班一个月才想出来的。 上线不到一周就需要更改。 现在我头大了。 没有考虑到将来可能会进行维护或扩建。 改变? 你还不想杀我。 但也没有更好的办法了。 我不得不默默地处理代码。

第二天,一个看起来像Dalao的人走进了项目。 大老看完会心一笑,小王。 这个时候,我们宁愿重建,也不愿在原来的基础上改变。 我们可以拯救今天,但不能拯救明天。 就这样,我向上级请求延长一些时间,我们一起重新设计了结构。

以前的项目结构:

Dalao的项目结构:

完成

等一下,大佬。 如果你只给我一张图片,我无法理解。 并且还没有解释清楚如何实现分离。

dalao咳嗽一声,嘀咕道:首先,我们的总体思路是,让我们现在开发的app依赖于

,我们尽量精简,只需要依赖即可。

{ 'xxx.xxx.xxx:' }

作为一个通用的依赖库,它有三个独角兽臂,分别是,,。

是一个基于MVP+的基础框架。 秉承了MVP的设计风格。 我们上层APP只需要继承它、、、就可以了。 上层所要做的就是将特有的服务填写到相应的层中。 下图5是基础。 APP中的业务单元如图6所示。 具体用法请参考,地址在本文末尾。

它是一个通用的工具箱集,可以解耦上层所依赖的第三方框架。 这句话怎么理解呢? 如果我们要加载图片,你肯定不会自己在图片加载框架中重新发明轮子。 当没有层时。 项目1.0依赖的是2.0的时候发现这个库有bug,需要更换为主流的glide框架。 但是因为项目中很多地方都用到了API。 加载图片不可能只改一行代码,所有业务都需要使用新的加载工具。 此时的威力可想而知。 ,中间做解耦,调用上层。 调用第三方依赖。 当然这只是一个例子。 可以进行二次包装的地方有很多。 比如我们封装网络请求、视图动画等,下面是图片加载的二次封装实现代码。

//使用统一约束Api

{

无效初始化();

无效(,网址,);

void ( , int resId , );

空白 ( , , );

void ( , 文件文件 , );

空白 ( );

空白 ( );

班级 {

最终整数=-1;

int = ;//正在加载的资源id

int = ;//加载失败的资源id

() {

新的 (。, 。);

(整数,整数){

这。 = ;

这。 = ;

//具体实现

班级 {

@

无效初始化(){

@

无效(,网址,){

加载((.()).load(url), , );

@

void ( , int resId , ) {

加载((.()).load(resId),,);

@

空白 ( , , ) {

load((.()).load("文件:////" + ), , );

@

void ( , 文件 文件 , ) {

加载((.()).加载(文件), , );

@

空白 ( ) {

Glide.get().();

@

空白 ( ) {

Glide.get().();

( ) {

Glide.with();

无效负载(,,,){

if (== null) = .();

如果(。!=。){

.(.);

如果(。!=。){

。错误(。);

。()。进入();

//暴露给上层进行加载

班级 {

;

() {

如果(==空){

(。班级) {

如果(==空){

=新的();

;

它是自定义视图的依赖项。 所有不包含业务类型的视图都应放置在此处。

应用程序

APP是上层项目。 注意,除了传递依赖之外,还可以有自己独立的依赖,所以我们这里可以在APP中添加业务类型依赖。 比如:后端SDK、友盟统计、微博分享等,只在本项目中出现的应该放在这里。

我们再看一下架构图,看看是不是清晰多了。

比较的:

亦硕项目结构:

优势:

缺点:

建筑学:

优势:

缺点:

总结

该项目的建筑设计绝不是一成不变的套路。 应根据业务类型将其拆解为模块。 而且其实我个人认为很多时候在开发一个项目的第一个版本的时候,甚至会考虑搭建一个框架来编写它。 但由于进度、协作等因素,理想状态可能会有所不同。 一旦在线稳定,您应该考虑重组您的项目。 我见过一个同事,他的编码风格是一边写业务一边重构之前的代码。 将带领同仁与您共同发展。 读完之后我很困惑。 每次都再读一遍。 这不是一个好主意。 最好在与团队成员达成共识后开始该流程。

本来我不想发表这篇文章,担心我的知识匮乏会误导新人。 再加上工作上的变化,最近事情有些仓促。 希望各位读者多多留言。 如果觉得有用,就点个赞吧,这是对我最大的鼓励。

这个框架的最终地址是:

感谢脆皮鸡排同学提交文章,地址:

本文同步仓库。 如果对您的发展有帮助,欢迎您给作者star并分享给您的朋友。 编辑每天都在努力整理干货信息。 为了支持编辑,请在下面给予 +1 鼓励。 需要投稿的朋友有疑问可以在下方留言,编辑会尽快与您联系!