跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个优雅的逻辑方案,=1 走 A ,=2 走 B, =3 走 AB 两个,怎么写比较好?不限语言
未分類
2020 年 11 月 26 日

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

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

資深大佬 : sunshinev 0

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

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

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

大佬有話說 (77)

  • 資深大佬 : CommandZi

    if 包含 1,走 A
    if 包含 2,走 B

  • 資深大佬 : GM

    这已经很好的逻辑了,简单易懂,你还想优化成什么样?

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

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

    x == 3 的时候,两个判断都是 true,AB 都运行

  • 資深大佬 : Rekkles

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

  • 資深大佬 : gggxxxx

    如果是我的话,换成 switch 就行了。我不会纠结什么最优解,语意明确最重要。

  • 資深大佬 : chogath

    (function (x) { const dict = { 1: ‘A’, 2: ‘B’, 3: ‘AB’ }; return dict[x] } )(3)

  • 資深大佬 : swikis

    策略模式

  • 資深大佬 : secondwtq

    这不是史上最坑面试题 fizzbuzz 么……
    别问了,99.5%的程序员都不会的

  • 資深大佬 : jadehare

    if(n / 2 >= 1) B;
    if(n%2 == 1) A;

  • 資深大佬 : icql

    逻辑多的话可以用质数乘积,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

    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) {

  • 資深大佬 : beichenhpy

    @Rekkles 过分了

  • 資深大佬 : across

    上面那个位运算 if 的已经被占了,这个应该是最简洁明了的。

    从 C 升级到 C++折腾版后,还有一个 Map<fnPtr,fnPtr>(Condition,Action),就是判断条件比较复杂时,挨个遍历 map 执行 condition,执行 action···· 按简单数值比较场景来说就不用了。

  • 資深大佬 : mooczz

    逻辑与运算,刚好是 1 10 11

  • 資深大佬 : geelaw

    这取决于 1 、2 、3 的含义:如果这是一个位映射枚举,则用位运算 #2 是自然的解法;如果这不具有位映射枚举的含义,则主本来的写法自然。

    自然的表达即“本来是什么意思就表达什么”。

  • 資深大佬 : zjsxwc

    $f = [
    1 => (){A();},
    2 => (){B();},
    3 => (){A();B();},
    ];

    $f[x]();

  • 資深大佬 : xiangyuecn

    看眼神

  • 資深大佬 : xiangyuecn

    #16 应该不要 else

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

    if(x!=1){
    B()
    }

  • 主 資深大佬 : sunshinev

    @xiangyuecn 厉害啊,这脑回路

  • 主 資深大佬 : sunshinev

    @GM 能用位运算的都是大神

  • 主 資深大佬 : sunshinev

    @Mutoo 大神大神

  • 主 資深大佬 : sunshinev

    @Rekkles 三元运算符

  • 資深大佬 : DoubleShut

    花里胡哨的,switch case 不行吗?

  • 主 資深大佬 : sunshinev

    @secondwtq 学习了,推荐大家可以看下 簡單的 FizzBuzz 藏有 深度(google 面試題)

  • 資深大佬 : yaoweilei

    go=”A” if x==1 else “B” if x==2 else “C”

  • 資深大佬 : Lemeng

    文明人讲究优雅。

  • 資深大佬 : leo108

    switch (x) {
    case 3:
    // no break
    case 1:
    A;
    if (x === 1) {
    break;
    }
    case 2:
    B;
    break;
    }

  • 資深大佬 : antiquezzz

    兄弟不会真的以为会写 FizzBuzz 很难得吧

  • 資深大佬 : rainman777

    “`
    if (n & 0x01)
    fun_a();
    if (n & 0x02)
    fun_b();

    “`

  • 資深大佬 : hws8033856

    为什么你们包括 LZ 都不按题目要求来?
    不是=3 才执行 AB 么?
    你们怎么都是除=1 和=2 以外的其他值都执行 AB ?

  • 資深大佬 : Jooooooooo

    最优的解法最容易看懂

  • 資深大佬 : shenjies88

    这就是一个很简单的问题,切勿过度设计过度猜疑,if 或者 switch 即可

  • 資深大佬 : marcong95

    @hws8033856 #29 因为主的提供的样例里面就是 else { AB },那么问题来了,到底是 else AB 呢,还是=3 AB 呢,如果 x = 4 呢,主这题似乎已经有这个坑了

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

    x & 1 && A()
    x & 2 && B()

  • 資深大佬 : northisland

    一条搞定,但是很鬼畜,可读性不高。
    “`
    #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

    其实看到很多位运算方案,但是总觉得位运算看起来很短,但是不是很容易理解~可能我还没找到窍门

  • 資深大佬 : lloydsheng

    如果没有性能问题,写的越清晰易懂越好

  • 資深大佬 : terence4444

    按 bit 开关判断即可
    1A 2B 4C 8D 16F

  • 資深大佬 : zlowly

    那要看不同场景下优雅是怎么定义了。如果这是在一个追求性能的的核心代码 /引擎之类的里,肯定是有优化空间;如果只是个普通代码片段,主本身的代码就没什么问题;如果是在业务逻辑代码里,可考虑的地方就多了,常见的是日后考虑调整或扩展=4=5 之类情况,有可能是更复杂的 ABCBA 执行情况等等,为了可读性和可维护性这时候上模式设计都是可以的。

  • 資深大佬 : hws8033856

    @marcong95 所以我才说“包括 LZ” 都不按题目要求来
    只论代码长短,应该没有比你这个更短的了
    不过我始终认为所谓代码的优雅,应该更多要看重代码的可读性
    你这里用逻辑运算符来替代分支,就是很严重的破坏可读性,不优雅

  • 資深大佬 : lx0758

    位运算

  • 資深大佬 : artikle

    if(x==1||x==3)
    A();
    if(x==2||x==3)
    B();

  • 主 資深大佬 : sunshinev

    @artikle 其实我现在用的就是你的方案

  • 資深大佬 : vitoliu

    用模式来做处理不是更好吗,推荐组合模式

  • 資深大佬 : Kamiyu0087

    when (x) {
    1 -> A()
    2 -> B()
    3 -> {
    A()
    B()
    }
    }

  • 資深大佬 : marcong95

    @hws8033856 #38 刚刚的确看漏了你的“包括”,

    我的方案只是代码本身有蜜汁对称性,看着爽。的确是牺牲了可读性,以及没有处理 x 在 123 以外的情况

  • 資深大佬 : hst001

    你这问题,还刚好 123,就是设计考位运算的题吧

  • 資深大佬 : cambria

    如果 x 取值只有 1,2,3 的话可以这么写( python):

    if (x % 2):
    A()
    if (x // 2):
    B()

  • 資深大佬 : supuwoerc

    x==1?a:x==2?b:x==3?a&b:null;

  • 資深大佬 : wnpllrzodiac

    位操作?最低位表示 a 第二位表示 b.

  • 資深大佬 : imn1

    x&1: A
    (x>>1)&1: B

  • 資深大佬 : vhysug01

    查表

  • 資深大佬 : skrskrskrskr

    这一看就是工作不饱和

  • 資深大佬 : xumng123

    查表即可

  • 資深大佬 : ychost

    Map funcMap = {1:A,2:B,3:A&B}

  • 資深大佬 : lovecy

    let funcMap = new Map([[1, func A], [2, func B], [3, func C]]);
    funcMap.get(x)();

  • 資深大佬 : manymobi

    我觉得 你在考虑思想, 上面这个问题太局限了, 可以看看 spirng HttpMessageConverter

  • 資深大佬 : woahishui

    策略模式加命令模式

  • 資深大佬 : nocrush

    搞一个 map

  • 資深大佬 : phpIsNumberOne

    goto

  • 資深大佬 : jinliming2

    支持 Excel 吗?
    =SWITCH(A1, 1, “A”, 2, “B”, 3, “AB”, “other”)

  • 資深大佬 : yeyu1989

    decode(x,1,A,2,B,3,AB)

  • 資深大佬 : bbxiong

    if x == 1 then
    a
    elseif x == 2 then
    b
    elseif x == 3 then
    a b
    end

    我觉得越简单,用简单清晰的代码写出来就行了

  • 資深大佬 : iceheart

    老老实实写,别搞花样

  • 資深大佬 : dragonbuf

    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

    一通下来,还是最朴素的最优雅。没有性能问题就不搞花的了,代码是给人看的

  • 資深大佬 : diegozhu

    1. 转 map:
    {1: “A”, 2: “B”, 3: “AB”}[X]
    2.

  • 資深大佬 : lbyo

    @sunshinev #18 16 、17 的回答完全不符合题意啊,主你自己有没有搞清楚…

  • 資深大佬 : 13670515509

    js
    let obj = { 1: [A], 2: [B], 3: [A, B] }
    obj[x] && Array.isArray(obj[x]) && obj[x].forEach(fn => {typeof fn === ‘function’ && fn()})

  • 資深大佬 : godwinma

    @xiangyuecn 卧槽,优秀。

  • 資深大佬 : slipper

    如果以后还会加其他的判断情况,考虑扩展性,可以使用 visitor pattern,如果没有,直接写就很好了。

  • 資深大佬 : shm7

    其他值怎么处理,不考虑吗?

  • 資深大佬 : crazyhorse

    function run(x) {
    const runner = [{
    x: [1,2],

    }]

    if(runA.indexOf)
    }

  • 資深大佬 : crazyhorse

    //有后续扩展(更多条件和要执行的方法)
    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

    分支或者查表,看应用场景吧。

  • 資深大佬 : donaldsu

    想到两个,不过都已经被占了

  • 資深大佬 : xiaoliu926

    @Kamiyu0087 kotlin 大法好

  • 資深大佬 : RickyC

    果然你们后端都是逻辑狂人

  • 資深大佬 : SmiteChow

    你提到的才是最优雅的,其他都是 tricky

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具