开源框架那么些事

前言

标题原本叫 《KtArmor-MVVM 前传》,但是这样显得太过局限,所以我站着更高点来说(标题党),我承认我有赌的成分 :)

回归正题,这篇文章,我主要想要写给的对象是 想要开源,但是害怕,亦或者已经 ”开源的朋友“的开发者, 分享一些 我个人对 开发框架的 心得体会 和建议 ,希望大家喜欢~

尝试

自从知道全球 最大 ** 交友网站—— Github 后,看了一下大佬们写的框架,那叫个

  • 优雅

  • 简洁

  • 易用

  • 方便

  • 牛逼

    ....

再看看自己的代码,突然不香了。

面试时,被问到有 开源或参与 过框架开发吗,还在为此发愁?

看见别人写的代码那么好,那么实用,难道你不想自己徒手撸一个属于自己的吗?

喜欢哪种被人叫大佬(滑稽)的感觉吗?

如果满足以上一点, 还不赶紧动起来!

可能你会觉得自己菜,造不出轮子,但是好的框架,往往是经历长时间的迭代更新,才会有今天的框架,先迈出第一步,开发属于自己的框架,让 ”时间去优化“ 吧(持续迭代)。

选型

撸一款什么 类型 框架呢? 网络(OkHttp)图片加载(Glide)数据库(LitePal) 选哪一种呢?

醒醒!别做梦了,这种 "类型" 框架,新手还是别想到了(大佬除外),一上来挑个 硬柿子捏,似不似傻。

我们可以尝试从简单框架入手,如

  • 常用工具类库 (通用方法封装)

  • Android 简单 UI 框架(Loading,Dialog等)

  • 脚手架 (整合多种主流框架集合)

    ....

这些框架实现起来相对简单,先入个门,尝试一下。大概了解一下框架发布,更新,迭代的流程。

等熟悉了框架流程,技术到家了,在搞一波大的(大型框架),会更加得心应手。

取名

选型好了之后,我们可以为 自己框架取一个 有意思 的 名字,当然见名知意的框架名,是正常人的选择。如 SpringBoot-XXXOkHttp-XXX , Image-XXX.

但是我个人 建议,可以是 来福旺财 这种(滑稽),有 寓意 的,哈哈,这里是举例(切勿直接使用),当然 需要在 文档补充 说明一下 框架名称 由来。

这样会显得框架更有意思,有故事,有内味 :)

三部曲

在实际开发框架中,我们应该站在 “用户的角度” 思考 (这里 “用户” 是指 使用框架的开发者

用户怎样才能方便使用框架呢?

框架设计,我大致总结了如下 “三部曲” ,这里我们以 Glide 为例。

全局配置

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n53" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}</pre>

在这里,我们进行了全局添加有 @GlideModule 注解,继承自 AppGlideModule 的类。此类可生成出一个流式 API。方便后续使用的时候,可以直接链式调用,这就是全局配置的好处。

默认配置

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n56" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">Glide.with(fragment)
.load(myUrl)
.into(imageView);</pre>

短短几行代码,包含了 Glide框架 精华 所在,默认实现三层缓存机制, 内存缓存磁盘缓存网络缓存。图片解码,绑定生命周期等等默认实现(详细的可以参考 Glide 源码实现)。大大简化开发者编码实现。

自己用起来是不是很爽吗?一行代码实现这么丰富的功能,实在是

局部配置

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n60" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">// 局部配置
RequestOptions sharedOptions =
new RequestOptions()
.placeholder(placeholder)
.fitCenter();

Glide.with(fragment)
.load(myUrl)
.apply(sharedOptions)
.into(imageView1);</pre>

总会有一些特殊的需求,如大图加载,占位布局,错误图片等等定制化配置,这时候 局部配置 就派上用场了。

由此可见 Glide 框架,是多么强大啊!

我们自己在开发框架的时候,也可以尝试往这 三部曲 靠(学习的意思),这样子的框架,肯定深得人心,那么离 优秀框架 也就不远了。

文档

一份 简而全, 优而雅 的 使用说明文档:

  • 会大大加大使用者对该框架 好感度

  • 同时也帮助使用者更好 理解 框架,上手 框架。

注释

有了文档后,我们还需要养成 编写注释的习惯

  • 方便他人阅读源码时,能够读懂开发者的想法

  • 同时也方便自己 日后理解代码,规范代码

开源的魅力

在尝试开源后,并尝试推广 (chui)一波后,然后你就会:

  • 可以收到热情的小伙伴提的意见(Issues

  • 可以收到热情的小伙伴提的代码 “优化” (Pull Requests

  • 可以收到热情的小伙伴的认可 (star

有的朋友可能会说,我推广了没人用了怎么办? 我的答案是——持续迭代。

持续迭代

好的框架,总会有 “发光” 的一天。我们能做的是:

  • 修复已知 Bug

  • 丰富功能

  • 更新版本,寻找更好的实现方式

    ....

一款好的框架,往往需要持续迭代,而不是不了了之。

最后

以上是我个人开源框架后的心得体会,如有不妥,欢迎大家一起交流学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容