文学技术部代码规范

  • 代码时间再长,养成的代码习惯也难改掉,但是有时候,逼着自己去改代码习惯的不一定是别人,更可能是自己,换一个公司,温习一下需要注意的代码规范:

    1、枚举类型

      • 当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。
      • 枚举尽量不要归纳到一个专门的.h枚举类文件里面。因为不太明了

    例如:

    typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {

    RWTLeftMenuTopItemMain,

    RWTLeftMenuTopItemShows,

    };

    你也可以显式地赋值(展示旧的k-style常量定义):

    typedef NS_ENUM(NSInteger, RWTGlobalConstants) {

    RWTPinCountMin = 100,

    RWTPinCountMax = 500,

    };

    2Case语句

    • 大括号在case语句中并不是必须的,除非编译器强制要求。当一个case语句包含多行代码时,大括号应该加上。
    • 当相同代码被多个cases使用时,一个fall-through应该被使用。一个fall-through就是在case最后移除'break'语句,这样就能够允许执行流程跳转到下一个case值。为了代码更加清晰,一个fall-through需要注释一下。

    switch (condition) {

    case 1:

    // ** fall-through! **

    case 2:

    // code executed for values 1 and 2

    break;

    default:

    // ...

    break;

    }

    • 当在switch使用枚举类型时,’default'是不需要的。因为枚举已经明确类型了不会再有其他类型

    3、布尔值

      • Objective-C使用YES和NO。因为true和false应该只在CoreFoundation,C或C++代码使用。既然nil解析成NO,所以没有必要在条件语句比较。不要拿某样东西直接与YES比较,因为YES被定义为1和一个BOOL能被设置为8位。
      • 这是为了在不同文件保持一致性和在视觉上更加简洁而考虑。

    应该:

    if (someObject) {}

    if (![anotherObject boolValue]) {}

    不应该:

    if (someObject == nil) {}

    if ([anotherObject boolValue] == NO) {}

    if (isAwesome == YES) {} // Never do this.

    if (isAwesome == true) {} // Never do this.

    如果BOOL属性的名字是一个形容词,属性就能忽略"is"前缀,但要指定get访问器的惯用名称。例如:

    @property (assign, getter=isEditable) BOOL editable;

    4CGRect函数

    • 当访问CGRect里的x, y, width, 或 height时,应该使用CGGeometry函数而不是直接通过结构体来访问。引用Apple的CGGeometry:

    应该:

    CGRect frame = self.view.frame;

    CGFloat x = CGRectGetMinX(frame);

    CGFloat y = CGRectGetMinY(frame);

    CGFloat width = CGRectGetWidth(frame);

    CGFloat height = CGRectGetHeight(frame);

    CGRect frame = CGRectMake(0.0, 0.0, width, height);

    不应该:

    CGRect frame = self.view.frame;

    CGFloat x = frame.origin.x;

    CGFloat y = frame.origin.y;

    CGFloat width = frame.size.width;

    CGFloat height = frame.size.height;

    CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };

    5、错误处理

    • 当方法通过引用来返回一个错误参数,判断返回值而不是错误变量。
    • 在成功的情况下,有些Apple的APIs记录垃圾值(garbage values)到错误参数(如果non-NULL),那么判断错误值会导致false负值和crash。

    应该:

    NSError *error;

    if (![self trySomethingWithError:&error]) {

    // Handle Error

    }

    不应该:

    NSError *error;

    [self trySomethingWithError:&error];

    if (error) {

    // Handle Error

    }

    6、模型(Model)规范

    • 对于定义模型类,属性名就跟接口中所返回的参数名一样就可以了,除非接口所定义的返回数据字段与我们ios的关键字相同而不得不修改为另外一个名字。
    • 接口返回的字段是type,而这个字段所返回的值为1,2,3之类的,而视图显示的却是本人、父亲之类的。因此,我们应该将逻辑放到模型中,外部不能修改,只能获取,而视图这里只负责显示即可,就不需要去处理逻辑了。

    7、控制器规范

    • 对于控制器类,对外的接口都是统一的。对外不公开属性,统一将所需要传的参数放到初始化api中,将外部所传的参数放到内部作为私有。这么做的好处是,所以需要维护这些代码的人,不需要去一个个查那一堆的属性到底哪个是必传,哪些是可以不传。如下:
    • 当控制器代码逻辑很多的时候,不要全部堆在里面:

    1、根据这个控制器里面的业务分别建立logicModel去处理业务逻辑。

    2、根据视图类型的不同分别建立视图对象把各种view抽象出去。

    3、碰到这个控制器有tableview的时候千万不要把代理的实现委托给这个控制器,应该把委托交给另外一个logicmodel或者tableView本身。

     

卫博生-惜丝丝缘分,爱点滴生活!

发表评论

电子邮件地址不会被公开。 必填项已用*标注