命名规范
采用驼峰命名法,长度为可读性高和同时能够防止命名冲突为佳
常量命名
//常量命名前面加上小写字母'k'开头作为标记,如
static const NSTimeInterval kDropDownAnimationDuration = 0.5;
//作为NSDictionary或者NSNotificationCenter以及其对象的Key值时候,最好加上'const'防止被修改
NSString *const UIApplicationDidFinishedLaunchNotification = @"UIApplicationDidFinishedLaunchNotification"
变量和对象命名
全局变量
//变量命名推荐采用 修饰作用 + 类型
UILabel *episodeNameLabel;
UIButton *showEpisodeDetailInfoButton;
//如果不能通过名字比较准确说明作用的,可以添加简洁注释
UIView *_topContainerView; //顶部3个按钮的容器View
局部变量
//局部变量,可稍微简单些,但是尽量避免出现temp,view1,view2等很模糊的名字
对象命名
//对象命名时注意属性,私有熟悉尽量不在.h 文件中暴露,对.h是否加readonly等不作强制性要求
@property (nonatomic, copy,) NSString *deviceNamestring;
枚举命名
//枚举名字命名时候加上类名前缀
//枚举类型命名是需要类名为前缀并且加上操作的说明
typedef NS_ENUM(NSUInteger, VODPlayType)
{
VODPlayTypeSoapOpera = 1, //连续剧
VODPlayTypeVarity = 2, //综艺
VODPlayTypeMovie = 3, //电影
};
类命名
//类名名推荐 功能 + superClass, 也可以加上自己的标示符在最前面作为前缀
MBLoadingView,
STMovieTableCellView,
LiveAndLookbackViewController,
方法命名
//格式如下,方法名需要能够表达方法作用,参数名字也要能够准确描述参数
- (void)chooseLookBackDay:(UIButton *)lookBackDayBtn
{
}
//两个方法采用一行空格隔开
- (void)changelookBackDayPageBy:(UIButton *)lookBackDayBtn
{
}
//模块作用相似的多个方法放在尽量写在一起
编码规范
主要的目的就是 ‘易阅读,易维护’,最后再说易复用和扩展的问题
判定nil或者YES/NO
//推荐
if (videoObject){...}
if (!videoObject){...}
//不推荐
if (videoObject == nil){...}
//推荐
if (isValidatePhoneNumber){...}
//不推荐
if (isValidatePhoneNumber == YES){...}
条件赋值
//涉及到三目的时候,尽量将条件括起来
isValidatePhoneNumber = (x > 0) ? YES : NO;
//如果设计到判定条件较长的,不推荐使用三目运算,可读性较差,例如:
self.name = ([object.name rangeOfString:@"x"].length != 0) ? [object.name subStringToIndex:5] : @"name";
BOOL赋值
//推荐
BOOL isAdult = age > 18;
//不推荐
BOOL isAdult;
if (age > 19) {
isAdult = YES;
}else{
isAdult = NO;
}
复杂的条件判断
//推荐
+ (BOOL)isEmptyString:(NSString *)string;
{
if (!string) return YES;
if ([string isKindOfClass:[NSNull class]]) return YES;
if (string.length == 0) return YES;
return NO;
}
//不推荐
+ (BOOL)isEmptyString:(NSString *)string;
{
if (!string || [string isKindOfClass:[NSNull class]] || string.length == 0)
{
return YES;
}
return NO;
}
嵌套判断
//推荐
{
if (!user.UserName) return NO;
if (!user.Password) return NO;
if (!user.Email) return NO;
return YES;
}
//不推荐
{
BOOL isValid = NO;
if (user.UserName)
{
if (user.Password)
{
!!!只有一行语句的时候注意括号千万不能省,一定要写上
if (user.Email) isValid = YES;
}
}
return isValid;
}
注释规范
接口或方法注释
外部接口必须添加注释
快速注释插件可使用https://github.com/onevcat/VVDocumenter-Xcode
/**
* 首页每个分类的热门推荐列表
*
* @param frame 列表大小
* @param media_asset_id 分类id
* @param category_id 栏目id
*
* @return 启动了网络请求的列表
*/
- (id)initWithFrame:(CGRect)frame mediaAssetId:(NSString *)media_asset_id categoryId:(NSString *)category_id;
Bug修改注释
涉及到逻辑修改的必须加上注释
//例如
//begin 姓名 10-22
//修改原因
...
... (中间添加修改的代码)
...
//end
SVN代码提交注释
项目版本号(我们开发的小版本号)和修改的内容
如:
V 1.5.2
1. 修改了XXXX
2. 添加了XXXX
资源添加
图片添加
同一模块图片放在同一个文件夹下
图片添加时候需要根据具体用途命名,例如当前的图片属于主页Home,则推荐命名为 类名 + 作用,
如:
Home_Back_Image.png
Home_Play_Image.png
多语言添加
模块间使用空格隔开,并且添加简单说明
//推荐
"Share_Tips" = "...";
"Sms_Message_Send_OK"="...";
"Sms_Message_Send_Failed"="...";
//购买流量
"Open_Traffic_Tips" = "...";
"Open" = "...";
第三方开源库添加
添加到统一的文件夹中,使用group包裹.