如何完美的消除 if...else..或者 switch 这种代码,求大神给个思路。

2016-06-30 10:55:29 +08:00
 hyyy

举个例子,在 iOS 开发中,经常会遇到在设置 tableViewCell 时需要根据 indexPath 来设置不同 cell ,一般代码可能会是下面这个样子:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    
    // 设置第一种 cell
    if (indexPath.section == 3 && indexPath.row != 2) {
        //  cell 代码
        return cell;
    }
    
    // 设置第二种 cell
    if (indexPath.section == 3 && indexPath.row == 2) {
        // cell 代码
        return cell;
    }
    
    // 设置其他 cell
    return cell;
}

当然,举的例子比较简单, if...else...也不多,这种场景在开发中很多,一般使用 if...else...或者 switch 时会使代码非常多,求大神们能不能给个思路,遇到这种场景尽量不要出现这种嵌套代码,最好给个实例膜拜膜拜 ^_^

16924 次点击
所在节点    程序员
86 条回复
eimsteim
2016-07-01 11:13:27 +08:00
@ihuotui 这跟责任链有毛线关系,学设计模式都学傻了吧
coa
2016-07-01 11:57:52 +08:00
@lingoerer 学习了。。请教下这种是不是得把所有 ViewModel 都放同一数组了,不同 Cell 连续存放倒还好办,如果是交叉着放还能用这办法吗?
yangff
2016-07-01 12:12:00 +08:00
@arakashic 编译器会选择合理的方式来生成代码
bobuick
2016-07-01 12:12:02 +08:00
模式匹配吧, rust 或 haskell 那种模式匹配方式,不过完全杜绝是不可能的, 不过可以大部分解决了
nozama
2016-07-01 21:23:14 +08:00
这种情况 mvvm 吧, datasource 里面只存放一堆抽象的 cellViewModel ,并通过工厂来获得具体的 cell ,工厂可以用数据来驱动。
Balthild
2016-07-01 22:17:23 +08:00
全部用 goto

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/289282

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX