之前在外包公司,写了好几个项目,但都是写了就扔,都是一次性的项目,这次做的项目是公司的项目,基本上3周之内就要更新一个版本。这深深体会到,iOS项目虽小,若代码结构写得不好,当需求有变化的时候,特别是变了一次又一次的时候,维护起来真痛苦。这次花了一个月的时间,借项目大改之机,把之前的项目重新写了一遍,学到的东西挺多的。写个东西分享下经验,主要分享下项目结构和一些用到的第三方库,有些第三方库自己改写过,后面会标出。

本人刚入门,高手路过勿笑勿喷,请指点一二,感激不尽!

首先说下项目结构,本项目结构如下图:
说下结构,本项目基于Storyboard和ARC,对于Storyboard各有各的看法,有人持否定态度,可参见唐巧的博客,我是觉得挺好的所以就用了。Line0New为自己写的类,Lib为第三方类库。
我把第三方类库分类如图中所示管理,所有的View类放在Views里,工具类放在utils里。有人不喜欢用第三方类,我一般是先找第三方类库,拿来修改成自己需要的样子,有一个大牛说,最高效的编程方法就是先看有没有人实现,有人实现了就拿过来改成自己需要的样子,我深表赞同。这些第三方类库需要的可自己去github上下载,另外有几个自己改动比较大的库后面会上传到github上去,有需要的可自行下载使用。

下面推荐对几个比较好的开源类库
JASidePanels:这个是类似path效果的一个侧边栏式程序框架,类似这样的框架很多,我也下了有五六个吧,都看了下,总体感觉这个最好,功能基本上都有,但用起来又很简单。
MKNetworkKit:之前一直用ASIHttpRequest,但一直没更新了,后来看了这个的推荐,用了之后感觉真的很棒,用起来简单,功能强大。有个比较好的教程在这 http://huluwa.me/blog/ios-framework-introducing-mknetworkkit-mknetworkkit%E4%BB%8B%E7%BB%8D%EF%BC%8C%E5%85%A5%E9%97%A8%EF%BC%8C%E7%BF%BB%E8%AF%91/
FMDB:数据库,用起来不是一般的爽,我基本上不懂Sqlite,但用这个类库操作数据基本上无多少压力(现在的项目是一个购物程序,里面的数据存储都是用FMDB)。
AESCrypto:简单的加密,解密工具。项目中只用来传输密码的时候用。
Regular:自己收集的一些常用的正则验证。
Category:自己收集的一些常用类的分类。

ThLabel、FXLabel:UILabel的子类,实现一些文字效果,很不错。
MarqueeLabel:滚动Label,当一行文字显示不下时,滚动显示。很不错
EDStarRating:星级评分类。这个现在github上面也很多,下了好些,总体感觉这个最棒 。
PopoverView:类似ipad版的弹出视图,这个也下了好多,总体感觉这个最棒,简单。
iCarousel:这个太出名了,不解释。
AttriButedLabel:富文本Label,原来的是非ARC,而且用起来有点麻烦,自己做了修改,后面放到github上,有需要的下载
BBCyclingLabel:文字切换效果Label。
MessageStatusBar:在状态栏显示通知信息,这个网上也有好些,这个综合了网上的一些做了简化,用到了上面那个类。
CheckBox:复选框,原代码比较老了,修改了下的
LBBlurredImage:使图片模糊化的类
PullTableView:基于ego上下拉刷新改的,改动较大,简化调用方式,名字全部重新命名,加了注释。
QBFlatButton:纯代码式的自定义按钮,现在较流行,在友盟网站上就使用了。
RadioButton:这个类库貌似网上只有一份,难道没有人用到单选按钮么?原版的不支持ARC,而且有好多问题,自己基于那个重写的。
WaveAnimation:点击时有一个圈扩散的效果。

另外使用了友盟的社会化组件、统计跟反馈三个库。

未完待续。。。

今天继续写,第三方写完了,后面重点写一下程序里面的内容。。。

