摘要
在编写代码中,我们要有意识的注意代码规范对团队协作的重要性!
1.关于命名
1.1 统一要求
含义清楚,尽量做到不需要注释也能了解其作用,若做不到就要添加注释说明。
1.2 类的命名
大驼峰式命名:
每个单词的首字母都采用大写字母(如:BYLoginView)
后缀要求:
模型类:使用Model做后缀(如:BYUserModel)
工具类:使用Utils或者Tools或者Helper(如:BYBundleHelper)
协议:使用Protocol做后缀(如:BYLoginViewProtocol)
ViewController:使用ViewController做后缀(如:BYLoginViewController)
View:使用View做后缀(如:BYLoginView)
TableViewCell:使用Cell做后缀(如:BYUserListCell)
其他UI控件以此类推 ……
1.3 分类(类别)命名
与类名相同,此外需添加要扩展的类名 "+"(如:NSString+Login)
1.4 私有变量
小驼峰式命名:
第一个单词以小写字母开始,后面单词的首字母全部大写(如:userName)
以_开头:
第一个单词首字母小写(如:NSString * _userName;)
注意:
私有变量放在 .m 文件中声明
1.5 property 变量
小驼峰式命名:
@property (nonatomic, copy) NSString *userName; // 用户名
1.6 宏定义命名
全部大写:
单词之间用 _ 分隔【不带参数】
#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]]
1.7 枚举
Enum 类型的命名与类的命名规则一致,Enum 中枚举内容的命名需以 Enum 类型名称开头。
typedef NS_ENUM(NSInteger,LoginMainViewActionTag) {
LoginMainViewActionTagTourist = 1001, // 游客登录
LoginMainViewActionTagRegister = 1002, // 注册账号
LoginMainViewActionTagSignIn = 1003, // 账号登录
LoginMainViewActionTagForgot = 1004, // 忘记密码
};
1.8 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;
1.9 方法命名
首字母小写,之后每个单词首字母大写,方法名尽量使用动词短语。如:
- 如果该方法对内部使用的在前面加“_”
- 如果该方法对外部使用的在前面不加“_” 。
- (void) loadData:(NSData *)data
{...}
- (void) _loadData:(NSData *)data
{...}
注意:
(1)“-”号后面,有空格;
(2)“(void)” 后面,有空格;
(3)传递参数的类型,如果是指针,类与*号之间有空格。
1.10 方法参数命名
首字母小写,之后每个单词首字母大写,具有足够的说明性,如:
- (void) setUserData:(NSDictionary *)userInfo;
1.11 图片命名
使用英文,全部小写,单词中间以“_”隔开。不同模块,可添加UI模块作为前缀,避免冲突,(如:bar_icon_title)
2.私有方法及变量声明
在 .m 文件中最上方,定义空的 category 进行声明,如:
#import "BYLoginView.h"
// 在这个category(类目)中定义变量和方法
@interface BYLoginView ()
{
// 声明私有变量
}
// 私有方法
- (void)samplePrivateMethod;
@end
@implementation BYLoginView
// 私有方法的实现
- (void)samplePrivateMethod
{...}
@end
3.关于注释
若命名规范,代码又能做到见名知意,则可以不用添加注释;否则需适当的添加一些注释或Mark说明。
3.1 属性声明注释
/// 用户名
@property (nonatomic, copy) NSString *userName;
3.2 方法声明注释
/**
* 登录
*
* @param username 用户名
* @param password 密码
* @param complete 执行完毕的block
*/
+ (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete;
4.关于UI布局
如果使用 Interface Builder 进行界面布局,需xib文件的命名与其对应的 .h 文件保持相同,xib文件中控制的组织结构要合理,且xib文件中控件需要有合理的可读性强的命名,方便阅读代码的人理解。
如果使用 Auto Layout 进行界面布局,UI控件的命名也要注意规范,及需在 .m 文件中最上方,定义空的 category 进行声明。
5.格式化代码
5.1 指针 * 的位置
定义一个对象时,指针 * 靠近变量(如:NSString *userName;)
5.2 方法的声明和定义
在 - 、+ 和返回值之间留一个空格,方法名和第一个参数之间不留空格。如:
+ (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete;
- (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete;
5.3 代码缩进
在 Method 与 Method 之间,空一行。如:
+ (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete
{...}
- (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete
{...}
5.4 对 Method 进行分组
#pragma mark - life cycle methods
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{...}
- (void)viewDidLoad
{...}
#pragma mark - public methods
- (void)samplePublicMethod
{...}
- (void)sample
{...}
#pragma mark - private methods
- (void)samplePrivateMethod
{...}
- (void)sampleForIf
{...}
5.5 大括号写法
对于类的 Method:左括号,另起一行写(遵循苹果官方开发者文档),如:
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
对于其他使用场景:左括号,可以跟在第一行后边,如:
- (void)sampleForSwitch
{
SampleEnum testEnum = SampleEnumTwo;
switch(testEnum) {
case SampleEnumUndefined:{
// do something
break;
}
case SampleEnumOne:{
// do something
break;
}
case SampleEnumTwo:{
// do something
break;
}
default:{
NSLog(@"WARNING: there is an enum type not handled properly!");
break;
}
}
}
6.头文件.h执行文件.m
6.1 .h 文件
#import "xxxx.h" 部分头文件时,如果只是内部使用,请放在.m文件下;.h 使用 @class xxxx 声明该类即可。文件下有声明代理,把@protocol 代理放在 @interface 上面。代理方法必须包含该类名。如:
@class BYLoginMainView;
@protocol BYLoginMainViewDelegate <NSObject>
/**
* 触发控件
*
* @param loginMainView 主登录View
* @param index 标识
* @param accountInfo 点击“登录”时,传出数据【 如:@{@"username":@"username",@"password":@"password"}】
*/
- (void)loginMainView:(BYLoginMainView *)loginMainView didSelectControlAtIndex:(NSInteger)index accountInfo:(NSDictionary *)accountInfo;
@end
@interface BYLoginMainView : UIView
@property (nonatomic,assign) id<BYLoginMainViewDelegate> delegate;
@end
6.2 .m 文件
在 @implementation BYLoginMainView 上方使用 @interface RFLoginMainView ( ) @end ;将不被外部使用的代理,添加在.m 的 @interface ( )下。如:
@interface BYLoginMainView ()<UITableViewDelegate,UITableViewDataSource>
@end
7.代码整体规范
系统函数放在上面,自定义函数放在中间,Setter 与 Getter 方法放在下面。如:
#import "BYLoginView.h"
@implementation BYLoginView
- (instancetype)init {
self = [super init];
if (self) {
self.backgroundColor = [UIColor colorWithWhite:0. alpha:[BYCustomColors sharedCustomColors].bg_alpha];
[self loginMainViewToScreen];
}
return self;
}
#pragma mark - Actions
- (void)loginMainViewToScreen
{
[self.loginMainView addToSuperView:self];
if (![self.currentView isKindOfClass:[self.loginMainView class]]) {
[self show:self.loginMainView stopAnimation:NULL];
}
}
#pragma mark - Getter Method
- (BYLoginMainView *)loginMainView {
if (!_loginMainView) {
_loginMainView = [[BYLoginMainView alloc] initWithDeleggate:self];
}
return _loginMainView;
}
@end
网友评论