ios - iPhone开发重构:提取方法以调整抽象层次

写代码有时和说话一样,要体现层次感,可能是首先罗列要点,然后再逐点 细化。但如果时而说要点,时而谈细节,就会造成听者理解上的障碍。如下的代 码就会有这样的一个问题:

重构前:

- (UITableViewCell *)tableView:(UITableView *)tableView 

cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 switch 

(indexPath.section) {
 case 0:
 return [[preferences 

objectAtIndex:indexPath.row] cell];
 break;
 case 1:
 {
 

static NSString *CellIdentifier = @"wikiHowAboutCell";
 

UITableViewCell *cell = (UITableViewCell *)[tableView 

dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == 

nil) {
 cell = [[[UITableViewCell alloc] initWithFrame.:CGRectZero 

reuseIdentifier:CellIdentifier] autorelease];
 }
 

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
 

if (indexPath.row == 0) {
 cell.text = @"About wikiHow 

App";
 } else {
 cell.text = @"wikiHow Tips";
 

}
 return cell;
 }
 break;
 }
 return nil;
 }

 

其中,Case 0和Case 1之间严重失衡,Case 0隐藏了创建的细节,而Case 1 则是将其暴露无遗。抽象层次的差别造成了平衡感地缺少以及理解代码时的“颠 簸”。重构后代码如下:

重构后:

- (UITableViewCell *)tableView:(UITableView *)tableView 

cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewCell 

*cell = nil;
 NSUInteger sectionIndex = indexPath.section;
 if 

(sectionIndex == 0) {
 cell = [[preferences 

objectAtIndex:indexPath.row] cell];
 }
 else if(sectionIndex == 

1) {
 cell = [self prepareCellForTable: tableView 

withRowIndex:indexPath.row];
 }
    return cell;
 }
- 

(UITableViewCell *)prepareCellForTable: (UITableView *) tableView 

withRowIndex:(NSUInteger)index {
 static NSString *CellIdentifier = 

@"wikiHowAboutCell";
    UITableViewCell *cell = 

(UITableViewCell *)[tableView 

dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == 

nil) {
 cell = [[[UITableViewCell alloc] initWithFrame.:CGRectZero 

reuseIdentifier:CellIdentifier] autorelease];
 }
 

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
 

if (index == 0) {
 cell.text = @"About wikiHow App";
 

} else {
 cell.text = @"wikiHow Tips";
 }
 return 

cell;
 }

这样,理解代码时候如果只关注梗概就可以关注- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath,如果需要知道创建Cell的细节就可以看下- (UITableViewCell *)prepareCellForTable: (UITableView *) tableView withRowIndex: (NSUInteger)index。两个不同抽象层次上的函数形成的是一种代码的层次感以 及平衡感。

来源: http://blog.csdn.net/lbj05/archive/2011/04/15/6326681.aspx

posted on 2014-09-05 00:30  恒山之阳  阅读(253)  评论(0编辑  收藏  举报

导航