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

瞎狗眼,还真有人这样写代码

  •  
  •   jasontse · 2014-10-02 11:34:02 +08:00 via iPad · 5790 次点击
    这是一个创建于 3688 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本以为 version.StartsWith 只是网上的段子,没想到真有人这样编程。绝大多数是 Java 和 Python。
    https://searchcode.com/?q=StartsWith%28%22Windows+9%22%29
    26 条回复    2014-10-03 11:25:23 +08:00
    jsonline
        1
    jsonline  
       2014-10-02 11:43:42 +08:00
    和 getYear 一比是小巫见大巫。

    所有软件都是需要维护的,指望一个软件用几十年一行代码不改是不切实际的。
    jsonline
        2
    jsonline  
       2014-10-02 11:44:19 +08:00
    如果你98年写代码,会想到 Window 从 95 变成 9 吗?
    jasontse
        3
    jasontse  
    OP
       2014-10-02 11:52:59 +08:00 via iPad
    @jsonline
    可是微软 API 没有提供这种 "Friendly Name",获得版本号有专门的函数。
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
    anerevol
        4
    anerevol  
       2014-10-02 12:21:54 +08:00
    Minimum supported client
    Windows 2000 Professional [desktop apps only] 不知道是不是说win2000以后才有这个函数
    jasontse
        5
    jasontse  
    OP
       2014-10-02 13:15:26 +08:00 via Android
    @anerevol 看最后的部分
    whywhywhy
        6
    whywhywhy  
       2014-10-02 14:07:56 +08:00
    version.StartsWith 判断系统版本真的那么好笑么?好笑?真的好笑?不如来笑 php!

    http://www.v2ex.com/t/136792
    raincious
        7
    raincious  
       2014-10-02 14:24:13 +08:00   ❤️ 1
    @whywhywhy

    当然好笑了。

    利用“投机取巧”的手段写出了代码,后面出了问题只能算是一时的疏忽。就这个例子,去os里拿个系统版本号真的不是一件很复杂的事情,用操作系统名称字符串判断简直是思维有问题(还不说直接还截取了那个字符串的一部分来判断)。

    另外,你说的另一个问题是“软件兼容性”问题,和“投机取巧”是两件事。

    其次,你不能要求所有程序员都跟你遵守同一个非相关规范,软件版本号之类更是这样,每个公司都有各自不同的规范。至于名称更是这样,每个人开发的软件都有权利取名Ghost,根据上下文自行判断就好了,没必要纠结这一点。
    zts1993
        8
    zts1993  
       2014-10-02 15:17:02 +08:00
    这特么是脑残么。。。startsWith是内置函数,所以是python和java躺枪,这样嘲笑,你不觉得有问题么????
    jasontse
        9
    jasontse  
    OP
       2014-10-02 15:21:23 +08:00 via Android
    @zts1993
    问题是人不是语言,关注重点不对。
    jyjmrlk
        10
    jyjmrlk  
       2014-10-02 15:24:23 +08:00
    原来看到过这篇文章:
    http://www.douban.com/note/364847734/
    感觉差不多。

    很多 Python 代码使用:if sys.version < '2.x',当然 这得到 Python 10 才会影响了吧。
    dorentus
        11
    dorentus  
       2014-10-02 16:11:36 +08:00
    intellij/openapi/util/SystemInfo.java 这里这么写其实可以理解啊。

    本身这段代码就是要区分不同的操作系统的不同版本的,但是每个操作系统提供的机制都不完全一样,用字符串来匹配是最自然不过的选择了。

    有新版本的系统出来,导致这里出问题的话,直接改就是了。

    -- http://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx 对于这个,为了调用这个函数,Java 的项目似乎需要做不少事情,而且对于其它没有这个函数的平台,还得区分对待(相反地,获取当前操作系统的名称和版本字符串,应该是 Java 标准库默认就支持的)。另外文档底部那段,本身的逻辑就很复杂,写到 Java 代码里面,如果不附加额外说明的话,没人能看懂,可维护性也就低了。
    jasontse
        12
    jasontse  
    OP
       2014-10-02 16:17:48 +08:00 via Android
    @dorentus
    Java 应该有更靠谱的封装吧。这种事情多出现在跨平台开发上,说到底还是开发人员对一个平台不够接地气。
    jasontse
        13
    jasontse  
    OP
       2014-10-02 16:24:29 +08:00 via Android
    @dorentus
    就像 https://searchcode.com/codesearch/view/39394128/ 明明有 OS_VERSION 可是他还是要用 StartsWith。
    dorentus
        14
    dorentus  
       2014-10-02 16:32:59 +08:00
    @jasontse
    说是不够接地气或者不够重视的话,倒也没错。

    不过呢,现状是这样的:
    每个系统都提供了获取操作系统名字和版本号字符串的 API(例如 POSIX 的 uname(3))。
    Windows 除了类似的 API 之外,也提供了上面的“更好的”接口,不过仅支持 Windows;行为在不同版本的 Windows 上面还有所不同。
    其它的系统,大概也有类似的接口,不过也都是仅支持本系统的。都可以更精确地区分本操作系统的版本。

    JDK 里面大概就只提供了大家共有的获取操作系统名字和版本号字符串的 API。
    要自己实现一个比较好的、使用各系统原生接口的、可以更精确地区分操作系统版本的工具类,倒也不是不行,但是远远比这种直接比较字符串的方式麻烦啊……而且以后万一有什么新的系统出来,也一样还是要改。

    出于成本考虑,怎么简单就怎么实现呗。

    毕竟:
    1) 这又不是什么特别核心的功能。
    2) 会出问题的场景是可以遇见的:新操作系统出来的时候。
    3) 有问题的话修改起来也很简单,改几行代码就行。

    成本完全是可控且可接受的。

    ----
    当然,对于微软来说,也绝对不会因为要兼容第三方的这些个用法,而选择跳过版本号9的。
    dorentus
        15
    dorentus  
       2014-10-02 16:38:45 +08:00
    @jasontse 这个估计就是开发者不太明白微软的命名方式吧……其它系统的 OS_NAME 都是 Linux、Darwin 这些通称……

    但是对于 Windows 来说,OS_NAME 只是个商品名,OS_VERSION 才应该是可以区分版本的唯一代码。比如 Win 7 的 OS_NAME 是 "Windows 7",OS_VERSION 是 "6.1"。

    ----
    怎么感觉这些开发者一点都不在乎 Windows 啊
    明明 JetBrains 的这些产品允许在 Windows 上的最多吧……
    imn1
        16
    imn1  
       2014-10-02 16:39:27 +08:00   ❤️ 1
    有些事情还是要平静看待
    我会笑别人做的某件愚蠢的事,但基本上只会是玩笑,而不是嘲笑
    因为说不准自己也做过这件事,或者同级别(一样蠢)的其他事,更说不准这可能是一个必经之路
    对于后辈,尽可能以指导的方式纠正其错误,尤其是思路上的纠正;对于前辈,则给以善意提醒~
    jasontse
        17
    jasontse  
    OP
       2014-10-02 16:40:33 +08:00 via iPad
    @dorentus
    https://searchcode.com/codesearch/view/39394128/
    看 58 行,他不是不知道 Windows 版本号这回事,而且 160 行开始对 Mac OS 版本的处理又不一样。
    baozijun
        18
    baozijun  
       2014-10-02 17:14:24 +08:00   ❤️ 1
    以前我也吐槽过公司的代码,后面尝试自己重构实现才发现,尼玛,确实是要那样实现,我的实现看起来不错,不过性能确实太烂,实现也是原来的3倍......后面才明白凡是不能光看表面,不自己经历一遍就下定论的话会被别人心里默默当成sb的...
    EPr2hh6LADQWqRVH
        19
    EPr2hh6LADQWqRVH  
       2014-10-02 17:26:21 +08:00   ❤️ 1
    你永远无法掌握所有细节,所以无法考虑到所有的情况,
    有些做法你现在能够发现有问题,更多的其实你发现不了,
    在有限的人生中你能预见到的只是浅浅的未来,
    你看起来很荒唐的事情没准有它的道理,随便笑人荒唐才荒唐
    otakustay
        20
    otakustay  
       2014-10-02 19:43:56 +08:00
    要是所有人都和楼主一样靠谱,想必不会有千年虫
    mengzhuo
        21
    mengzhuo  
       2014-10-02 21:58:37 +08:00
    果然楼上有IPv4
    其实就算IPv6,以后进入星际旅行时代,后人又要骂一顿“妈的,哪个程序员觉得这点IP够用的”

    这种问题笑笑过了就好了
    Quaintjade
        22
    Quaintjade  
       2014-10-02 22:28:51 +08:00
    andy12530
        23
    andy12530  
       2014-10-03 01:54:29 +08:00
    "MSIE".test(window.navigator.userAgent)

    看到这句,你们会不会觉得所有的javaScript程序员都是脑残?

    几十年前的事情,你以现在的眼光来黑,很高大上,有意思么。
    jasontse
        24
    jasontse  
    OP
       2014-10-03 07:05:25 +08:00 via Android
    微软真是悲催,换作是苹果乔老爷子肯定不会搭理他们。
    yolio2003
        25
    yolio2003  
       2014-10-03 10:12:10 +08:00
    代码这样写很合理很正常,而且现在直接到10的做法不是非常贴心吗?
    感觉这次从什么角度看对微软都是赞!
    Automan
        26
    Automan  
       2014-10-03 11:25:23 +08:00   ❤️ 1
    @jasontse 其实他们的代码对 MAC 也有问题啊
    !OS_VERSION.startsWith("10.1") &&

    10.10的 Yosemite 不就中枪了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1330 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:38 · PVG 07:38 · LAX 15:38 · JFK 18:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.