在viewController代碼里面
# pragma mark - life cycle
viewDidLoad
viewWillAppear
...
# pragma mark - UITableViewDelegate
methods
# pragma mark - CustomDelegate
methods
# pragma mark - event response
-(void)didTappedConfirmButton:(UIButton *)confirmButton
# pragma mark - private methods
methods
# pragma mark - getters and setters
-(UIButton *)confirmButton
-(UITableView *)tableView
1、所有的屬性都使用getter和setter
2、不要在viewDidLoad里面初始化你的view然后再add,這樣代碼就很難看。在viewDidload里面只做addSubview的事情,然后在viewWillAppear里面做布局的事情,在viewDidAppear里面做Notification的監(jiān)聽(tīng)之類(lèi)的事情,至于屬性的初始化,則交給getter去做。
比如這樣:
#pragma mark - life cycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.firstTableView];
[self.view addSubview:self.secondTableView];
[self.view addSubview:self.firstFilterLabel];
[self.view addSubview:self.secondFilterLabel];
[self.view addSubview:self.cleanButton];
[self.view addSubview:self.originImageView];
[self.view addSubview:self.processedImageView];
[self.view addSubview:self.activityIndicator];
[self.view addSubview:self.takeImageButton];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
CGFloat width = (self.view.width - 30) / 2.0f;
self.originImageView.size = CGSizeMake(width, width);
[self.originImageView topInContainer:70 shouldResize:NO];
[self.originImageView leftInContainer:10 shouldResize:NO];
self.processedImageView.size = CGSizeMake(width, width);
[self.processedImageView right:10 FromView:self.originImageView];
[self.processedImageView topEqualToView:self.originImageView];
CGFloat labelWidth = self.view.width - 100;
self.firstFilterLabel.size = CGSizeMake(labelWidth, 20);
[self.firstFilterLabel leftInContainer:10 shouldResize:NO];
[self.firstFilterLabel top:10 FromView:self.originImageView];
... ...
}
3、getter和setter全部都放在最后
因?yàn)橐粋€(gè)ViewController很有可能會(huì)有非常多的view,就像上面給出的代碼樣例一樣,如果getter和setter寫(xiě)在前面,就會(huì)把主要邏輯扯到后面去,其他人看的時(shí)候就要先劃過(guò)一長(zhǎng)串getter和setter,這樣不太好。然后要求業(yè)務(wù)工程師寫(xiě)代碼的時(shí)候按照順序來(lái)分配代碼塊的位置,先是life cycle,然后是Delegate方法實(shí)現(xiàn),然后是event response,然后才是getters and setters。這樣后來(lái)者閱讀代碼時(shí)就能省力很多。
4、每一個(gè)delegate都把對(duì)應(yīng)的protocol名字帶上,delegate方法不要到處亂寫(xiě),寫(xiě)到一塊區(qū)域里面去
比如UITableViewDelegate的方法集就老老實(shí)實(shí)寫(xiě)上#pragma mark - UITableViewDelegate。這樣有個(gè)好處就是,當(dāng)其他人閱讀一個(gè)他并不熟悉的Delegate實(shí)現(xiàn)方法時(shí),他只要按住command然后去點(diǎn)這個(gè)protocol名字,Xcode就能夠立刻跳轉(zhuǎn)到對(duì)應(yīng)這個(gè)Delegate的protocol定義的那部分代碼去,就省得他到處找了。
5、event response專(zhuān)門(mén)開(kāi)一個(gè)代碼區(qū)域
所有button、gestureRecognizer的響應(yīng)事件都放在這個(gè)區(qū)域里面,不要到處亂放。
6、關(guān)于private methods,正常情況下ViewController里面不應(yīng)該寫(xiě)
不是delegate方法的,不是event response方法的,不是life cycle方法的,就是private method了。對(duì)的,正常情況下ViewController里面一般是不會(huì)存在private methods的,這個(gè)private methods一般是用于日期換算、圖片裁剪啥的這種小功能。這種小功能要么把它寫(xiě)成一個(gè)category,要么把他做成一個(gè)模塊,哪怕這個(gè)模塊只有一個(gè)函數(shù)也行。
ViewController基本上是大部分業(yè)務(wù)的載體,本身代碼已經(jīng)相當(dāng)復(fù)雜,所以跟業(yè)務(wù)關(guān)聯(lián)不大的東西能不放在ViewController里面就不要放。另外一點(diǎn),這個(gè)private method的功能這時(shí)候只是你用得到,但是將來(lái)說(shuō)不定別的地方也會(huì)用到,一開(kāi)始就獨(dú)立出來(lái),有利于將來(lái)的代碼復(fù)用。