iOS 项目架构与代码规范

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_19678579/article/details/77751853

*非原创, copy自多位大神力作

iOS 项目架构与代码规范

一. 项目架构:

架构原则:易读性、易维护性、易扩展性。

enter image description here

1.应用入口

AppDelegate是应用的代理,应用级的事件都委托它处理,包含启动退出、推送等事件,以及IM、支付等第三方的回调,这使得AppDelegate内代码庞大,错综复杂,十分不利于阅读和维护,因此我新增了一个AppDelegate+AppService类别,用来处理生命周期之外的业务,AppDelegate作为事件入口,具体实现直接调用类别里的方法,只为更清晰。
enter image description here

2.主目录按照模块分类,内目录按照业务分类

Modules包含了应用内的功能模块,根据底部Tab栏划分并关联实体文件夹(默认是虚拟的要手动建立实体文件夹拖进来),每个模块内使用的是MVC模式,有人会问为什么多了Resource和Service文件夹,MVC是一种设计思想,并非死套路就仨文件夹,根据实际需求适当增加,在这我选择在Service封装数据请求,VC里调用拿数据即可,至于Resource为什么在这,我认为当功能模块层级较多时,每个大功能模块都对应许多资源,对应到模块内用起来方便,当然也可以放到最外层的Resource文件夹里,建立对应的模块名称,在这儿我是选择把公共的放到最外层Resource里,功能相关的放到模块里的Resource文件夹内,只为更清晰。

优点:对模块的类集中化,方便管理与开发。
缺点:当几个模块共用一些类时,不太好归类。

enter image description here

3. 管理模块

Manager的定义是全局基础服务,通常使用类方法或者单例来实现,主要包含对应用、用户的管理和服务,例如网络状态监听,广告页应用介绍页等;用户快速登录退出操作以及登录状态的获取等。只为更清晰。

enter image description here

4. 工具类

Utils文件夹内主要包含全局通用工具,来源于对三方框架的二次封装,或是自己写的工具类。在这个项目里,我封装了带AES加密网络请求工具,全局Toast提示,广告页等。只为更清晰。

enter image description here

5. 基类

Base文件夹用来存放项目的基类,基类作用包含一些定制化的内容,例如页面样式,空数据页面等,使用基类来实现,可以统一控制,利于维护,减少冗余,也为更清晰。

enter image description here

6. 第三方 & 全局宏定义

  • 第三方文件夹放一些第三方的类库和对第三方封装,比如第三方登录、支付、IM等,现在项目我还没有添加第三方框架。

全局宏顾名思义是定义了一些全局通用宏。我这里定义了四个:
UtilsMacros定义的是一些工具宏,比如获取屏幕宽高,系统版本,数据类型验证等;
URLMacros定义服务器接口地址以及环境开关;

FontAndColorMacros定义全局用的色值、字体大小,这里建议跟设计师共同维护一个设计规范,例如:定义一个主色调宏 MainColor,色值是 0x333333,我们全局使用MainColor宏作为背景颜色,当某天App改版,色值改变,我们只需要去更改 0x333333即可,其他代码不需要动,同时也能一定程度约束设计师,不要随便增加一种颜色,非常接近的颜色应当使用一个。如果设计师不愿意维护这个规范,你可以尝试打一架,打不过的话,就只能自己维护了,只为更清晰。

ThirdMacros 包含第三方框架相关的定义,例如keySecret等。只为更清晰。

enter image description here

7. 资源文件

资源文件,上面说到过,这里我是存放了全局的一些资源文件,功能模块的我放到了模块内的Resource文件夹内,个人喜好,只为更清晰。

enter image description here

8. Pods三方管理

CocoaPods是iOS项目的依赖管理工具,开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第三方开源库的时间。
enter image description here







二. 代码规范:

1. 常量的命名

对于常量的命名最好在前面加上字母k作为标记. 如:

static const NSTimeInterval kAnimationDuration = 0.3;

定义作为NSDictionary或者Notification等的Key值字符串时加上const关键字, 以防止被修改. 如:

NSString *const UIApplicationDidEnterBackgroundNotification

Tips:

I. 若常量作用域超出编译单元(实现文件), 需要在类外可见时, 使用extern关键字, 并加上该类名作为前缀. 如 extern NSString *const PGThumbnailSize

II.全局常量(通知或者关键字等)尽量用const来定义. 因为如果使用宏定义, 一来宏可能被重定义. 二来引用不同的文件可能会导致宏的不同. P.S. 对于#define也添加一下前缀k(强迫症, 哈哈…)

2. pragma mark 使用

#pragma mark  <#注释的内容#>
#pragma mark- ============ LifeCycle ============ 
#pragma mark- ============ Method    ============
#pragma mark- ============ getter and setter ============

猜你喜欢

转载自blog.csdn.net/qq_19678579/article/details/77751853