说下结构,我在创建项目之后,把所有的功能都分文件夹,而且在项目里建立对应的实体文件夹,看起来整洁,找文件也方便:
一、.AppDefine文件夹写了程序里的常用到的一些宏定义,分为6个.h文件:
1.Singleton.h:这个就是写了一个单例的模板,快速生成一个单例。
2.AppConfig.h:把程序的一些字典定义在里面,比如用到的第三方的Key,程序的字体、颜色,这些啥的,比如我程序里的Nav的title,我在这里定义了字体大小,颜色,如果要更改的时候,在这里更改一下,程序里所有的界面都改过来了,不用一个页面一个页面的去改。这个文件主要看自己程序是怎么定义的,一般把通用的设置写在这里。
3.InLineDefine:一些常用的内联函数定义,我用的内联函数很少。只是先定义好,后面可能有用。
4.MacroDefine.h:这个文件里定义的都是通用的宏定义,所有程序都通用,新建项目的时候,直接拖过去就可复用。我主要定义一些编译设置、一些方法简写。为了避免与其它的宏定义冲突,全部以小写m开头。
5.NetworkAPI.h:把所有的网络请求的接口全部定义在这里,统一管理,方便清晰。还定义了一些网络请求状态码
6.UmengConfig.h:友盟的配置文件。


二、AppEngine文件夹写了项目里比较核心的一些文件。这个项目用的是侧边栏式,所以里面主要的就是侧边栏的配置

三、LeftViewController、RightViewControllers文件夹对应的就是侧边栏的左、右相应的功能

四、NotificationCenter文件夹写了项目的活动、公告、应急这些处理的类

五、SupportingFiles里为原来默认的一些配置文件

六、Images为程序的资源文件,为方便查找,都是按功能块放入对应的文件夹里。


首先说下代码风格,个人写代码有点洁癖,喜欢大括号对齐、=号对齐,要看着不对齐就觉得难受。
另外个人觉得为了易阅读,一个类的代码尽量别超过350行, 方法不要超过35行。方法超过35行,在13寸Pro上面看着就不怎么完整了,类超过350行,对逻辑理解就有点不好理解了。写代码的时候也都一直按这个标准来执行。但现在这个项目里,还是有三个类超过了350行。一个是左侧的配置类,要配置的有点多,达到了500行; 另一个是购物类,要处理的数有点多,达到了440行; 还有一个是购物车类,汗,超过了700行,要处理的数据有点多,而且没办法分到其它类去,要生硬的分成两个类,又不完整了。 其它的还好,基本上保持在350行以内。

对于一些类,为了避免变量名过长,我使用了一些缩写,如ViewController用VC来代替,TextField用TF等等这些。

另外对每个类的接口,个人感觉如果不是一目了然的接口,尽量能写一些注释,还有变量名取得易懂一些,长一点没关系。对外部的变量声明在.h中,其它的声明在.m中,不至于影响阅读。

在项目里,我给每个ViewController写了一个Model,把所有的网格请求、数据都放在这个Model里,ViewController需要数据的时候,直接去Model里去取,要更改数据,也直接让Model更改。这样做,我觉得有两个好处:首先,减少ViewController的压力,降低它的复杂度。其它,从结构上也更清晰一些。这样后面需求变更的时候也更容易一些,不至于ViewController里一坨一坨的。

其次,在每个ViewController里,我尽量不用代码写View,能在SB里拖控件的的就拖了,不能拖的就用代码写一个子View,在ViewController里加载上来。这样也是为了结构化,避免viewController过于复杂。如下图的ShopDetailVC,每一个独立的块的View,我都分出来,这些子视图如果都放到VC里生成,代码会比较恐怖。

最后一点吧,把在很多类都要用到的类的头文件,都放到.pch里去,这样在整个项目中都不用再引头文件了。我把所有的到处要用的第三方库文件的头文件 、QuartzCore、分类文件都引入到里面。这样可以减少类里的头文件引用。
另外,我把写的所有分类都放到CategoryUtils.h这个头文件里,然后在.pch里引入这一个头文件,这样,在所有的地方都可以直接使用分类了。

暂时写完了,以后有想到的再补充。。。

进步就是在整理反思中得到的。。。大家共同进步。。。

我的github地址
https://github.com/makeLaugh?tab=repositories

[ 此帖被wsk在2013-06-13 13:50重新编辑 ]