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

17106 次点击
所在节点    程序员
86 条回复
wander2008
2016-06-30 10:59:19 +08:00
不可能
ourcubk
2016-06-30 10:59:51 +08:00
不可能
chairuosen
2016-06-30 11:02:33 +08:00
switch 可以打表,简单 if 也可以
zhuangzhuang1988
2016-06-30 11:02:49 +08:00
1. 表驱动法(看: 代码大全)
2. 使用 match(看: F#, Scala)'
3. 使用类+继承(看: 设计模式)
Jabin
2016-06-30 11:03:11 +08:00
封装 工厂
ipconfiger
2016-06-30 11:06:31 +08:00
该用则用, if else 是基础逻辑, 如果不是深层次嵌套的话, 最好不要作一些奇技淫巧出来
hyyy
2016-06-30 11:07:12 +08:00
@wander2008
其实我觉得这是一个有趣的话题^_^
kera0a
2016-06-30 11:10:24 +08:00
SEL methods[][3] = {
{ @selector(getFirstCell:) },
{ @selector(getSecondCell:) },
{ @selector(getThirdCell:) },
};

SEL sel = methods[indexPath.section][indexPath.row];
[self performSelector:sel withObject:indexPath];
hasbug
2016-06-30 11:14:16 +08:00
这能避免吗? 除非不做判断···
stcasshern
2016-06-30 11:16:05 +08:00
这个不能吧,印象中这个是最基础得
ma125125t
2016-06-30 11:19:24 +08:00
目前的 tableView 就是这么艹蛋。但已经有很多开源的方法解决这个问题了(想象一下一百种 cell ,分为数十个 section 和 row 的情况)。去找找吧。
michaelye1988
2016-06-30 11:23:45 +08:00
我认为这种情况下用 if else 或者 switch 是非常合理的,至少代码可读性还是在的。如果非要套用一些设计模式什么的,维护起来就痛苦了。
chmlai
2016-06-30 11:24:15 +08:00
这个简单, 用数据驱动就清晰多了
spongebobsun
2016-06-30 11:24:39 +08:00
@kera0a 学习了
mygirl
2016-06-30 11:25:06 +08:00
@ma125125t 几十种的 Cell 这应该是属于不合理的设计吧?
chunqiuyiyu
2016-06-30 11:27:11 +08:00
完美消除是不可能的,不然这几个关键字就不会出现。重要的是理清逻辑,不要嵌套过深。
rekulas
2016-06-30 11:27:43 +08:00
看不懂 两种都是返回 cell 条件为什么不整合在一起
8bit
2016-06-30 11:31:19 +08:00
查表,代码大全
subpo
2016-06-30 11:34:25 +08:00
能只写 if 不写 else 不错了
harry890829
2016-06-30 11:37:08 +08:00
这种平级的 if...else...已经不错了,我刚接手了一个代码,到手的时候 4-5 层 if 结构嵌套,全都带 else ,因为需求的关系,我现在又在里面加了两层 if..else...结构,我已经恶心死了

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

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

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

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

© 2021 V2EX