V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lihongjie0209
V2EX  ›  问与答

这就是一个 34760 Star 的 Javascript 库该有的表现?

  •  
  •   lihongjie0209 · 2017-12-20 10:31:07 +08:00 · 10539 次点击
    这是一个创建于 2291 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    var now = moment()
    undefined
    var startOfMonth = now.startOf("month")
    undefined
    startOfMonth
    u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Fri Dec 01 2017 00:00:00 GMT+0800 (China Standard Time), _z: null}
    var endOfMonth = now.endOf("month")
    undefined
    endOfMonth
    u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Sun Dec 31 2017 23:59:59 GMT+0800 (China Standard Time), _z: null}
    startOfMonth
    u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Sun Dec 31 2017 23:59:59 GMT+0800 (China Standard Time), _z: null}
    now
    u {_isAMomentObject: true, _isUTC: false, _locale: l, _d: Sun Dec 31 2017 23:59:59 GMT+0800 (China Standard Time), _z: null}
    
    第 1 条附言  ·  2017-12-20 12:53:00 +08:00
    统一回复一下:
    首先: 函数对外接口应该满足 CQS
    其次: 日期对象应该是不可变的, 参考 Java8 新的时间 API
    最后: 看不懂 CQS 别瞎回复
    第 2 条附言  ·  2017-12-20 13:17:34 +08:00
    第 3 条附言  ·  2017-12-20 13:27:57 +08:00
    维护者博客中提到关于时间对象不可变是团队的共识, 但是由于历史遗留原因无法做出改变.
    [Why Moment.js Isn ’ t Immutable Yet]( https://maggiepint.com/2016/06/24/why-moment-js-isnt-immutable-yet/)

    > Now, it is important to know that all of Moment ’ s maintainers agree that date and time types should be immutable. If we were sitting down and writing a new date and time library today, that is how we would make it. However, changing Moment to be an immutable API has some very big logistical concerns for us.
    第 4 条附言  ·  2017-12-20 20:48:38 +08:00
    声明: 我没有喷 moment, 一个第三方库而已, 可以换另一个.
    我喷的是 js, 是 js 的生态圈, 3 万多 star 的一个开源项目怎么会发展成这样!
    108 条回复    2018-04-27 17:00:06 +08:00
    1  2  
    airycanon
        1
    airycanon  
       2017-12-20 10:42:39 +08:00
    看上去是在浏览器的 console 里写的测试?
    Phariel
        2
    Phariel  
       2017-12-20 10:47:40 +08:00
    指向同一个内部 object 了吧 你自己把时间取一下好了 不要依赖返回对象赋值
    Pastsong
        3
    Pastsong  
       2017-12-20 10:54:47 +08:00
    这和库有关系?不是自己蠢?
    sunnygaofan
        4
    sunnygaofan  
       2017-12-20 11:01:27 +08:00 via iPhone
    楼上+1
    codermagefox
        5
    codermagefox  
       2017-12-20 11:04:25 +08:00
    console 都是瞎 b 打印的.....
    EridanusSora
        6
    EridanusSora  
       2017-12-20 11:04:30 +08:00
    var now = moment() 实例化了一个 moment 对象,然后你后面都对这一个对象操作,当然是这样的结果了。
    InternetExplorer
        7
    InternetExplorer  
       2017-12-20 11:05:55 +08:00
    所以 34760 个点 star 的人不觉得有问题,你为什么不考虑一下是自己理解有问题;
    moment 文档里的操作几乎都是 moment(). 打头;
    https://momentjs.com/docs/#/parsing/moment-clone/
    fe619742721
        8
    fe619742721  
       2017-12-20 11:08:06 +08:00
    看标题好可怕,还以为是大佬来声讨痛斥 js 垃圾库泛滥了,
    coderluan
        9
    coderluan  
       2017-12-20 11:21:42 +08:00
    这就是一个加入 V 站半年多的会员该有的表现?
    f0rger
        10
    f0rger  
       2017-12-20 11:43:45 +08:00 via iPhone
    实力证明自己不懂还装懂
    Lothar
        11
    Lothar  
       2017-12-20 11:47:06 +08:00
    每次看到这种贴,都感觉有可能是楼主故意卖个蠢,来骗回复铜币的...
    maichael
        12
    maichael  
       2017-12-20 11:49:44 +08:00
    喷了……
    seki
        13
    seki  
       2017-12-20 11:51:13 +08:00
    moment 就是这样的呀,好好看文档
    要想不修改原来的值的话,用 date-fns
    LeungJZ
        14
    LeungJZ  
       2017-12-20 12:04:54 +08:00   ❤️ 1
    @Pastsong #3 +1

    官方文档写的清清楚楚,自己不会用,不要怪库。
    moxhuis
        15
    moxhuis  
       2017-12-20 12:07:19 +08:00
    笑死了
    jiangzhuo
        16
    jiangzhuo  
       2017-12-20 12:48:34 +08:00
    看了楼主没看懂
    看到 13 楼我才明白楼主想表达什么。。。。。
    FrankFang128
        17
    FrankFang128  
       2017-12-20 12:49:06 +08:00
    API 名称不合理而已
    lihongjie0209
        18
    lihongjie0209  
    OP
       2017-12-20 12:52:27 +08:00
    统一回复一下:
    首先: 函数对外接口应该满足 CQS
    其次: 日期对象应该是不可变的, 参考 Java8 新的时间 API
    最后: 看不懂 CQS 别瞎回复
    lihongjie0209
        19
    lihongjie0209  
    OP
       2017-12-20 12:54:33 +08:00
    @jiangzhuo 时间对象的方法有返回值但是改变内部状态, 违反了 CQS 原则, 最坑的是时间对象是可变的
    lihongjie0209
        20
    lihongjie0209  
    OP
       2017-12-20 12:55:33 +08:00
    @FrankFang128 很有误导性
    FrankFang128
        21
    FrankFang128  
       2017-12-20 12:56:24 +08:00   ❤️ 1
    我认可楼主的观点,momentjs API 设计不合理
    lihongjie0209
        22
    lihongjie0209  
    OP
       2017-12-20 12:57:23 +08:00
    @EridanusSora 当接口有返回值时(查询)不应该改变对象内部的状态, 其次时间对象应该是不可变的
    FrankFang128
        23
    FrankFang128  
       2017-12-20 12:57:49 +08:00
    还有一个更有误导性的
    jQuery
    $.inArray(1, [1,2,3])
    猜猜返回值

    你一定以为是 bool
    实际是 0,下标
    murmur
        24
    murmur  
       2017-12-20 13:00:53 +08:00
    楼主怕是 react 中毒了神 tm 不可变对象谁教你 date 必须不可变 像 java 那种用 date 必须配 calendar 很舒服么
    zankard
        25
    zankard  
       2017-12-20 13:02:19 +08:00 via iPhone
    momentjs 居然是这样设计 api 的
    jiangzhuo
        26
    jiangzhuo  
       2017-12-20 13:04:53 +08:00
    别跟 js 谈 oo
    lihongjie0209
        27
    lihongjie0209  
    OP
       2017-12-20 13:09:22 +08:00   ❤️ 1
    @murmur java7 之前的时间 API 一直被骂, Java8 之后出了新的 API, 你可以去看看
    lihongjie0209
        28
    lihongjie0209  
    OP
       2017-12-20 13:10:17 +08:00
    @jiangzhuo `js 吹`吹 NB 的时候可是把 OO,FP 都揽在身上的
    lihongjie0209
        29
    lihongjie0209  
    OP
       2017-12-20 13:11:21 +08:00
    @zankard 反`后端`常识, 前端可能只接触到这些类库, 感觉不到
    lihongjie0209
        30
    lihongjie0209  
    OP
       2017-12-20 13:12:00 +08:00
    @FrankFang128 可怕, 没手册真不会写 js
    eriale
        31
    eriale  
       2017-12-20 13:12:27 +08:00   ❤️ 1
    楼主说的没错,moment 的开发者也在清理有副作用的部分,包括 startOf 和 endOf 都要向 immutable 方向改。
    https://github.com/moment/moment/issues/1754
    多说一句,这个 issue 是 3 年前提的,现在还没有改完,如果我是前端开发,我会考虑在新项目避免使用这个库。
    lihongjie0209
        32
    lihongjie0209  
    OP
       2017-12-20 13:12:51 +08:00
    @FrankFang128 总算有人看懂了, 谢谢
    CDL
        33
    CDL  
       2017-12-20 13:13:55 +08:00
    js 不等于 java 谢谢
    [1,2,3].indexOf(1)返回的也是 0 谢谢
    lihongjie0209
        34
    lihongjie0209  
    OP
       2017-12-20 13:14:11 +08:00
    @eriale 我是后端, 偶尔写前端, 需要用一个时间类库就找了一个最火的, 没想到都是坑.
    lihongjie0209
        35
    lihongjie0209  
    OP
       2017-12-20 13:15:22 +08:00
    @CDL indexOf 是查询(Query), 有返回值没有副作用很正常
    quinoa42
        36
    quinoa42  
       2017-12-20 13:17:41 +08:00
    没写过 js,不过支持应该 immutable 的观点
    无论是 OOP 还是 FP,尽可能减少 mutable 的情况对谁都好
    SourceMan
        37
    SourceMan  
       2017-12-20 13:18:40 +08:00
    一开始就有附言那一段不挺好(除了最后一句)
    非得言外之意寻知己
    lihongjie0209
        38
    lihongjie0209  
    OP
       2017-12-20 13:20:43 +08:00
    @SourceMan 这个是我的错
    holyghost
        39
    holyghost  
       2017-12-20 13:21:39 +08:00
    楼主说的是对的。

    软件设计是一门学问啊。
    suikator
        40
    suikator  
       2017-12-20 13:25:35 +08:00 via Android
    笑看 V2EX 大神把楼主批判一番
    k9982874
        41
    k9982874  
       2017-12-20 13:26:21 +08:00   ❤️ 2
    @FrankFang128 inArray 这个我觉得没问题。
    你理解为『值是否在数组中存在』理应返回 bool,是中文语言逻辑。
    实际上是『查询值在数组中的位置』,按英语习惯没问题。
    如果想达到你的要求应该实现『 hasValue 』方法。

    @lihongjie0209 查询接口改了值内容是挺坑的
    lihongjie0209
        42
    lihongjie0209  
    OP
       2017-12-20 13:28:41 +08:00
    @holyghost 反人类啊
    lihongjie0209
        43
    lihongjie0209  
    OP
       2017-12-20 13:29:19 +08:00   ❤️ 4
    @suikator 本来不想加附言, 感觉 v2 水平能看懂, 失算
    icyalala
        44
    icyalala  
       2017-12-20 13:50:48 +08:00
    "违反了 CQS 原则"。。唉。。
    ipwx
        45
    ipwx  
       2017-12-20 14:04:59 +08:00
    我看了楼主贴的调试日志,好久才看懂楼主在说啥。

    其实我赞同楼主的观点,返回值该是 immutable 的。但是楼主你干嘛偏要用奇怪的术语,CQS 原则是啥?没听过。另外楼主你先用自然语言描述一下问题不行吗。
    otakustay
        46
    otakustay  
       2017-12-20 14:09:16 +08:00
    moment 的 API 确实不好(主要是 immutable,以及一堆没意思的字符串参数),但这是历史问题,Java 也有 7 也有 8,moment 都多久的库了,star 是积累出来的也同时 star 数的增长是有惯性的,如果对 Immutable 是强需求,可以用 luxon
    x7395759
        47
    x7395759  
       2017-12-20 14:13:11 +08:00
    一个 34760 Star 该有的表现是由你说了算的?上来就把别人批判一番,也不看看自己做了什么贡献?
    tjsdtc
        48
    tjsdtc  
       2017-12-20 14:13:38 +08:00
    虽然没用过 moment 但是同意楼主的观点,这样设计确实很蛋疼
    chairuosen
        49
    chairuosen  
       2017-12-20 14:18:46 +08:00
    有返回值就不应该有副作用,有副作用就不该有返回值。YES
    lihongjie0209
        50
    lihongjie0209  
    OP
       2017-12-20 14:36:40 +08:00
    @x7395759 #47 我说了不算, 所以我把 github issue 贴上了, 还把维护者的博客也贴上了.
    lihongjie0209
        51
    lihongjie0209  
    OP
       2017-12-20 14:38:11 +08:00
    @ipwx #45 command query separation, 命令与查询分离.
    lihongjie0209
        52
    lihongjie0209  
    OP
       2017-12-20 14:38:50 +08:00
    @tjsdtc #48 反人类
    ORZRRR
        53
    ORZRRR  
       2017-12-20 14:39:43 +08:00
    😀摸楼主🐶头!
    baiyi
        54
    baiyi  
       2017-12-20 14:50:24 +08:00
    @k9982874 #41 似乎解释的有点强行,毕竟我用过的 PHP 的 in_array 与 python list 的 in 都是 bool 的

    PHP : http://php.net/manual/zh/function.in-array.php

    python : https://docs.python.org/2/reference/expressions.html#in
    LokiSharp
        55
    LokiSharp  
       2017-12-20 15:09:26 +08:00
    也不说下有啥问题。。。
    Shy07
        56
    Shy07  
       2017-12-20 15:10:30 +08:00   ❤️ 2
    这个坑我也遇到过,后来都是用原生 Date 记录当前时间,然后生成 moment 对象再处理

    我不明白 v2 现在的戾气为什么这么重,别人用代码库遇到坑心情不爽措辞有些失当,还情有可原,但那些上来不对事直接对人的,你们这样做真的好么
    crysislinux
        57
    crysislinux  
       2017-12-20 15:30:09 +08:00 via Android
    @Shy07 问题是楼主发的话就是找喷的,非不好好说话
    k9982874
        58
    k9982874  
       2017-12-20 15:34:55 +08:00
    @baiyi 并不强行,这个全看官方,并不能上升到设计问题高度。
    个人认为 JQ 的 inArray 更合理,测试接口用 isInArray 或 hasValue 更合理。
    当然最后还是看官方文档。
    baiyi
        59
    baiyi  
       2017-12-20 15:40:09 +08:00
    @k9982874 #58 恩,毕竟一个人一个看法,对于设计者来说是这样,对于我们使用者也是这样。

    赞同“最后还是看官方文档”,不同的语言的设计者有不同的想法,还是要仔细看官方文档才能不进坑啊
    topgrd
        61
    topgrd  
       2017-12-20 16:00:19 +08:00   ❤️ 1
    楼主可以看看 moment 团队新出的一个日期时间库 luxon.
    wee911
        62
    wee911  
       2017-12-20 16:09:31 +08:00
    我在用 moment 的时候,总觉得 api 不顺手,好怪,每次要看文档,原来是这原因
    wekw
        63
    wekw  
       2017-12-20 16:18:57 +08:00   ❤️ 2
    一个 Java 程序员,觉得某个 JavaScript 库“应该”符合某种不明所以的规范,所以开喷。

    就像:

    一个坦克驾驶员跑到飞机驾驶舱里说你们怎么没有左右方向杆呀,这样飞机怎么拐弯呀?

    楼主还扯上了“本来不想加附言, 感觉 v2 水平能看懂, 失算”,这种廉价的优越感,楼主要反省。
    overflowHidden
        64
    overflowHidden  
       2017-12-20 17:15:40 +08:00
    为什么还有强行拉 jquery 出来鞭尸的。。。照这么说天下框架一般黑
    DualWield
        65
    DualWield  
       2017-12-20 17:24:37 +08:00
    lz 一开始并没有把问题说明白,导致一开始的楼都没看懂 lz 的意思,就乱喷一通,v2 的人真的要学习一下礼貌。

    ps:我支持 lz 的观点
    VYSE
        66
    VYSE  
       2017-12-20 17:28:47 +08:00
    觉得这样的设计碰坑后才后知后觉它是 mutable 的一般人都会很不爽
    lovedebug
        67
    lovedebug  
       2017-12-20 17:34:04 +08:00
    支持,moment 的日期对象可变在转换中挺麻烦
    lihongjie0209
        68
    lihongjie0209  
    OP
       2017-12-20 17:37:19 +08:00
    @DualWield #65 我的错
    lihongjie0209
        69
    lihongjie0209  
    OP
       2017-12-20 17:39:34 +08:00   ❤️ 3
    @wekw #63 这个不明所以的规范写在<重构>中, 写在<代码整洁之道>中, 写在 UncleBob 的每次演讲稿中, 不好意思, 有给你讲了三个不明就里的名词
    wekw
        70
    wekw  
       2017-12-20 18:01:25 +08:00
    @lihongjie0209 我时常告诫自己,廉价的优越感会让自己变 low。您扪心自问一下,发这个帖子的目的是什么?
    wekw
        71
    wekw  
       2017-12-20 18:05:03 +08:00
    @lihongjie0209 UncleBob 可能是 Java 程序员的 Uncle,可能他说的话有普适性,那就代表着别的方式都是错的吗?请再看一遍我上一个回复里的问题,问问自己。我也从技术角度回复一下:JavaScript 是 Lisp 在浏览器里的再生,类就是对象,对象就是方法,方法就是类,本就是拥有万千姿态的函数式语言,不是 OO,更不是严格 OO。
    Mcatt
        72
    Mcatt  
       2017-12-20 18:07:28 +08:00   ❤️ 1
    要不楼主看看这个库: https://date-fns.org/
    linjianru
        73
    linjianru  
       2017-12-20 19:08:14 +08:00   ❤️ 2
    你提的确实是一个问题。

    但你火冒三丈的标题就有些过分了。

    如果你付了钱给 moment 买了他们的代码,结果让你很失望,你骂得再难听都没问题。但对于一个完全免费的开源项目,如此的指责只会让人觉得你很刻薄。

    建议楼主换位思考。
    maomo
        74
    maomo  
       2017-12-20 19:14:35 +08:00
    @wekw 为什么说 JavaScript 是 Lisp 在浏览器里的再生?还请指教
    jin5354
        75
    jin5354  
       2017-12-20 19:29:48 +08:00
    当众喷一个服务多年的开源免费时间库,这就是一个高贵卓越的后端程序员应有的表现
    zthxxx
        76
    zthxxx  
       2017-12-20 19:37:11 +08:00   ❤️ 1
    @Mcatt #72 我也推荐尝试 date-fns 这个库

    大概就是 Moment 中 mutable 的问题才让 date-fns 重复这个轮子的,和楼主喷的点一样

    https://github.com/date-fns/date-fns/issues/275#issuecomment-264934189
    lguan
        77
    lguan  
       2017-12-20 20:08:08 +08:00
    提的问题没错,提的方法方式不对,`date-fns`就是一个正确的做法,要么按照文档要,要么不用,换一个,水平够就写一个,哪怕是要喷,github 里面也可以讨论,人家也开 blog 专门说了缘由 ,在这乱喷一通,不觉得 v2 的人有什么问题,我们不仅仅要学怎么做好软件设计,怎么做人也很重要吧
    lihongjie0209
        78
    lihongjie0209  
    OP
       2017-12-20 20:26:42 +08:00
    @lguan #77 其实吧, 我到是对这个库不太关心, 只是对 javascript 的生态圈比较失望.
    lihongjie0209
        79
    lihongjie0209  
    OP
       2017-12-20 20:27:45 +08:00
    @linjianru #73 其实吧, 我到是对这个库不太关心, 只是对 javascript 的生态圈比较失望. 这么多 star 按理说应该不错的, 没想到啊.
    lihongjie0209
        80
    lihongjie0209  
    OP
       2017-12-20 20:43:36 +08:00
    @jin5354 #75 我喷的不是这个库, 是 js, 是 js 的生态圈.
    lguan
        81
    lguan  
       2017-12-20 20:44:46 +08:00
    @lihongjie0209 这个能理解,前端届一直是比较浮躁的,但这种牢骚个人感觉并不是开源宗旨所在
    lihongjie0209
        82
    lihongjie0209  
    OP
       2017-12-20 20:45:52 +08:00
    @lguan #81 嗯
    CodingPuppy
        83
    CodingPuppy  
       2017-12-20 21:03:28 +08:00
    这就是准备喷一个有 34760 Star Javascript 库的人该有的表达能力?
    CodingPuppy
        84
    CodingPuppy  
       2017-12-20 21:09:09 +08:00   ❤️ 2
    其实吧,我喷的不是这个准备喷一个有 34760 Star Javascript 库的人,我喷的是所有不写 Javascript 写 PHP、Java、C#、golang 的人,你们圈的人这么有优越感?只是对你们的生态圈圈比较失望。写句话标点符号都不对,按理说应该不错的,没想到啊。
    CodingPuppy
        85
    CodingPuppy  
       2017-12-20 21:10:53 +08:00
    不知道为什么要用中文句号的,别瞎回复。
    lihongjie0209
        86
    lihongjie0209  
    OP
       2017-12-20 21:12:27 +08:00
    @CodingPuppy #85 谢谢撒币
    mkdong
        87
    mkdong  
       2017-12-20 22:22:44 +08:00 via iPhone
    我觉得楼主没必要喷 js 生态的,不喜欢可以不用呀。
    CodingPuppy
        88
    CodingPuppy  
       2017-12-20 22:41:16 +08:00
    @lihongjie0209 不客气,我就是为了撒币来的
    zsj950618
        89
    zsj950618  
       2017-12-20 22:59:10 +08:00
    语文没学好系列
    lxml
        90
    lxml  
       2017-12-20 23:40:01 +08:00
    勉强看懂了喷的是什么, 设计是有问题, 副总用这个贴加剧了我对于 Js 的恐惧感,
    lihongjie0209
        91
    lihongjie0209  
    OP
       2017-12-20 23:42:08 +08:00
    @lxml #90 我放弃了.
    movistar
        92
    movistar  
       2017-12-20 23:45:22 +08:00   ❤️ 1
    @CodingPuppy 连 JavaScript 大小写都写不对的人嘲笑用英文标点的人,66666
    而且逗号还能"。。。。"这么用?新华字典教你的么
    iyaozhen
        93
    iyaozhen  
       2017-12-21 00:23:38 +08:00   ❤️ 1
    这点上支持楼主。
    moment 这个库确实你不看文档根本不知道怎么写。

    不过太用 Java 的思维去理解其它语言,会给自己带来痛苦
    crs0910
        94
    crs0910  
       2017-12-21 01:15:34 +08:00   ❤️ 1
    breeswish
        95
    breeswish  
       2017-12-21 01:18:50 +08:00   ❤️ 1
    用这货呀,moment 里各种缺陷都尝试在这里改掉了 https://github.com/moment/luxon

    库本身是不能改的,不然就是 breakable change 了,你让之前用的人怎么办
    FrankFang128
        96
    FrankFang128  
       2017-12-21 02:56:32 +08:00   ❤️ 1
    @breeswish 升级大版本即可
    am241
        97
    am241  
       2017-12-21 03:08:45 +08:00 via Android   ❤️ 1
    不懂 js,但在别的语言里,这种功能该由 static 方法提供。这种用法确实反直觉
    ywm8812
        98
    ywm8812  
       2017-12-21 09:28:27 +08:00
    @crs0910 #94 真是简洁啊
    jea
        99
    jea  
       2017-12-21 10:02:47 +08:00
    那啥, 虽然不大会 js, 可是别人的库你不用就行了啊, 别人不也说明原因了吗? 你这吐槽是显本事来了? 自己写个 pq 提交过去证明一下自己
    DOLLOR
        100
    DOLLOR  
       2017-12-21 10:03:14 +08:00
    我以为喷的是一个库,然后以为喷的是 JS 生态圈,再后来以为喷的是 JS,直到再看最后附言就懂了,原来是 JS 和生态圈一起喷……
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5309 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:26 · PVG 15:26 · LAX 00:26 · JFK 03:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.