拒绝纸上谈兵--萌新开发手册(踩坑分享之项目基类与第三方库抉择)

1.项目基类

毫不夸张的说,项目基类封装的质量决定你的开发速度,后期维护难易度。不过估计很多萌新并没有理解其中原因,那么我今天就来分析下,项目基类封装的质量有多重要。
  首先通常来讲,入了门的安卓萌新们应该都知道,项目中的activity和fragment必须要有统一的基类,也就是我们常说的BaseActivity和BaseFragment(连这个都没有概念的同学,恭喜你,连萌新都不算╮(╯▽╰)╭),那么为什么我们需要这两个基类?
  简单来说BaseActivity和BaseFragment有利于我们对整个项目中所有activity和fragment的统一管理,举个例子,界面跳转,应该没人不会写吧?通常我们会这么写(看过我另一篇文章的同学都知道,我是主用mvp模式进行开发的,不过这里的讲解,我尽量以mvc为例):

传送门:我的mvp框架
  为了减少叙述,下面同一以BaseActivity为例

   Intent intent = new Intent(this,LoginActivity.class);
   startActivity(intent);

有的同学可能就不懂了,这个和基类有什么关系?我相信做过几个项目的同学应该都挺烦这个代码的,为什么呢,因为这两行代码毫无营养,但是你每次跳转界面却又不得不写,因为标准写法就是这样啊,有一定封装经验的同学可能会想,这还不简单,封装个utils类呗,比如下面这样:

    ActivityUtils.goActivity(this,LoginActivity.class);
    //======================================================
      public static <S extends Activity> void goActivity(Activity activity, Class<S> cls ){
        Intent intent = new Intent(activity,cls);
        activity.startActivity(intent);
    }
  

这样写相比每次都要自己去new Intent来说,确实好很多,但是在我看来还是不够简洁,如果我们在基类中添加一个方法,然后就可以简单只传入我们所必须的参数也就是我们所需要跳转的类名,如下:

    goActivity(LoginActivity.class);
    //======================================================
      public  <S extends Activity> void goActivity( Class<S> cls ){
        Intent intent = new Intent(this,cls);
        startActivity(intent);
    }
  

这样,你会发现,我们传的参数真正做到了,只传我们觉得需要传的,不再需要重复的传入this了,也许你会觉得仅仅一个this而已,但是首先,跳转界面这个代码在项目里少说也会出现几十次,多传一个this,也就意味着你要多写几十次,其次,这里只是以跳转为例而已,还有更多复杂的场景。
  如果说上面这个简单的例子还不能让你直观的明白基类的意义,那么我们再来一个例子,这次就不贴代码了,我们以实际场景中的业务为例,话说你写好了一个项目,现在突然需要在每个activity的onCreate初始化时额外加载一个第三方sdk的初始化方法,这个需求是很常见的,如果没有基类也就意味着,你需要每个activiy都去复制粘贴,然而有了统一基类时,你只需要去BaseActivity中的onCreate中加上这行代码即可,这也就是开始说的,方便对activity进行统一管理了。明白这点之后,为什么基类会影响开发速度和后期维护难易度,相信你就应该能想到了。
  说了基类的重要性,再来简单说说该如何封装,当然,这里只介绍一些技巧,并不会为大家提供具体基类(如果确实需要例子的,请参考本人的mvp库),因为大家的项目千变万化,而且开发习惯各异,想要都使用一个统一封装基类是不太现实的,这也是为什么几乎没有人开源关于BaseActivity的封装框架,我们先来看一张图:

毫无疑问,BaseActivity就是我们项目的顶层封装基类,RefreshActivity和ListActivity从名字上就可以知道了,是基于顶层基类对特定功能的二次封装,而RefreshWebActivity则是基于RefreshActivity的二次封装,真正的界面是下面那几个。
  明显的,DetailActivity是一个带有刷新web功能的界面,MainActivity则是可以刷新的主页面,GoodsListActivity是一个带有列表的商品清单界面,LoginActivity是一个普通的界面,功能单一,直接继承自BaseActivity。这么设计的好处在哪里呢?像带有列表的界面,对于一般的项目而言,通常少则出现几次,多则十几次几十次,这时如果我们直接继承自BaseActivity就会造成,列表的逻辑重复写很多次。
  有人可能会提问,那直接把列表逻辑写在BaseActivity不就好了,何必再弄一个ListActivity?明确的说,这么设计并不好,如果遇到一点通用功能就往BaseActivity里写,可能等你的项目写完,你的基类也就几千行了,后面其他人来看,绝对想把你按在地上摩擦。这也是为什么你会发现哪怕官方的Activity都有什么FramgmentActivity,AppCompatActivity等之类的区分了,合理的分散功能比强行写在一起更容易让其他人使用。

