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

2014-10-02 11:34:02 +08:00
 jasontse
本以为 version.StartsWith 只是网上的段子,没想到真有人这样编程。绝大多数是 Java 和 Python。
https://searchcode.com/?q=StartsWith%28%22Windows+9%22%29
5818 次点击
所在节点    Windows
26 条回复
jsonline
2014-10-02 11:43:42 +08:00
和 getYear 一比是小巫见大巫。

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

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

当然好笑了。

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

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

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

很多 Python 代码使用:if sys.version < '2.x',当然 这得到 Python 10 才会影响了吧。
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
2014-10-02 16:17:48 +08:00
@dorentus
Java 应该有更靠谱的封装吧。这种事情多出现在跨平台开发上,说到底还是开发人员对一个平台不够接地气。
jasontse
2014-10-02 16:24:29 +08:00
@dorentus
就像 https://searchcode.com/codesearch/view/39394128/ 明明有 OS_VERSION 可是他还是要用 StartsWith。
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
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
2014-10-02 16:39:27 +08:00
有些事情还是要平静看待
我会笑别人做的某件愚蠢的事,但基本上只会是玩笑,而不是嘲笑
因为说不准自己也做过这件事,或者同级别(一样蠢)的其他事,更说不准这可能是一个必经之路
对于后辈,尽可能以指导的方式纠正其错误,尤其是思路上的纠正;对于前辈,则给以善意提醒~
jasontse
2014-10-02 16:40:33 +08:00
@dorentus
https://searchcode.com/codesearch/view/39394128/
看 58 行,他不是不知道 Windows 版本号这回事,而且 160 行开始对 Mac OS 版本的处理又不一样。
baozijun
2014-10-02 17:14:24 +08:00
以前我也吐槽过公司的代码,后面尝试自己重构实现才发现,尼玛,确实是要那样实现,我的实现看起来不错,不过性能确实太烂,实现也是原来的3倍......后面才明白凡是不能光看表面,不自己经历一遍就下定论的话会被别人心里默默当成sb的...
EPr2hh6LADQWqRVH
2014-10-02 17:26:21 +08:00
你永远无法掌握所有细节,所以无法考虑到所有的情况,
有些做法你现在能够发现有问题,更多的其实你发现不了,
在有限的人生中你能预见到的只是浅浅的未来,
你看起来很荒唐的事情没准有它的道理,随便笑人荒唐才荒唐
otakustay
2014-10-02 19:43:56 +08:00
要是所有人都和楼主一样靠谱,想必不会有千年虫

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

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

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

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

© 2021 V2EX