Clean code objective c

:slight_smile: Đây là một số phương pháp khi tớ làm việc với obj c. Với mỗi người, tổ chức có thể khác, thế nên cái này chỉ mang tính tham khảo.

  • Sử dụng immutable

Đối với array hay dictionary nếu không cần sử dụng mutable thì ta nên viết như sau:

NSArray *pFruit = @[@"orange", @"apple", @"lemon", @"strawberry"];
NSDictionary *pDict = @{ @"name" : @"Tom",  @"age" : @18};

Thay vì viết:

NSArray *pFruit = [NSArray arrayWithObjects:@"orange", @"apple", @"lemon", @"strawberry", nil];
NSDictionary *pDict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2", @"key2", nil];

Như thế code nhìn trông gọn và dễ đọc hơn, đối với các biến dạng số hoặc bool được đưa vào trong dictionary để gửi lên server ta cũng nên làm như vậy.

NSNumber *pIsNew = @YES;

Thay vì

NSNumber *pIsNew = [NSNumber numberWithBool:YES]; 
  • Sử dụng category

Frame được sử dụng nhiều khi viết code iOS, ta có thể tạo ra một file chứa các c function chuyên làm việc với frame, hay tạo ra một macro. Ví dụ như muốn lấy originX của 1 uiview:

CGFloat ORIGIN_X( CGRect rec)
{
    return rec.origin.x;
}

Hoặc ngắn hơn với macro

#define posX(v)                  v.frame.origin.x

Tuy nhiên sử dụng category cũng là một lựa chọn thời thượng. Giả sử bạn có thể lấy originX bằng cách sau:

CGFloat originX = [PopUpView getX];

Khá ngắn gọn, clear, dễ chỉnh sửa, đặc biệt với những ai hay gửi nhận dữ liệu lên server, đôi khi dictionary sẽ trả về một cái object null. Việc check null ở nhiều chỗ khác nhau khá là tốn thời gian nếu cứ phải viết đi viết lại như thế này

if(dict[@"key"] && ![dict[@"key"] isEqual: [NSNull null]])

Ta có thể đưa vào category theo cách sau

- (id)safeValueForKey:(NSString *)key {
    id value = [self valueForKey:key];
     
    if (value && ![value isEqual: [NSNull null]]) {
        return value;
    }
     
    return nil;
}

Sau đó ở tất cả mọi nơi chỉ cần gọi

NSString *pValue = [dict safeValueForKey: @"key"];
  • Sử dụng block

    UIView *pCircle2 = ({
    UIView *pView = [[UIView alloc]
    initWithFrame:CGRectMake(80.0f, 80.0f, 90.0f, 90.0f)];
    pView.backgroundColor = [UIColor redColor];
    CAShapeLayer *shape = [CAShapeLayer layer];
    CGFloat r = CGRectGetWidth(pView.frame)*0.5f;
    CGPoint center = CGPointMake( r, r);
    UIBezierPath path = [UIBezierPath bezierPathWithArcCenter:center
    radius:r
    startAngle:0
    endAngle:2
    M_PI
    clockwise:YES];
    shape.path = path.CGPath;
    pView.layer.mask = shape;
    pView;
    });

Gộp các đoạn code sử dụng chung cho một mục đích vào trong 1 block, với cách này thì giá trị return tương ứng với dòng cuối trong block.

Từ cách đặt tên trên ta có thể tạo ra enum như sau

typedef NS_ENUM(NSUInteger, GGAnimationViewType) {
    GGAnimationViewTypeFadeIn,
    GGAnimationViewTypeFadeOut,
    GGAnimationViewTypeEaseIn,
    GGAnimationViewTypeEaseOut
};

Công thức chung là [tên class][tên enum], cụ thể như ví dụ trên [GGAnimationView][Type].
Các giá trị enum [tên class][tên enum][các giá trị]. Các giá trị FadeIn, FadeOut,…

Tóm lại là code càng ngắn gọn càng dễ hiểu, trừ cách đặt tên biến ra :v.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?