封装技巧:
  • 不要过度依赖继承
      虽然上面已经建议了分散功能进行封装,但是,实践中并不建议基类层次超过三层的设计,结构过于复杂也会造成难于理解,不易维护。像上面的RefreshWebActivity已经是处于第三层封装了,所以不建议再继承他进行基类封装。不是过于复杂的功能,建议使用组合的方式来实现而不是仅仅通过继承,上面是以list功能为例,但是其实list的逻辑相对并不复杂,我们完全可以采用组合方式进行实现,这样,如果我们的DetailActivity如果也需要list,只需要进行组合就好。
  • 控制基类层级
      上面也说过了,尽量不要超出3层的基类封装,方便其他人协同开发和自己的日后维护。通常也不可能超过3层结构,如果你超出了,请确认下自己的架构设计。
  • 封装高频代码
      例如toast代码,本身很简单,也就一行的事,但是相对来说,它的使用频率算是比较高的,而且需要传的参数还是比较烦的,建议在基类封装出方法,这样以后想使用第三方toast库,也会很容易修改。
  • 封装复杂代码
      比如弹窗的代码,代码行数其实还是偏多的,并且通常来说,一个应用的弹窗样式还是比较统一的,没必要到处实例化,直接在基类进行,可以更方便修改。
  • 不添加冗余代码
      这里包括两点,一是,废弃的方法功能模块,及时清理掉,避免其他人使用时无意中引用到,造成以后清理时大面积报错,二是,不要添加某些小众功能逻辑到基类,比如某个特殊的业务逻辑功能,可能出现了3,5次的样子你就往基类里写,这样违背了面向对象的原则,并且以后你想直接复制这个基类到其他项目用又要删除这部分逻辑。

备注:上面主要是以activity为例,但是只要你拥有了基类的思想,不管是framgment还是adapter之类的,你都应该能举一反三了。

2.第三方库抉择

许多同学在使用第三方库的时候总是很纠结,不知道该用哪个,这里我简单介绍下我自己选择第三方库的一点点心得。

  • star数
      这点相信是大部分人都知道的一点,我们尽量避免使用github上只有个位数star的库,不是说个位数star的库都不好,而是对于萌新来说,别人的库怎么样,可能很难一眼看出来,这时候看star数就是最直观的了,至于那些优秀的个位数的star的库,还是交给老司机去发掘吧,大家就不要作死了。
  • 查看issues详情
      包括作者的解决效率,大家反馈的一些问题和bug
  • 更新频率
      留意下作者的更新频率,如果是一两年没有更新的库,自己用之前最好能看下源码,是否出了bug有把握能修复,当然建议还是使用更新频率较高的库(说明作者持续在关注)
  • 文档
      使用别人的库,文档真的很重要(遇到好多萌新都是不看文档,喜欢直接加群,去问别人,这种习惯真的要尽快改掉),不然遇到问题的话你可能只能联系作者或者自己默默去看源码了
  • 使用难易度
      有些库可能是针对一些老鸟进行封装的,所以使用起来会让萌新们感觉不适应,所以如果有替换的,可以考虑先放弃这个库,等以后水平上升了再换。

总结:不要只看star数,star数不代表一切,要知道某宝已经可以代刷star数了,遇到很多个star数差不多的库时,还是要综合上面几点多看看,自己评估一下用哪个

这次的分享就到此为止了,大家对我分享的东西有任何异议和问题的都欢迎提出。下次的分享暂内容还没想好,如果大家有什么想了解的,也可以在评论中提出,我会考虑下次分享一下,持续更新,欢迎大家关注

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,686评论 8 183
  • 雪恋上了花, 才来到了村落, 那里没有气候的剧变, 没有车轮的碾压, 可以在安静的等待, 厚厚的纯白, 化为一滩春...
    月亭阅读 404评论 15 14
  • 《放学后》真的是一本很好看的小说,小说迷题一换紧扣一环,在烧脑的同时,却又十分过瘾。然而在看完后又会忍不住静下来思...
    还是那个阿堇阅读 204评论 0 0
  • 背景 40岁,女,文员。《休息日》:周末晴朗的天,女孩在门口草地上跳舞,家里爸妈在煮饭。玩累了就在树下乘凉,休息。...
    艺凌老师阅读 369评论 1 3