首先感谢文章http://www.jianshu.com/p/032343012159 对作者的思想改善。
每个程序员都希望自己写的代码变得低耦合,高内聚;每个程序员都希望自己写的代码都有一个很好的维护性与可读性。
有一种代码,当拿到手之后你根本就不知道如何下手。代码的臃肿不堪让人感觉厌倦。导致可读性,可维护性极差。并且,冗余的代码沉淀积累,让代码重用性变得很低。所以,关注代码的质量,是每一位优秀的程序员应该所考虑到的问题。
本文依据iOS中TableView的代理与数据源的方法,来对控制器瘦身,希望通过此文,提高代码质量,改善自身写代码的思想方式。
在iOS开发中,最常用的就是TableView列表。那么,很多程序员都会在控制器里面调用其代理(数据源)的方法,导致控制器变得非常臃肿。到问题出现的时候,倒霉就开始蔓延。
首先,我们创建一个类EMDSWithDlg,继承于NSObject。既然要生成tableview,所以数据源是不能少的,所以,在类里面创建一个数组dataSource。以及要生成的栏sections,与重用cell的标识符identifier。
构造一个初始化方法:
- (instancetype)initWithDataSource:(NSArray *)dataSource cellIdentifier:(NSString *)cellIdentifier cellType:(EMCellType)cellType;
随后,通过此构造方法传递的变量,在.m文件中构造我们想要的tableview:
- (instancetype)initWithDataSource:(NSArray *)dataSource cellIdentifier:(NSString *)cellIdentifier cellType:(EMCellType)cellType{
if (self = [super init]) {
self.dataSource = dataSource;
self.identifier = cellIdentifier;
}
return self;
}
生成一个方法,代表根据当前的indexpath获取数据:
- (id)dataAtIndexPath:(NSIndexPath *)indexpath{
return _dataSource[indexpath.row];
}
随后,实现DataSource与Delegate方法
#pragma mark --TableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.dataSource.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:_identifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:_identifier];
}
cell.textLabel.text = [self dataAtIndexPath:indexPath];
return cell;
}
以及其代理方法。
最后,我们在控制器中调用此类,即可完成tableview的搭建:
EMDSWithDlg *emDataSource= [[EMDSWithDlg alloc]initWithDataSource:arr cellIdentifier:@"cell" cellType:EMCellTypeDefault];
self.tableView.dataSource = emDataSource;
self.tableView.delegate = emDataSource;
self.dataSource = emDataSource;
这样,我们的控制器内的代码,变得简单并且易于分析。代码的耦合性也变得很低。何乐而不为呢。