请教一个优雅的逻辑方案,=1 走 A ,=2 走 B, =3 走 AB 两个,怎么写比较好?不限语言

2020-11-24 11:58:57 +08:00
 sunshinev

请教一个最优逻辑方案,=1 走 A,=2 走 B, =3 走 AB 两个,怎么写比较好?

if x==1 {
	A
}elseif x==2 {
	B
}else {
	A
    B
}

要求如上,有优雅的写法吗?

8480 次点击
所在节点    程序员
78 条回复
CommandZi
2020-11-24 12:04:35 +08:00
if 包含 1,走 A
if 包含 2,走 B
GM
2020-11-24 12:05:06 +08:00
这已经很好的逻辑了,简单易懂,你还想优化成什么样?

如果只是单纯想减少代码行数(然鹅可读性会变差)的话,考虑位运算:

if x & 1 {
A
}
if x & 2 {
B
}

x == 3 的时候,两个判断都是 true,AB 都运行
Rekkles
2020-11-24 12:06:24 +08:00
x == 1 ? A : (X == 2 ? B : AB)
gggxxxx
2020-11-24 12:06:45 +08:00
如果是我的话,换成 switch 就行了。我不会纠结什么最优解,语意明确最重要。
chogath
2020-11-24 12:10:29 +08:00
(function (x) { const dict = { 1: 'A', 2: 'B', 3: 'AB' }; return dict[x] } )(3)
swikis
2020-11-24 12:12:40 +08:00
策略模式
secondwtq
2020-11-24 12:13:19 +08:00
这不是史上最坑面试题 fizzbuzz 么……
别问了,99.5%的程序员都不会的
jadehare
2020-11-24 12:14:34 +08:00
if(n / 2 >= 1) B;
if(n%2 == 1) A;
icql
2020-11-24 12:25:27 +08:00
逻辑多的话可以用质数乘积,A=2,B=3,C=5,x%A==0 执行 A,x%B==0 执行 B,x%C==0 执行 C,例如 x=6,就会执行 AB,x=30 就会执行 ABC,对外用枚举封装需要的逻辑组合的质数乘积😄
Mutoo
2020-11-24 12:28:01 +08:00
A = 1
B = 2
C = 4
D = 8

Input = A | B // equals 3

if (Input & A) /* DO A */
if (Input & B) /* DO B */
if (Input & C) /* DO C */
if (Input & D) /* DO D */

将 ABCD 编码成 2 的 n 次方,然后可以用 | 运算来组合配置项,用 & 运算来检查配置项,

这在 C 编程中很常用,例如:

if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) != 0) {
uselessVisitor
2020-11-24 12:31:30 +08:00
@Rekkles 过分了
across
2020-11-24 12:46:23 +08:00
上面那个位运算 if 的已经被占了,这个应该是最简洁明了的。

从 C 升级到 C++折腾版后,还有一个 Map<fnPtr,fnPtr>(Condition,Action),就是判断条件比较复杂时,挨个遍历 map 执行 condition,执行 action···· 按简单数值比较场景来说就不用了。
mooczz
2020-11-24 12:52:00 +08:00
逻辑与运算,刚好是 1 10 11
geelaw
2020-11-24 12:59:09 +08:00
这取决于 1 、2 、3 的含义:如果这是一个位映射枚举,则用位运算 #2 是自然的解法;如果这不具有位映射枚举的含义,则楼主本来的写法自然。

自然的表达即“本来是什么意思就表达什么”。
zjsxwc
2020-11-24 13:01:47 +08:00
$f = [
1 => (){A();},
2 => (){B();},
3 => (){A();B();},
];

$f[x]();
xiangyuecn
2020-11-24 13:06:10 +08:00
看眼神 😏😏😏😏😏😏😏😏

if(x!=2){
A()
}else if(x!=1){
B()
}
xiangyuecn
2020-11-24 13:06:54 +08:00
#16 应该不要 else

if(x!=2){
A()
}

if(x!=1){
B()
}
sunshinev
2020-11-24 13:19:11 +08:00
@xiangyuecn 厉害啊,这脑回路
sunshinev
2020-11-24 13:19:23 +08:00
@GM 能用位运算的都是大神
sunshinev
2020-11-24 13:20:09 +08:00
@Mutoo 大神大神

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

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

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

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

© 2021 V2EX