如何完美的消除 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 时会使代码非常多,求大神们能不能给个思路,遇到这种场景尽量不要出现这种嵌套代码,最好给个实例膜拜膜拜 ^_^

16894 次点击
所在节点    程序员
86 条回复
woshicixide
2016-06-30 11:39:50 +08:00
多态
jason19659
2016-06-30 11:42:46 +08:00
cell = indexPath.section == 3 ? a : indexPath.row == 2 ? b : c
zhicheng
2016-06-30 11:46:00 +08:00
静态结构这样写没问题,把 3 和 2 消除就行,用 USER_SECTION 常量定义一下。
动态结构用 model 来判断。
fatedier
2016-06-30 12:04:08 +08:00
简单工厂模式 + 反射,可以实现根据不同的字符串执行不同业务逻辑,但是不适合用这个替换掉所有的 if-else ,不然就是过度设计了。

之前用 c++ 写过一个例子: http://blog.fatedier.com/2015/03/04/decoupling-by-using-reflect-and-simple-factory-pattern-in-cpp/
lingoerer
2016-06-30 12:25:44 +08:00
1 :[CellViewModel] -> 把每一个 Cell 的 ViewModel 定义出来,放进数组
2 : cellViewModel.identifier, cell.render(cellViewModel) -> 每个 ViewModel 定义自己要用什么 Cell 来展示, dequeue 的时候出不同的 Cell ,然后 Cell 自己对应着绑 UI
3 : tableView 的回调中直接一行同样的代码把 Cell 弄出来

当然,前面还有个:
0 :把你要显示的 Model 的内容 map 成 CellViewModel 的数组
ibigbug
2016-06-30 12:31:32 +08:00
muller
2016-06-30 12:34:48 +08:00
策略模式
davisz
2016-06-30 12:36:02 +08:00
do {
if (false) break;
}while(0);
ilotuo
2016-06-30 12:37:31 +08:00
这样?
```java
cell = indexPath.section == 3 ? CellFactory.build(...) : indexPath.row == 2 ? CellFactory.build(...): null;
```
xwartz
2016-06-30 13:17:36 +08:00
map
mdluo
2016-06-30 13:24:43 +08:00
分支存数组,条件用位运算
ihuotui
2016-06-30 13:31:24 +08:00
责任连模式,差不多
hantsy
2016-06-30 13:33:01 +08:00
State 模式
twoyuan
2016-06-30 13:42:16 +08:00
首先应该消灭的不是 Magic Number 吗……
sutra
2016-06-30 13:46:55 +08:00
Map
youyongsong
2016-06-30 14:00:32 +08:00
pattern match
0x5e
2016-06-30 14:01:41 +08:00
swift 可能会稍微简化点
let path = (indexPath.section, indexPath.row)
switch(path) {
case (0, 0):
//xxxx
case (0, 1):
//xxxx
}
JasperYanky
2016-06-30 14:02:42 +08:00
model 决定 view controller 层不关心数据 只负责传递
fhefh
2016-06-30 14:06:15 +08:00
loveuqian
2016-06-30 14:09:07 +08:00
之前也是这样判断行数,后来改判断模型 title 了
因为判断行数,一不小心,在第 0 行前面加一行,你这所有判断都要重写啊。。

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

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

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

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

© 2021 V2EX