Object-C之代码艺术

原创 2017年01月03日 16:38:53

代码的整体可读性:功能菜单

- (void)dealloc { /* ... */ }
- (instancetype)init { /* ... */ }

#pragma mark - View Lifecycle

- (void)viewDidLoad { /* ... */ }
- (void)viewWillAppear:(BOOL)animated { /* ... */ }
- (void)didReceiveMemoryWarning { /* ... */ }

#pragma mark - Custom Accessors

- (void)setCustomProperty:(id)value { /* ... */ }
- (id)customProperty { /* ... */ }

#pragma mark - IBActions

- (IBAction)submitData:(id)sender { /* ... */ }

#pragma mark - Public

- (void)publicMethod { /* ... */ }

#pragma mark - Private

- (void)zoc_privateMethod { /* ... */ }

#pragma mark - UITableViewDataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { /* ... */ }

#pragma mark - ZOCSuperclass

// ... overridden methods from ZOCSuperclass

#pragma mark - NSObject

- (NSString *)description { /* ... */ }

条件语句


有条件的机构应始终使用,即使有条件的机构可以不带括号(例如,它只是一条线),以防止错误写括号。这些错误包括增加第二条生产线,并期待它成为if语句的一部分。另一个更危险的缺陷,可能会出现在那里行“里面的”if语句已被注释掉,并在下一行不知不觉成为if语句的一部分。

should be

if (!error) {
    return success;
}

Not

if (!error)
    return success;

// or
if (!error) return success;

should be

- (void)someMethod {
  if (![someOther boolValue]) {
      return;
  }

  //Do something important
}

Not

- (void)someMethod {
  if ([someOther boolValue]) {
    //Do something important
  }
}

Yoda conditions

should be

if ([myValue isEqual:@42]) { ...

Not

if ([@42 isEqual:myValue]) { ...

nil and BOOL judge

should be

if (someObject) { ...
if (![someObject boolValue]) { ...
if (!someObject) { ...

Not

if (someObject == YES) { ... // Wrong
if (myRawValue == YES) { ... // Never do this.
if ([someObject boolValue] == NO) { ...

Case Statements

switch (menuType) { // 枚举
    case CC_EnumNone:
        // ...
        break;
    case CC_EnumValue1:
        // ...
        break;
    case CC_EnumValue2:
        // ...
        break;
}

Enumerated Types

typedef NS_ENUM(NSUInteger, CC_MachineState) {
    CC_MachineStateNone,
    CC_MachineStateIdle,
    CC_MachineStateRunning,
    CC_MachineStatePaused
};

命名

  • Methods

should be

- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;

Not

- (void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height;  // Never do this.
  • 代码解耦及加强可读性
    示例应用场景:假设有个Person类,需要喝水,根据职责划分,我们需要另外一个类Cup来完成喝水的动作,代码如下:
//Person.h
@interface Person:NSObject
- (void)drink;
@end

// Cup.h
@interface Cup:NSObject
- (id)provideWater;
@end

很明显Person和Cup间要完成喝水动作,一定会产生耦合,我们来看看OC中不同耦合方式下调用,代码的质量比较

方式一:.m引用

在.m文件导入Cup.h,同时生成临时的Cup对象来调用Cup中的方法。

#import "Person.h"
#import "Cup.h"

@implementation Person

- (void)drink {
    Cup *c = [Cup new];
    id water = [c provideWater];
    [self sip:water];
}

- (void)sip:(id)water 
{
  // sip water
}

@end

方式二: .h Property

避免方式一直接在.m中应用导致耦合不清晰,可以将耦合的部分声明放在.h中,提高代码可读性

// Person.h
@interface Person:NSObject
@property (nonatomic, strong) Cup *cup;
- (void)drink;

@end

// Person.m
@implementation Person
- (void)drink {
    self.cup = [Cup new];
    id water = [self.cup provideWater];
    [self sip:water];
}

- (void)sip:(id)water
{
  // sip water
}

@end
版权声明:本文为博主原创文章,未经博主允许不得转载。

编写代码的艺术

一 . 为了统一公司软件开发设计过程的编程规范   二 . 使网站开发人员能很方便的理解每个目录 , 变量,控件,类,方法的意义   三 . 为了保证编写出的程序都符合相同的规范, 保证一致性、统一性...
  • dfshsdr
  • dfshsdr
  • 2016年10月09日 19:12
  • 654

编程的艺术门槛

编程是门艺术,这个说法由来已久。最近在朱赟的公众号(嘀嗒嘀嗒)读到一篇文章《设计是门逻辑学,然后才是美学》,文中作者漂洋过海追寻艺术,老师却说:“设计不是艺术!”。如果设计都不是艺术,那么编程还能是艺...
  • mindfloating
  • mindfloating
  • 2016年07月10日 23:07
  • 4799

读书报告之《修改代码的艺术》 (I)

《修改代码的艺术》,英文名《Working Effectively with Legacy Code》,中文翻译的文笔上绝对谈不上“艺术”二字,愧对艺术二字(当然译者不是这个意思)。书中第三部分不论是...
  • crylearner
  • crylearner
  • 2014年09月05日 00:20
  • 3201

组合语言之艺术7

附录一    SHELL 排序测试一、比较表:    第一章第一节中所提及的排序程式测试结果如下:  ┌──────┬─────────┬────────┐  │  项      目│        ...
  • dot99
  • dot99
  • 2001年08月04日 22:30
  • 779

修改代码的艺术 读书笔记(二,修改现有代码的四种技巧)

在没有Unit Tests的代码下如何更好的更改代码?四种方法: 1 Sprout Method,衍生方法 Class Experiment {   void existingMethod() {  ...
  • hongchangfirst
  • hongchangfirst
  • 2016年09月13日 13:33
  • 569

修改代码的艺术 读书笔记(一,修改代码的四种原因)

修改代码的四个主要原因: 1 增加一个功能 2 修复一个bug 3 improve design 4 优化资源利用,例如内存或时间。 这四种修改代码的原因和它影响系统的方面:           ...
  • hongchangfirst
  • hongchangfirst
  • 2016年09月13日 13:31
  • 658

代码重构的艺术

最近在看一些软件工程和构建方面的书籍。俗话说,书读百遍,其义自见,看得多了,自然也就有一些知识可以拿得出手分享一二了。由于我在写代码的过程中往往很追求代码的优雅和简洁,因此我着重阅读了代码重构方面的知...
  • kelekexiao123
  • kelekexiao123
  • 2016年10月16日 20:41
  • 743

数学之美 代码撩妹的艺术

微信小程序中使用贝塞尔曲线动态绘制心
  • JianZuoGuang
  • JianZuoGuang
  • 2017年12月19日 20:30
  • 184

编程就是一种艺术

唐纳德·克努特认为计算机既是一种科学,更是一种技术,他的一生几乎都花在了“艺术”上。 有评论认为《计算机程序设计的艺术》(The Art of Computer Programming)的作用与地位可...
  • jbjwpzyl3611421
  • jbjwpzyl3611421
  • 2010年10月25日 15:20
  • 720

可读代码的艺术(一):简化循环与逻辑

Chapter7 把控制流变得易读 条件语句中参数的位置: 一般原则:将变量放在左边,常量放在右边。更宽泛地说,将比较稳定的变量放在右边,变化较大的放在左边。 如 if ( length >...
  • bingduanlbd
  • bingduanlbd
  • 2015年01月05日 18:15
  • 1396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-C之代码艺术
举报原因:
原因补充:

(最多只允许输入30个字)