【禅与Objc编程艺术】

https://github.com/oa414/objc-zen-book-cn/
主要关于代码规范的,最后还讲了一些其他方面;
虽然规范从一开始就整理了好多遍,这个也看过,简单记录下;看看还是很有收获的,尤其是不注意代码规范的孩子;好评。

  • 1 条件语句:注意括号,不要省略;
    if (!error) {
        // do something;
    }
  • 2 不要使用尤达表达式:推荐使用 变量与常量比较(不要倒过来),或者使用 !(不要使用nil==obj)
 // 1
    if ([myName isEqualToString:@"说了是村长"]) {
        // do something;
    }
    
 // 2
    if (!error) {
        // do success
    }
  • 3 黄金大道:建议复杂代码不嵌套在 if 内部;
    if (error) {
  // alert info
        return;
    }
    // do something success important 
    
  • 4 复杂的表达式:if 条件复杂时,建议把条件提取出来,写成多个BOOL类型;
    if ((isConnected && currentUUID) || isManager) {
        // do something
    }
  • 5 三元运算符:使用是为了使代码更清楚!
 // 1
    NSString *result = a > b ? x : y;

 // 2
    NSString *object = @"134";
    NSString *result = object ? : @"999";
    
  • 6 错误处理:不要判断error是否存在去处理,而是判断对方法处理结果的BOOL;
    NSError *error = nil;
    if (![self doSomeThingWithError:&error]) {
        // do error thing;
    }
  • 7 switch case:建议添加括号,使用可枚举变量时建议不使用 default;
    switch (type) {
        case TestTypeOne: {
            //
            break;
        }
        
        case TestTypeTwo: {
            //
            break;
        }
            
        case TestTypeThree: {
            //
            break;
        }
    }
  • 8 枚举类型:使用 NS_ENUM(),NS_OPTION();
typedef NS_ENUM(NSUInteger, TestType) {
    TestTypeOne,
    TestTypeTwo,
    TestTypeThree
};
  • 9 通用命名:遵守apple命名规定,建议使用长的、描述性的命名
UIButton *settingButton;
  • 10 常量命名:添加相关类前缀(私有的常量可以使用k前缀),不建议使用宏定义;
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;
extern const NSTimeInterval  ZOCSignInViewControllerFadeOutAnimationDuration;
  • 11 方法命名:注意apple风格,注意空格,参数命名,尽量不要出现and;
+ (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;

  • 12 字面量:NSString,NSDictionary,NSArray,NSNumber的创建;
    NSString *name = @"说了是村长";
    NSNumber *age = @24;
    NSArray *friend = @[@"张三",
                        @"李四",
                        @"王五"];
    NSDictionary *info = @{@"phone":@"514515",
                           @"address":@"紫金港"};
    
  • 13 类命名:使用三个大写字母作为前缀,包括公开常量,协议,通知等;
BBBViewController
BBBUserInfoChangeNotification;
  • 14 使用instancetype 代替 id 作为返回类型;
- (instancetype)initWithFrame:(CGRect)frame;
  • 15 单例:通常公开类方法就足够,不应该将单例作为对象的容器;

  • 16 属性:小写开头,避免缩写;

NSString *text;
  • 17 init 里不要使用getter setter,应该直接访问实例;

  • 18 使用setter getter 方法使用 .符号;

 // backgroundColor
    self.view.backgroundColor = [UIColor redColor];
  • 19 属性定义:nonatomic,readwrite,copy 的选择;
@property (nonatomic, strong)  NSTimer *timer ;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) void(^testBlock)();
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, weak) iddelegate;
  • 20 懒加载:重写getter方法,延迟实例化;
- (NSString *)name{
    if (!_name) {
        _name = @"test";
        
    }
    return _name;
}
  • 21 使用断言;
    NSAssert([@"1" isEqualToString:@"2"], @"你确定 ?");
  • 22 私有方法:不要再私有方法前加上 “_”;

  • 23 相等性:isEqual 和 hash;对象相等 hash一定相对,反之不一定;

  • 24 Categories:方法前添加 小写前缀以及下划线;

+ (instancetype)mj_objectWithKeyValues:(id)keyValues;
  • 25 美化:空格,换行,冒号对齐;
 // 1,这个我确实一直没这么写,在考虑要不要也改成这么用;
    if (a) {
        // do
    }
    else if (b) {
        // do
    }
    else {
        // do
    }

 // 2
- (void)alertMessage:(NSString *)message {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示"
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"知道啦"
                                                       style:UIAlertActionStyleCancel
                                                     handler:nil];
    [alertController addAction:okAction];
    
    [self presentViewController:alertController
                       animated:YES
                     completion:nil];
    
}
  • 26 利用代码块:括号内的代码,会返回最后语句的返回值;
    NSString *content = @"1234567890";
    NSString *subString = ({
        NSString *tempString = [content substringWithRange:NSMakeRange(2, 2)];
        [NSString stringWithFormat:@"%@%@",tempString,tempString];
    });
    NSLog(@"%@",subString);// 3434
  • 27 pragma:组织代码;
#pragma mark - View lifeCycle

#pragma mark - Methods

#pragma mark - TableView Delegate

#pragma mark - Other Delegate

#pragma mark - Layout Views (处理UI布局,一般storyboard 不需要,代码布局会有大量,对应下面 Getter 也会大量)

#pragma mark - Getter Setter
  • 28 warning:手动标记;
#warning i know it will be error sometime; 英语不好没办法,写中文,左边不会显示哦;
  • 29 添加注释;

  • 30 block

  • 31 委托和数据源

  • 32 继承

  • 33 AOP 面向切面编程;

你可能感兴趣的:(【禅与Objc编程艺术】)