接下来要说的一个系列,是一个完整的App应用所需要的企业级框架设计,是我这2年来在无线客户端这个领域摸爬滚打的,总结沉淀的心得体会,中途吃了很多亏,走过很多弯路,加了很多班,一次又一次的重构,不断的学习,才知道,哦,原来iOS要这么做,原来Android要那么做,然后回过头来再看看我最熟悉的WP,哦,原来WP还可以做的更好。
2年间,我还接手了MobileAPI的维护,从而让客户端和服务器端的配合更顺畅,中途还发明了几个好用的工具,从服务器端到客户端这条路我打通了。再然后,我还碰了碰tcp+protobuf,WP8的项目就是基于此开发的。
此外,我还打通了另一条路,那就是前端设计人员和客户端开发人员的协作,为此,专门设计了iOS UI框架和WP UI框架,前端设计人员在拿到美工的设计稿后,不再提供标注图,而是基于UI 框架,直接提供xib或者xaml,客户端开发人员可以直接拿去使用。对于Android,暂时我还没有太好的解决方案。
也许有从事iOS开发的朋友会问,为什么要设计企业级框架呢?没有它,我也可以很好的写程序啊。也可以快速开发一个App啊。至少,我手下的iOS team都是这么认为的。而Android team和WP team能比较容易接受这样的框架。
说说我的想法,一家之言。我想是因为Android是基于Java的,经过这么多年的沉淀,Java对设计模式、代码规范这些概念已经有了积累。而且Android在设计的时候,就考虑到这些东西,所以它会有Activity、Intent、Adapter这些“积木”,搭建起一个完整的App。而微软出品的WP,是基于.NET framework体系的,而.NET本身就充斥着设计模式的思想。
对了,也许你得到那个点了——iOS在这方面显得有些贫血。除了MVC和delegate和Notification,其它什么都没有。所以,你可以在一个ViewController里面写3000行代码,而没有任何规定说你这样做是错的;不使用xib而在viewDidLoad中手动创建页面所有控件,当然,我问过很多到我这里面试的人,他们以及他们的公司都认为这样做没什么不好,甚至更灵活。大部分的iOS程序员,都已经习惯于面向过程的编程方式,而抵触OOP。
我也见过一些到我这里来面试的Leader,他们来自大公司,这些公司都有一些框架设计,或者说,业界规范,比如说,数据缓存,图片缓存、网络请求的封装。
其实,越是什么都没有,才越好做框架。我们可以借鉴Android和WP的设计,甚至是网站开发、javascript开发、windows开发的经验和模式,补充到iOS的框架中去。
2年来,我就在坚持不懈地做这件事,基本上可以认为是做成了,由iOS、Android、WP三套框架组成,它们的设计思想是一样的,包括以下18点,其中最重要的是前六点,称之为框架设计的六大要素。
框架设计六大要素:
1.基类的设计
没有基类,就不要说有框架。而且不仅仅是一个基类,对于一个企业级的App而言,框架层要有一个基类,里面只存放一些与框架有关的共用逻辑。App层也要有一个二级基类,继承自框架级的那个基类,里面存放的是App相关的共用逻辑。
2.自定义App的生命周期。
对于一个页面从初始化到消亡,每个客户端系统各自有自己的生命周期。我们发现,在初始化的时候,要做过多的事情,代码会很多很乱,因此有必要细分,重新规划,定义新的生命周期。
3.发起网络请求(以下简称MobileAPI)获得数据。很多书都在大讲特讲手机控件的使用、IO语法、酷炫动画。却对MobileAPI的介绍语焉不详。其实这才是最重要的一个环节,包括请求失败后的自动重试、如何处理JSON、如何统一API的调用形式并使之最简,对于多个API调用,是串行调用还是并发调用及各自的处理方式。
此外,我们经常面对的是HTTP+JSON形式的网络请求,对于转换为TCP+protobuf形式,则需要做的事情还有很多。
无论是HTTP+JSON,还是TCP+protobuf,都要考虑数据缓存,并且要让上层使用者感受不到数据是来自网络请求还是缓存。
4.图片缓存
服务器端,有2种解决方案。
客户端的解决方案,iOS、Android、WP实现思想相同,只是实现手法不太一样。
5.导航器(仅适用于iOS和WP)
跳转到一个页面很简单,但是要整个App都采用一种调整风格,要求iOS、Android、WP都采用一种风格,就不大容易了,尤其是传递参数,以及处理登录后的回调。
6.适配器
Android在这一方面做的是最好的。对于iOS和WP,我们不妨学习一下Android,设计出各自的自动适配器。
接下来就是一些细节了:
7.登录
别看一个小小的登录框,里面的学问可大了。比如说,记住密码要怎么实现,才能保证用户下次打开App不需要登陆。比如Cookie的读写。比如登录后要去往哪里?比如重复输入3次错误后要求输入验证码的实现?比如最安全的登陆解决方案设计。
8.与JS的互操作
你可能会第一时间想到PhoneGap。但其实,对于一个原生的App框架,只要支持简单的JS交互就够了。
9.时间校准
如何让客户端时间与服务器时间保持一致,这对于电子商务至关重要。
10.广告处理器
广告是目前App最赚钱的一个功能。如何设计一个通用的广告机制,而且要脱离App整体的业务逻辑,实现松耦合,至关重要。
11.弹出框链
这是职责链模式在App中的典型应用。
12.进度条
进度条经常和网络请求联系在一起,分两种,一种是调用MobileAPI时,锁住当前页面不能动,知道请求返回结果;另一种是锁住局部页面,页面其他地方可以操作。
13.日志工具
对于那些很难复现的bug,日志工具所记下的内容,能告诉我们一切。日志分两种,调试时直接打在控制台上;直接写入到在手机中。
14.单元测试
本文告诉你App上的单元测试要怎么写?以及什么时候需要单元测试。
15.MVC还是MVVM
iOS和Android使用MVC,WP使用MVVM,本文告诉你,使用哪一种,不是绝对的,一切根据业务逻辑的复杂程度而定。以此来消除一个页面3000行代码的问题。
16.分页
上拉分页,下拉刷新。3个平台的分页各有不同,需要注意的细节都不能少,比如说,没有数据时怎么办?
17.低流量模式
在2G网络下,网速贼慢,因此,我们要设计一种能认用户快速看到内容的机制。这就是低流量模式。其实,这是App的一种需求,只是很多App并没有考虑过。
18.UI框架设计
在分工越来越细的今天,我们可以把一部分工作分出去给其它Team。比如UI设计,完全可以让前端人员(熟悉js和html)来做,这就需要我们为前端Team提供一个好用的App UI的设计工具。这样,我们能拿到的就不再是设计稿或者标注图,而是画好的xib、xaml以及Android的xml布局文件。