一) 关于命名
-
1> 统一要求
- 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释; 使用全称,不适用缩写
-
2> 类的命名
- 大驼峰式命名:每个单词的首字母都采用大写字母, 例子:LYHomePageViewController
- 后缀要求:
-
ViewController
: 使用ViewController做后缀, 例子: MFHomeViewController -
View
: 使用View做后缀, 例子: MFAlertView -
UITableCell
: 使用Cell做后缀, 例子: MFNewsCell -
Protocol
: 使用Delegate或者DataSource作为后缀, 例子: UITableViewDelegate
-
- 后缀要求:
- 大驼峰式命名:每个单词的首字母都采用大写字母, 例子:LYHomePageViewController
-
3> 私有变量
- 小驼峰式命名:第一个单词以小写字母开始,后面的单词的首字母全部大写. 例子:firstName、lastName
- 以 _ 开头,第一个单词首字母小写 : 例子:
NSString * _somePrivateVariable
, 私有变量放在 .m 文件中声明
-
4> property变量
- 小驼峰式命名, 例子:
///注释
@property (nonatomic, copy) NSString *userName;
-
5> 宏命名
- 全部大写,单词间用 _ 分隔。[不带参数]. 例子: #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
- 以字母 k 开头,后面遵循大驼峰命名。[不带参数]. 例子:#define kWidth self.frame.size.width
- 小驼峰命名
#define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kBaseUrl,url]]
-
6> Enum
- Enum类型的命名与类的命名规则一致
- Enum中枚举内容的命名需要以该Enum类型名称开头
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { AFNetworkReachabilityStatusUnknown = -1, AFNetworkReachabilityStatusNotReachable = 0, AFNetworkReachabilityStatusReachableViaWWAN = 1, AFNetworkReachabilityStatusReachableViaWiFi = 2 };
-
7> Delegate命名(遵循苹果的标准)
- 类的实例必须为回调方法的参数之一, 如 :
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
- 回调方法的参数只有类自己的情况,方法名要符合实际含义, 如:
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
- 以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的, 如:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- 使用did和will通知Delegate已经发生的变化或将要发生的变化, 如:
-(NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath; -(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
- 类的实例必须为回调方法的参数之一, 如 :
-
8> 语法糖
- 代码中使用语法糖,提高写代码效率 :
- NSArray :
//NSArray的定义 NSArray *array = @[@"lu", @"da", @"shi", @YES, @123]; //NSArray的访问 array[index];
- NSDictionary
//NSDictionary的定义简化 NSDictionary *dictionary = @{ @"key0" : @"value0", @"key1" : @"value1", @"key2" : @"value2" }; //NSDictionary访问数据简化 dictionary[@"key2"];
- NSNumber
NSNumber *a = @123; NSNumber *b = @11.2; NSNumber *c = @('a');
- 代码中使用语法糖,提高写代码效率 :
二) 私有方法及变量声明
-
1> 声明位置
- 在.m文件中最上方,定义空的category进行声明, 例子:
#import "CodeStandardViewController.h" // 在这个category(类目)中定义变量和方法 @interface CodeStandardViewController () { // 声明私有变量 } // 私有方法 - (void)samplePrivateMethod; @end @implementation CodeStandardViewController // 私有方法的实现 - (void)samplePrivateMethod { //some code }
2> 常量使用
-
常量是容易重复被使用和无需通过查找和代替就能快速修改值。常量应该使用static来声明而不是使用#define,除非显式地使用宏。
- 应该:
static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com"; static CGFloat const RWTImageThumbnailHeight = 50.0;
- 不应该:
#define CompanyName @"RayWenderlich.com" #define thumbnailHeight 2
三) 关于注释
- 最好的代码是不需要注释的 尽量通过合理的命名
- 良好的代码把含义表达清楚 在必要的地方添加注释
- 注释需要与代码同步更新
- 如果做不到命名尽量的见名知意的话,就可以适当的添加一些注释或者mark
- 1> 属性注释
/// 学生 @property (nonatomic, strong) Student *student;
- 2> 方法声明注释:
/** * @brief 登录验证 * * @param personId 用户名 * @param password 密码 * @param complete 执行完毕的block * * @return */ + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;
四) 关于UI布局
- 1> 使用Interface Builder进行界面布局
- Xib文件的命名与其对应的.h文件保持相同
- Xib文件中控件的组织结构要合理,Xib文件中控件需要有合理的可读性强的命名,方便他人理解
五) 格式化代码
-
1> 指针 "*" 位置
- 定义一个对象时,指针 "*" 靠近变量. 例子: NSString *userName;
-
2> 方法的声明和定义
- 在 - 、+ 和 返回值 之间留一个空格,方法名和第一个参数之间不留空格 :
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil{...}
- 在 - 、+ 和 返回值 之间留一个空格,方法名和第一个参数之间不留空格 :
-
3> 代码缩进
- 使用 xcode 默认缩进,即 tab = 4空格
- 使用 xcode 中 re-indent 功能定期对代码格式进行整理
- 相同类型变量声明需要独行声明
CGFloat oringX = frame.origin.x; CGFloat oringY = frame.origin.y; CGFloat lineWidth = frame.size.width; // Method与Method之间空一行 #pragma mark - private methods - (void)samplePrivateMethod{...} - (void)sampleForIf{...}
- 4> 对method进行分组
- 使用 #pragma mark - 方式对类的方法进行分组, 例子:
#pragma mark - private methods - (void)samplePrivateMethod{...} - (void)sampleForIf{...} - (void)sampleForWhile{...} - (void)sampleForSwitch{...} - (void)wrongExamples{...} #pragma mark - public methods - (void)samplePublicMethodWithParam:(NSString*)sampleParam{...} #pragma mark - life cycle methods - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{...} - (void)viewDidLoad{...} - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{...}
- 5> 大括号写法
- 对于类的method: 左括号另起一行写(遵循苹果官方文档)
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; }
- 对于其他使用场景: 左括号跟在第一行后边
- (void)sampleForIf{ BOOL someCondition = YES; if(someCondition) { // do something here } } - (void)sampleForWhile{ int i = 0; while (i < 10) { // do something here i = i + 1; } }
- 任何需要写大括号的部分,不得省略, 错误示例:
- (void)wrongExamples{ BOOLsomeCondition = YES; if (someCondition) NSLog(@"this is wrong!!!"); while(someCondition) NSLog(@"this is wrong!!!"); }
六) 关于资源文件
-
原则
- 采用单词全拼,或者大家公认无岐义的缩写(比如:nav,bg,btn等)
- 采用“模块+功能”命名法,模块分为公共模块、私有模块。公共模块主要包括统一的背景,导航条,标签,公共的按钮背景,公共的默认图等等;私有模块主要根据app的业务
- 功能模块划分,比如用户中心,消息中心等
-
公共模块命名示例:
- 导航条背影图片:
bg_nav_bar@2x.png
- 导航返回按钮:
bg_nav_back_normal@2x.png,bg_nav_back_selected@2x.png
- 标签item背景:
bg_tabbar_record_normal@2x.png,bg_tabbar_record_selected@2x.png
- 导航条背影图片:
-
私有模块命名示例:
以Joggers APP的用户中心图片资源为例说明,uc——user center+
- 用户中心头像默认图:
bg_uc_avatar@2x.png
- 用户中心顶部默认背景图:
bg_uc_top_defaut@2x.png
- 用户中心底部背景图:
bg_uc_bottom@2x.png
- 用户中心头像默认图:
备注: 这部分工作较为繁杂,并且在程序员心中会认为是技术含量较低的一个工作,但图片命名的严谨性同样会反映出我们对细节的追求,细节决定成败
七) 补充规范
-
- 删除多余的空行
- 所有方法与方法之间空1行
- 所有代码块之间空1行
- 删除未被使用的资源文件
-
- 整体代码风格需要统一
- 代码后面的”{“ 不需要单独占用一行
- 逻辑运算符 与 代码之前空一格
-
#pragma mark -
与下面的代码之前不要空行
-
4.代码量控制
- 单页代码最好控制在800行以内,每个方法最好不要超过80行,过多建议对代码进行重构
-
5.及时更新代码风格
- 对其他项目中copy过来的代码,根据具体需要更新代码风格,及时删除未被使用的代码
-
文章引用