V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
66450146
V2EX  ›  程序员

你们更偏向那种形式?

  •  
  •   66450146 · 2014-11-20 10:19:03 +08:00 · 5098 次点击
    这是一个创建于 3664 天前的主题,其中的信息可能已经有所发展或是发生改变。
    35 条回复    2014-11-22 10:41:19 +08:00
    21grams
        1
    21grams  
       2014-11-20 10:30:44 +08:00
    一般来说第二种,可读性更好
    yjsslab
        2
    yjsslab  
       2014-11-20 10:49:44 +08:00
    尽量不在if里使用否定吧,也就是尽量不用unless
    vulgur
        3
    vulgur  
       2014-11-20 10:55:45 +08:00
    我是第一种,不过不写“is not None”,就是“if something”
    tabris17
        4
    tabris17  
       2014-11-20 10:59:43 +08:00   ❤️ 1
    分清主次

    big_block_of_code()是程序的主干

    something is None 之后是分支,次要的

    应该把次要的分支写在if里
    jimwoo
        5
    jimwoo  
       2014-11-20 11:05:31 +08:00
    - -!什么东西??看不懂!!我只看到了标题!
    jinyang656
        6
    jinyang656  
       2014-11-20 11:37:18 +08:00
    @jimwoo 因为lz放了个gist,但是由于某些原因就看不到了 你懂的
    mulog
        7
    mulog  
       2014-11-20 11:42:08 +08:00
    @vulgur 这两个语义是不一样的 不是任何时候都能替换的哦。。

    至于LZ的问题 我个人同意@tabris17 把相对来说更“异常”的情况处理写到if里
    rwx
        8
    rwx  
       2014-11-20 11:59:47 +08:00
    个人来说第二种
    习惯把异常或者错误情况排除之后再写主逻辑,尽可能减少if嵌套
    onlyice
        9
    onlyice  
       2014-11-20 12:08:01 +08:00 via Android
    @jimwoo 我也看不到东西,是图片没刷出来?
    faceair
        10
    faceair  
       2014-11-20 12:18:46 +08:00   ❤️ 1
    @jimwoo
    @onlyice

    gist被dns污染 推荐chinadns
    Ge4Los
        11
    Ge4Los  
       2014-11-20 13:06:53 +08:00
    我用第二种, 优先跳出异常或错误, 然后执行主要代码;
    主要代码的缩进会靠前, 更容易阅读
    ytll21
        12
    ytll21  
       2014-11-20 13:26:04 +08:00
    说看不见的看这个
    # First style
    if something is not None: # or whatever condition
    big_block_of_code()

    # Second style
    if something is None: # or whatever condition
    continue # or return None or whatever
    big_block_of_code()
    jimwoo
        13
    jimwoo  
       2014-11-20 13:31:17 +08:00
    @faceair 我擦~我第一次来V2EX……果断落伍了!
    xidianlz
        14
    xidianlz  
       2014-11-20 13:35:43 +08:00
    if something is not None:
    为啥不用
    if something:
    这样不是更pythonic一点?
    Sylv
        15
    Sylv  
       2014-11-20 13:38:29 +08:00
    @xidianlz 这两个是有区别的,例如 something = 0
    xudshen
        16
    xudshen  
       2014-11-20 13:39:16 +08:00
    第二个
    xudshen
        17
    xudshen  
       2014-11-20 13:40:30 +08:00
    相对来说少缩进一层,
    imn1
        18
    imn1  
       2014-11-20 13:40:46 +08:00
    貌似这两个逻辑不同

    单一条件不会有太大区别,只是可读性的问题,如果多条件,可以考虑以下短路方式减少判断
    rebornix
        19
    rebornix  
       2014-11-20 14:02:41 +08:00
    如果代码比较复杂,我觉得通过fast return来减少内嵌层级比较好。倾向第二种。
    clino
        20
    clino  
       2014-11-20 14:52:12 +08:00
    @faceair 我用chinadns一样不行阿

    2014-11-20 14:51:10 INFO request gist.github.com
    2014-11-20 14:51:10 INFO response gist.github.com: [('203.161.230.171', 1, 1)]
    xidianlz
        21
    xidianlz  
       2014-11-20 15:03:15 +08:00
    @Sylv something = 0时候
    something和something is not None不都是True么?
    regmach
        22
    regmach  
       2014-11-20 15:14:26 +08:00
    我喜欢第二种
    Sylv
        23
    Sylv  
       2014-11-20 16:36:48 +08:00 via iPhone
    @xidianlz 你试试 something = 0 和 something = '' 的情况就知道了
    yetone
        24
    yetone  
       2014-11-20 18:42:04 +08:00
    第二种学名是防御式编程,推荐的写法。
    mulog
        25
    mulog  
       2014-11-20 21:08:11 +08:00
    @xidianlz
    显然不是。。。
    a = 0
    if a:
    print a
    什么也不会print
    hustlzp
        26
    hustlzp  
       2014-11-20 21:13:25 +08:00
    个人第二种
    cvrock
        27
    cvrock  
       2014-11-20 21:45:37 +08:00
    显然是要分情况的,第一种情况可能会导致if嵌套太深,第二种情况可能会导致每个if内都有一个返回的出口,需要根据具体场景决定选择哪种写法。
    fish748
        28
    fish748  
       2014-11-21 01:29:11 +08:00
    现在用第二种,嵌套少一层。
    lightening
        29
    lightening  
       2014-11-21 03:56:35 +08:00
    if some_condition
    do_something
    end

    def do_something
    big_block_of_code
    end
    dreampuf
        30
    dreampuf  
       2014-11-21 04:13:14 +08:00
    TLTR: “等于”比“不等于”更符合直觉,避免嵌套优先执行异常分支。选第二种。

    via. Code Complete 2nd

    Summary of Techniques for Reducing Deep Nesting

    The following is a list of the techniques you can use to reduce deep nesting, along with references to the sections in this book that discuss the techniques:

    - Retest part of the condition (this section)

    - Convert to if-then-elses (this section)

    - Convert to a case statement (this section)

    - Factor deeply nested code into its own routine (this section)

    - Use objects and polymorphic dispatch (this section)

    - Rewrite the code to use a status variable (in Section 17.3)

    - Use guard clauses to exit a routine and make the nominal path through the code clearer (in Section 17.1)

    - Use exceptions (Section 8.4)

    - Redesign deeply nested code entirely (this section)
    dingyaguang117
        31
    dingyaguang117  
       2014-11-21 09:42:50 +08:00
    第二种
    whalegia
        32
    whalegia  
       2014-11-22 04:31:33 +08:00
    这种这么细节的知识你们是在哪里看的啊……orz
    我不看到这种讨论贴就根本不知道
    jox
        33
    jox  
       2014-11-22 09:39:57 +08:00
    我尽量不在选择分支里进行这种判断,选择分支里的值只有两个,逻辑真或逻辑假,如果在某个对象的值不存在的时候会使用函数或者提前计算得到布尔值,然后再进行判断。类似这样的:

    if isItExist(object):
    -- ...
    else:
    -- ...

    函数isItExist()的返回类型是布尔值
    66450146
        34
    66450146  
    OP
       2014-11-22 10:09:20 +08:00
    @jox 如果是对数值进行合法性验证呢?
    jox
        35
    jox  
       2014-11-22 10:41:19 +08:00
    @66450146 合法就是逻辑真,否则就是逻辑假呗

    if isValid(object):
    -- ....
    else:
    -- ....

    我觉得限制选择分支里的类型为布尔类型,尽量少用0或者void来代替逻辑假,用0或者void(None)之类的代替逻辑假会导致逻辑混乱
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:36 · PVG 13:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.