您好,登錄后才能下訂單哦!
無論在iPhone開發還是學習的過程中都會看到一些不是很理想的代碼,不可否認自己也在不斷“貢獻”著這類代碼。面對一些代碼的“壞味道”,重構顯然是個有效的解決途徑。《iPhone開發重構》系列就想總結和補充iPhone開發中經歷的一些重構,其間可能會引用一些開源以及實際項目的代碼,本著對技術的探求,冒昧之處還請作者多多見諒。
代碼重復是一個比較明顯的“壞味道”,提取公用的方法就是解決的途徑之一。iPhone開發中,使用UITableView的時候就有如下一段“經典”的模板代碼,因為這是項目模板自動生成的,所以很多人就自然接受了。但隨著越來越多地通過copy&paste在一個項目中使用這段代碼,大家是否有些采取行動的壓力呢?好吧,我們就從這“動刀”吧!
重構前:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"wikiHowCell";
UITableViewCell *cell = (WHTableViewCell *)[tv dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[WHTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.title = [[featuredArticles objectAtIndex:indexPath.row] objectForKey:@"title"];
return cell;
}
對此我們可以提取個公共的方法,并放置在一個適當的地方。UITableViewCell的Category應該是一個比較好的去處。重構后提取的方法以及實際調用的代碼如下:
重構后:
@implementation UITableViewCell(Cache)
+ (id)dequeOrCreateInTable:(UITableView*)tableView withId: (NSString*)reuseId andStyle:(UITableViewCellStyle)style {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:reuseId] autorelease];
}
return cell;
}
@end
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [UITableViewCell dequeOrCreateInTable:tableView withId:@"wikiHowCell" andStyle:UITableViewCellStyleDefault];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.title = [[featuredArticles objectAtIndex:indexPath.row] objectForKey:@"title"];
return cell;
}
從代碼量衡量,僅從此處可能感覺重構前后變化不大,甚至還會略有增多。但如果考慮到公用方法的多次使用產生的“效益”,付出的努力應該是值當的!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。