一、文件目录
项目基本目录结构如下,针对项目不同,可略作差异处理:
1.Views
存放界面层UIViewController和自定义的UIView,如项目有iPhone和iPad区分适配要求,又可细分为iPhone目录和iPad目录。
文件夹名按项目业务名进行划分,例如:
- MainView
- UserView
- DigitalView
2.Tools
存放轻量级第三方组件、自定义组件、自定义类扩展。不包含cocoapod可导入的工具包,引用第三方库的时候要谨慎,避免使用大容量的第三方库,而导致客户端非常大。
组件如:
- 日期时间处理工具 DateTool
- 弹出加载HUD处理 InfoTool
- 下拉刷新代码图片 UpdownRefresh
- 时间选择器 UWDatePicker
扩展如:
- 弹出框Block返回 UIAlert+Blocks
- WebView用于加载Block模式 UIWebView+Blocks
3.Network
存放网络请求框架和json模型。对应项目请求数据,可对模型层进行修改。
基于目前项目应用MVC框架结构,具体文件内容如下:
网络请求:
- 请求方法处理 NetManager(AFNetWork相关代码)
- 请求数据处理 NetManagerMessage(数据处理相关代码和KVO消息广播)
模型文件:
- 用户信息模型 UserDetailObject:userID userName userPicture
4.Supporting Files
存放配置文件和storyboard文件,包括:
Info.plist
ProjectName.pch
main.m
Main.storyboard
LaunchScreen.storyboard
ApiKey.h
5.Assets.xcassets
存放项目下图片信息,需按项目模块分类大体与View文件夹中对应。Nav菜单和Toolbar菜单中,贯穿整体使用的图片,需单独放置。
二、命名规则
1、注意事项
- 项目编码格式统一采用UTF-8编码
- 代码中除注释外禁止出现中文(在xml等资源文件中)
- 代码中禁止出现警告提示痕迹 例如:#Warning
2、可使用的缩写
除以下列举的缩写格式,每个项目开始前应进行分析,针对特殊命名进行文档编写
缩写 | 全称 |
---|---|
bg | background |
vc | viewcontroller |
btn | button |
nav | navgation |
3、命名基本原则
在面向对象编程中,对于类,对象,方法,变量等方面的命名应该本着描述性以及唯一标识性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆。
命名原则是:使名称足够长以便有一定的意义,并且足够短以避免冗长。
4、一般性原则:
- 可读性高(简洁且清晰)和防止命名冲突(通过加前缀后缀来保证)
- Objective-C 的命名通常都比较长, 名称遵循驼峰式命名法.
- 方法名要指明具体用途,让开发者能一目了然,清晰表达要插入什么?删除什么?具体位置是指?
方法名合理 | 不合理 | 原因 |
---|---|---|
insertObject:atIndex: | insert:at: | 插入什么?at是指? |
removeObjectAtIndex: | remove: | 删除什么? |
- 尽可能保持与cocoa命名规则一致
代码 | 原因 |
---|---|
– (NSInteger)tag | 在 NSView, NSCell, NSControl 中有定义 |
– (void)setStringValue:(NSString *) | 在许多 Cocoa classes 中都有定义 |
5、文件的命名:
- 分类的文件名应该包含被扩展的类名,如NSString+HooUtils.h
- 文件名不要使用缩写
6、类的命名:
类名(以及类别、协议名)应首字母大写,并以驼峰格式分割单词。
a.类的前缀
- 所有类名、枚举、结构、protocol定义时最好加一个统一的标示符,可以是项目缩写,或者个人项目的名称缩写,例如都加上全大写的Hoo(我的姓氏)作为前缀
- 根据功能模块可以在给功能模块的类添加功能模块的名称前缀,如用户中心的profileViewController.可以命名为HooUCProfileViewController.
b.类的后缀
- 所有protocol定义时,都加上后缀Delegate 。如,HooRefreshViewDelegate,表示RefreshView的协议;
- 所有的控制器都加上Controller,所有的通知名都加上Notification。
7、类别命名
-
类名+标识+扩展(UIImageView +HP+Web)
如果我们想要创建一个基于UIImageView 的类别用于网络请求图片,我们应该把类别放到名字是UIImageView+HPWeb.h的文件里。UIImageView为要扩展的类名,HP为专属标识,Web为扩展的功能。
8、方法命名
方法名应遵守小驼峰原则,首字母小写,其他单词首字母大写,每个空格分割的名称以动词开头。执行性的方法应该以动词开头,小写字母开头,返回性的方法应该以返回的内容开头,但之前不要加get。如:
- (void)insertModel:(id)model atIndex:(NSUInteger)atIndex;
- (instancetype)arrayWithArray:(NSArray *)array;
a.代理方法
以发送代理的对象类名作为代理方法名的开始(去掉类名的前缀,并且小写开头)
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
9、枚举的命名
正宗的iOS开发者当然要以Objective-C的方式命名枚举,如:
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
10、属性、变量命名
变量名使用小驼峰法, 使变量名尽量可以推测其用途属性具有描述性。别一心想着少打几个字母,让你的代码可以迅速被理解更加重要。每个属性命名都加上类型后缀,如,按钮就加上Button
后缀,模型就加上Model后缀。
@property (nonatomic, strong) UIButton *submitButton;
a.类成员变量名
成员变量用小驼峰法命名并前缀下划线,如:
UIButton *_submitButton;
b.局部变量名
遵守小驼峰命名规则,如:
NSInteger numCompletedConnections =3;
const常量
以小写k
开头,后面单词首字母大写,其余小写。如:
const float kMaxHeigt = 100.0f;
如果是特殊含义的常量也建议加上后缀,如通知加上Notification为后缀,如:
extern Nsstring * Const kLoginSuccessNotification
11、资源文件命名 (图片,本地化文件)
这个图片资源命名方式,以功能为组织形式,是一个很好的习惯,有利于查看资源文件。
采用单词全拼,或者大家公认无岐义的缩写(比如:nav,bg,btn等)
“模块+功能”命名法。
模块分为公共模块、私有模块。公共模块主要包括统一的背景,导航条,标签,公共的按钮背景,公共的默认图等等;私有模块主要根据app的业务功能模块划分,比如用户中心,消息中心等。
例如用户中心用户头像图片的命名可以为:uc_imageview_user_icon
三、注释原则
方法注释
对于方法的注释,尽可能保留在声明文件中。
当它需要的时候,注释应该用来解释特定的代码做了什么。所有的注释必须被持续维护或者干脆就删掉,不要做多余注释,应维持简洁。
块注释应该被避免,代码本身应该尽可能就像文档一样表示意图,只需要很少的打断注释。 例外: 这不能适用于用来产生文档的注释
头文档
一个类的文档应该只在 .h 文件里用 Doxygen/AppleDoc 的语法书写。 方法和属性都应该提供文档。
/**
* Designated initializer.
*
* @param store The store for CRUD operations.
* @param searchService The search service used to query the store.
*
* @return A ZOCCRUDOperationsStore object.
*/
- (instancetype)initWithOperationsStore:(id<ZOCGenericStoreProtocol>)store
searchService:(id<ZOCGenericSearchServiceProtocol>)searchService;
类结构布局
使用#pragma mark –来分类方法
#pragma mark – Life Cycle
#pragma mark - Events
#pragma mark – Private Methods
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - Custom Delegates
#pragma mark – Getters and Setters
四、编码原则
- 服务端可以实现的,就不要放在客户端来实现
- 如果多个ViewController中包含共同的UI处理,那么可以提炼一个CommonViewController,把通用部分叫由它来处理,其他ViewController只要继承它即可
- 数据一定要校验,例如,字符型转数字型,如果转换失败一定要有缺省值;服务端响应数据是否有效判断
- 图片需针对分辨率处理,图片过大(超过200MB)需要压缩
- 不要重用父类的handler,对应一个类的handler也不应该让其子类用到
- 每个ViewController都有自己独立的消息处理,其中包括正确的消息处理,错误处理,异常捕捉
2)采用“模块+功能”命名法,模块分为公共模块、私有模块。公共模块主要包括统一的背景,导航条,标签,公共的按钮背景,公共的默认图等等;私有模块主要根据app的业务功能模块划分,比如用户中心,消息中心等。
例如用户中心用户头像图片的命名可以为:uc_imageview_user_icon
感谢jackiehoo(简书作者)
部分参考来自于:http://www.jianshu.com/p/c598d32560e8
http://www.jianshu.com/p/1aa8b9bb4576
以及
Google 开源项目风格指南