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

16921 次点击
所在节点    程序员
86 条回复
EAimTY
2016-06-30 18:37:28 +08:00
不可能的,不论用什么方法代替,底层肯定还会是 if else
adrianzhang
2016-06-30 18:50:00 +08:00
结构化语言之前,都用 goto ,汇编里见 jump 更多。
xwing
2016-06-30 20:06:43 +08:00
命令链模式。
hrong
2016-06-30 21:17:30 +08:00
表驱动,策略模式。

有人说什么反射,想想反射里面有多少个 if/else 就知道用反射有多么的得不偿失
cocoaChina
2016-06-30 21:20:30 +08:00
这种判断逻辑必须有,但逻辑内实现却可以瘦身,尽量多用 switch
powergx
2016-06-30 21:54:57 +08:00
cpu 晶体管可是只有通河短两种情况, lz 竟然说不用 if
rashawn
2016-06-30 22:16:46 +08:00
最下面都是一样的吧 不用这个是不是能跑的快一点
cheng4741
2016-06-30 22:55:42 +08:00
@EAimTY 并不会,这种情况用表或数组的话,再底层也不会有 if else
aias
2016-06-30 23:20:13 +08:00
@mygirl Hello ,宁波的同学,又看到你了!招人还顺吗?
peneazy
2016-06-30 23:23:27 +08:00
我只知道 js 怎么消除这种东西。利用多态性,比如原型继承,把每一种可能封装在原型里,构造函数直接调用。看看设计模式吧,有至少两种模式能大幅度减少判断语句。
holy_sin
2016-06-30 23:41:09 +08:00
问题的核心就是区分出不同类型的 cell 要如何渲染。如果在 vc 里做,那么 collectionView 对应的所有 datasource 和 delegate 都需要分别写一套区分方法。所以比较好的方法是在构造数据源的时候,指定好每一种 cell 如何显示。由于 cell 信息可能会比较多,所以就衍生出来用 cellViewModel 来管理这些信息,这就是数据驱动的意思吧。当 cell 的排列关系需要改动的时候,只需要修改构造数据源的地方。其实就是 @lingoerer 所说的做法。
hinkal
2016-06-30 23:46:59 +08:00
利用多态减少 if else 才是正解,否则说明上下文中 if else 不应该被消除。
jackisnotspirate
2016-06-30 23:57:51 +08:00
tutuge
2016-07-01 00:02:13 +08:00
模板方法解决, cell 基类,传入 index 等参数,让 cell 不同子类自己处理。也就是多态=。=
yangff
2016-07-01 01:24:05 +08:00
@zhuangzhuang1988 讲道理 switch 本来就是 jump table ,编译器还会把它塞到 ro 的段上,安全性还更好些
arakashic
2016-07-01 02:14:40 +08:00
@yangff 实际上编译器并不总是把 switch 生成成 jump table 。
wangyifei6817
2016-07-01 09:22:04 +08:00
这里不谢 也要写到别的地方 换个地方恶心而已
miaotaizi
2016-07-01 09:32:05 +08:00
策略模式?
wander2008
2016-07-01 10:19:31 +08:00
@hyyy 是的,逻辑层面确实不行。
搞设计模式可以。 java
wmhx
2016-07-01 10:54:39 +08:00
java 的工厂模式. 参见 jfinal

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

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

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

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

© 2021 V2EX