代码规范

版权所有,禁止匿名转载;禁止商业使用。
公司最近让审核代码,指定代码规范,综合总结了一下网上资源,老大最后采纳了,让继续补充,公司规模还行1000人左右,认为还是有一定的借鉴意义的.望大家补充!谢谢

1.命名规则   
(1)类名首字母大写,方法首字母小写,方法中的参数首字母小写,同时尽量让方法的命名读起来像一句话,能够传达出方法的意思,同时取值方法前不要加前缀“get”
变量名小写字母开头
常量以小写字母k开头,后续首字母大写

(2)变量和对象的命名

给一个对象命名时建议采用修饰+类型的方式. 如果只用修饰命名会引起歧义, 比如title (这个到底是个NSString还是UILabel?). 同样的, 如果只用类型来命名则会缺失作用信息, 比如label (好吧, 我知道你是个UILabel, 但是我不知道它是用来做什么的呀?). So, 正确的命名方式为:
titleLabel //表示标题的label, 是UILabel类型
confirmButton //表示确认的button, 是UIButton类型
对于BOOL类型, 应加上is前缀, 比如- (BOOL)isEqualToString:(NSString *)aString这样会更加清晰. 如果某方法返回非属性的 BOOL 值, 那么应根据其功能, 选用 has 或 is 当前缀, 如- (BOOL)hasPrefix:(NSString *)aString

Tip: 如果某个命名已经很明确了, 为了简洁可以省去类型名. 比如scores, 很明显是个array了, 就不必命名成scoreArray了

(3)对于常量的命名最好在前面加上字母k作为标记. 如:
1
static const NSTimeInterval kAnimationDuration = 0.3;

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

1
NSString *const UIApplicationDidEnterBackgroundNotification

Tips:

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

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


2.声明类或方法时,注意空格的使用,参数过多时可换行保持对齐,
调用方法时也是如此,参数都写在一行或换行冒号对齐,

注意参数过多切有关联的情况





3.建议使用“#pragma mark”,注明方法功能,方便阅读代码


4.建议书写枚举模仿苹果
在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性,
枚举类型命名要加相关类名前缀并且枚举值命名要加枚举类型前缀.  示例:
// 不推荐写法
typedef enum{
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,
    UIControlStateDisabled     = 1 << 1,
} UIControlState;
// 推荐写法
typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,
    UIControlStateDisabled     = 1 << 1,
};

5.建议加载xib,xib名称用NSStringFromClass(),避免书写错误

// 推荐写法
 [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([DXRecommendTagVCell class]) bundle:nil] forCellReuseIdentifier:ID];
// 不推荐写法
 [self.tableView registerNib:[UINib nibWithNibName:@"DXRecommendTagVCell" bundle:nil] forCellReuseIdentifier:ID];

6. 嵌套判断
推荐写法:

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;

一旦发现某个条件不符合, 立即返回, 条理更清晰


7. 判断nil或者YES/NO
Preferred:

if (someObject) { ... } 
if (!someObject) { ... }

Not preferred:

if (someObject == YES) { ...} 
if (someObject != nil) { ...}

if (someObject == YES)容易误写成赋值语句, 自己给自己挖坑了...而且if (someObject)写法很简洁, 何乐而不为呢?


8.关于注释
 
注释很重要,但除了开头的版权声明,尽可能把代码写的如同文档一样,让别人直接看代码就知道意思,写代码时别担心名字太长,相信Xcode的提示功能。模型和接口的属性注释好指的是什么,时间一长自己难免会忘记,更别提别人了. 有多个code码时必须指明每个code码的功能或者情况

9.判断if书写方式
建议这样写

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) return 44;
    if (indexPath.row == 1) return 80;
    if (indexPath.row == 2) return 50;
    return 44;
}

而不是

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        return 44;
    }else if (indexPath.row == 1){
        return 80;
    }else if (indexPath.row == 2){
        return 50;
    }else{
        return 44;
    }
}


10.在导航控制中设置标题

或它的子控制器,设置导航栏的标题应该用self.navigationItem.title = @“标题”而不建议self.title = @“标题”;

11.在一个自定义的View中,或者自定义cell中,modal出一个控制器建议:

[UIApplication sharedApplication].keyWindow.rootViewController

代替

self.window.rootViewController,因为程序可能不止一个window,self.window可能不是主窗口;

12.建议:

用CGSizeZero 代替 CGSizeMake(0,0);
CGRectZero代替CGRectMake(0, 0, 0, 0);
CGPointZero代替CGPointMake(0, 0)

0 0