• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sunshinev
V2EX  ›  程序员

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

  •  
  •   sunshinev ·
    sunshinev · Nov 24, 2020 · 10656 views
    This topic created in 2169 days ago, the information mentioned may be changed or developed.

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

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

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

    Supplement 1  ·  Nov 24, 2020

    修正一下之前的Demo,想要的逻辑如下

    if x==1 {
    	A
    }elseif x==2 {
    	B
    }elseif x==3 {
    	A
            B
    }
    
    78 replies  •  2020-12-06 16:28:26 +08:00
    CommandZi
    CommandZi
    Nov 24, 2020❤️3
    1
    if 包含 1,走 A
    if 包含 2,走 B
    GM
    GM
    Nov 24, 2020❤️11
    2
    这已经很好的逻辑了,简单易懂,你还想优化成什么样?

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

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

    x == 3 的时候,两个判断都是 true,AB 都运行
    Rekkles
    Rekkles
    Nov 24, 2020❤️4
    3
    x == 1 ? A : (X == 2 ? B : AB)
    gggxxxx
    gggxxxx
    Nov 24, 2020❤️4
    4
    如果是我的话,换成 switch 就行了。我不会纠结什么最优解,语意明确最重要。
    chogath
    chogath
    Nov 24, 2020
    5
    (function (x) { const dict = { 1: 'A', 2: 'B', 3: 'AB' }; return dict[x] } )(3)
    swikis
    swikis
    Nov 24, 2020 via iPhone
    6
    策略模式
    secondwtq
    secondwtq
    Nov 24, 2020 via iPhone❤️7
    7
    这不是史上最坑面试题 fizzbuzz 么……
    别问了,99.5%的程序员都不会的
    jadehare
    jadehare
    Nov 24, 2020
    8
    if(n / 2 >= 1) B;
    if(n%2 == 1) A;
    icql
    icql
    Nov 24, 2020❤️1
    9
    逻辑多的话可以用质数乘积,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
    Mutoo
    Nov 24, 2020
    10
    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) {
    zm8m93Q1e5otOC69
    zm8m93Q1e5otOC69
    Nov 24, 2020 via Android
    11
    @Rekkles 过分了
    across
    across
    Nov 24, 2020
    12
    上面那个位运算 if 的已经被占了,这个应该是最简洁明了的。

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

    自然的表达即“本来是什么意思就表达什么”。
    zjsxwc
    zjsxwc
    Nov 24, 2020
    15
    $f = [
    1 => (){A();},
    2 => (){B();},
    3 => (){A();B();},
    ];

    $f[x]();
    xiangyuecn
    xiangyuecn
    Nov 24, 2020❤️1
    16
    看眼神 😏😏😏😏😏😏😏😏

    if(x!=2){
    A()
    }else if(x!=1){
    B()
    }
    xiangyuecn
    xiangyuecn
    Nov 24, 2020❤️1
    17
    #16 应该不要 else

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

    if(x!=1){
    B()
    }
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    18
    @xiangyuecn 厉害啊,这脑回路
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    19
    @GM 能用位运算的都是大神
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    20
    @Mutoo 大神大神
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    21
    @Rekkles 三元运算符👍,go 木有
    DoubleShut
    DoubleShut
    Nov 24, 2020
    22
    花里胡哨的,switch case 不行吗?
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    23
    @secondwtq 学习了,推荐大家可以看下 簡單的 FizzBuzz 藏有 深度(google 面試題)
    yaoweilei
    yaoweilei
    Nov 24, 2020
    24
    go="A" if x==1 else "B" if x==2 else "C"
    Lemeng
    Lemeng
    Nov 24, 2020
    25
    文明人讲究优雅。
    leo108
    leo108
    Nov 24, 2020
    26
    switch (x) {
    case 3:
    // no break
    case 1:
    A;
    if (x === 1) {
    break;
    }
    case 2:
    B;
    break;
    }
    antiquezzz
    antiquezzz
    Nov 24, 2020
    27
    兄弟不会真的以为会写 FizzBuzz 很难得吧
    rainman777
    rainman777
    Nov 24, 2020
    28
    ```
    if (n & 0x01)
    fun_a();
    if (n & 0x02)
    fun_b();

    ```
    hws8033856
    hws8033856
    Nov 24, 2020❤️1
    29
    为什么你们包括 LZ 都不按题目要求来?
    不是=3 才执行 AB 么?
    你们怎么都是除=1 和=2 以外的其他值都执行 AB ?
    Jooooooooo
    Jooooooooo
    Nov 24, 2020
    30
    最优的解法最容易看懂
    shenjies88
    shenjies88
    Nov 24, 2020❤️2
    31
    这就是一个很简单的问题,切勿过度设计过度猜疑,if 或者 switch 即可
    marcong95
    marcong95
    Nov 24, 2020
    32
    @hws8033856 #29 因为楼主的提供的样例里面就是 else { AB },那么问题来了,到底是 else AB 呢,还是=3 AB 呢,如果 x = 4 呢,楼主这题似乎已经有这个坑了

    若 x 属于 { 1, 2, 3 },那位运算+短路求值看着还挺舒服

    x & 1 && A()
    x & 2 && B()
    northisland
    northisland
    Nov 24, 2020
    33
    一条搞定,但是很鬼畜,可读性不高。
    ```
    #include <ciso646>

    x&0x01 and A() or y&0x02 and B();
    ```
    我宁愿展开:
    if (x==1) A()
    else if (x==2) B()
    else if (x==3) {A(); B();}
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    34
    其实看到很多位运算方案,但是总觉得位运算看起来很短,但是不是很容易理解~可能我还没找到窍门
    lloydsheng
    lloydsheng
    Nov 24, 2020
    35
    如果没有性能问题,写的越清晰易懂越好
    terence4444
    terence4444
    Nov 24, 2020 via iPhone
    36
    按 bit 开关判断即可
    1A 2B 4C 8D 16F
    zlowly
    zlowly
    Nov 24, 2020
    37
    那要看不同场景下优雅是怎么定义了。如果这是在一个追求性能的的核心代码 /引擎之类的里,肯定是有优化空间;如果只是个普通代码片段,楼主本身的代码就没什么问题;如果是在业务逻辑代码里,可考虑的地方就多了,常见的是日后考虑调整或扩展=4=5 之类情况,有可能是更复杂的 ABCBA 执行情况等等,为了可读性和可维护性这时候上模式设计都是可以的。
    hws8033856
    hws8033856
    Nov 24, 2020
    38
    @marcong95 所以我才说“包括 LZ” 都不按题目要求来
    只论代码长短,应该没有比你这个更短的了
    不过我始终认为所谓代码的优雅,应该更多要看重代码的可读性
    你这里用逻辑运算符来替代分支,就是很严重的破坏可读性,不优雅
    lx0758
    lx0758
    Nov 24, 2020
    39
    位运算
    artikle
    artikle
    Nov 24, 2020❤️4
    40
    if(x==1||x==3)
    A();
    if(x==2||x==3)
    B();
    sunshinev
    sunshinev
    OP
    Nov 24, 2020
    41
    @artikle 其实我现在用的就是你的方案
    vitoliu
    vitoliu
    Nov 24, 2020
    42
    用模式来做处理不是更好吗,推荐组合模式
    Kamiyu0087
    Kamiyu0087
    Nov 24, 2020❤️1
    43
    when (x) {
    1 -> A()
    2 -> B()
    3 -> {
    A()
    B()
    }
    }
    marcong95
    marcong95
    Nov 24, 2020
    44
    @hws8033856 #38 刚刚的确看漏了你的“包括”,

    我的方案只是代码本身有蜜汁对称性,看着爽。的确是牺牲了可读性,以及没有处理 x 在 123 以外的情况
    hst001
    hst001
    Nov 24, 2020
    45
    你这问题,还刚好 123,就是设计考位运算的题吧
    cambria
    cambria
    Nov 24, 2020
    46
    如果 x 取值只有 1,2,3 的话可以这么写( python):

    if (x % 2):
    A()
    if (x // 2):
    B()
    supuwoerc
    supuwoerc
    Nov 24, 2020
    47
    x==1?a:x==2?b:x==3?a&b:null;
    wnpllrzodiac
    wnpllrzodiac
    Nov 24, 2020 via Android
    48
    位操作?最低位表示 a 第二位表示 b.
    imn1
    imn1
    Nov 24, 2020
    49
    x&1: A
    (x>>1)&1: B
    vhysug01
    vhysug01
    Nov 24, 2020 via iPhone
    50
    查表
    skrskrskrskr
    skrskrskrskr
    Nov 24, 2020
    51
    这一看就是工作不饱和
    xumng123
    xumng123
    Nov 24, 2020 via iPhone
    52
    查表即可
    ychost
    ychost
    Nov 24, 2020
    53
    Map funcMap = {1:A,2:B,3:A&B}
    lovecy
    lovecy
    Nov 24, 2020
    54
    let funcMap = new Map([[1, func A], [2, func B], [3, func C]]);
    funcMap.get(x)();
    manymobi
    manymobi
    Nov 24, 2020
    55
    我觉得 你在考虑思想, 上面这个问题太局限了, 可以看看 spirng HttpMessageConverter
    woahishui
    woahishui
    Nov 24, 2020 via Android
    56
    策略模式加命令模式
    nocrush
    nocrush
    Nov 24, 2020
    57
    搞一个 map
    phpIsNumberOne
    phpIsNumberOne
    Nov 24, 2020
    58
    goto
    jinliming2
    jinliming2
    Nov 24, 2020
    59
    支持 Excel 吗?
    =SWITCH(A1, 1, "A", 2, "B", 3, "AB", "other")
    yeyu1989
    yeyu1989
    Nov 24, 2020
    60
    decode(x,1,A,2,B,3,AB)
    bbxiong
    bbxiong
    Nov 24, 2020
    61
    if x == 1 then
    a
    elseif x == 2 then
    b
    elseif x == 3 then
    a b
    end


    我觉得越简单,用简单清晰的代码写出来就行了
    iceheart
    iceheart
    Nov 25, 2020 via Android
    62
    老老实实写,别搞花样
    dragonbuf
    dragonbuf
    Nov 25, 2020
    63
    1 A B C 的逻辑封装 helper
    ALogicHelper{}
    BLoginHelper{}
    CLoginHelper{}

    2 根据用途挑选 helper 组成 handler

    3 handler 注册进 factory
    DemoFatoryHandlerRegistry{1:AHandler, 2:Bhandler,3ABHandler}

    4 根据 id 获得 handler 接口
    DemoFactory::fromId(int id)->getHandler():HandlerInterface

    5 根据接口处理数据
    HandlerInterface->dosomething();
    someonedeng
    someonedeng
    Nov 25, 2020
    64
    一通下来,还是最朴素的最优雅。没有性能问题就不搞花的了,代码是给人看的
    diegozhu
    diegozhu
    Nov 25, 2020
    65
    1. 转 map:
    {1: "A", 2: "B", 3: "AB"}[X]
    2.
    hive
    hive
    Nov 25, 2020
    66
    @sunshinev #18 16 、17 的回答完全不符合题意啊,楼主你自己有没有搞清楚...
    13670515509
    13670515509
    Nov 25, 2020
    67
    js
    let obj = { 1: [A], 2: [B], 3: [A, B] }
    obj[x] && Array.isArray(obj[x]) && obj[x].forEach(fn => {typeof fn === 'function' && fn()})
    windsound
    windsound
    Nov 25, 2020
    68
    @xiangyuecn 卧槽,优秀。
    slipper
    slipper
    Nov 25, 2020
    69
    如果以后还会加其他的判断情况,考虑扩展性,可以使用 visitor pattern,如果没有,直接写就很好了。
    shm7
    shm7
    Nov 25, 2020
    70
    其他值怎么处理,不考虑吗?
    crazyhorse
    crazyhorse
    Nov 25, 2020
    71
    function run(x) {
    const runner = [{
    x: [1,2],

    }]

    if(runA.indexOf)
    }
    crazyhorse
    crazyhorse
    Nov 25, 2020
    72
    //有后续扩展(更多条件和要执行的方法)
    function a() {console.log('a')}
    function b() {console.log('a')}
    function run(x) {
    const runners = [{
    x: [1,2],
    func: a,
    },{
    x: [2,3],
    func: b,
    }]

    runners.forEach((runner) => {
    if(runner.x.indexOf(x) !== -1)
    runner['func']();
    })
    }

    //固定 ab 但是条件有后续扩展
    function run(x) {
    const runA = [1,2];
    const runB = [2,3];

    if(runA.indexOf(x) !== -1)
    a();

    if(runB.indexOf(x) !== -1)
    a();
    }
    raaaaaar
    raaaaaar
    Nov 25, 2020 via Android
    73
    分支或者查表,看应用场景吧。
    donaldsu
    donaldsu
    Nov 25, 2020
    74
    想到两个,不过都已经被占了😂
    1 、mask 位运算
    2 、switch case
    xiaoliu926
    xiaoliu926
    Nov 25, 2020
    75
    @Kamiyu0087 kotlin 大法好
    RickyC
    RickyC
    Nov 25, 2020
    76
    果然你们后端都是逻辑狂人
    SmiteChow
    SmiteChow
    Nov 26, 2020
    77
    你提到的才是最优雅的,其他都是 tricky
    northisland
    northisland
    Dec 6, 2020 via Android
    78
    x&0x01 and A() and false or y&0x02 and B() and false
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1268 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 176ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    ♥ Do have faith in what you're doing.