V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lihongjie0209
V2EX  ›  问与答

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

  •  
  •   lihongjie0209 · Dec 20, 2017 · 12413 views
    This topic created in 3061 days ago, the information mentioned may be changed or developed.
    
    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}
    
    Supplement 1  ·  Dec 20, 2017
    统一回复一下:
    首先: 函数对外接口应该满足 CQS
    其次: 日期对象应该是不可变的, 参考 Java8 新的时间 API
    最后: 看不懂 CQS 别瞎回复
    Supplement 2  ·  Dec 20, 2017
    Supplement 3  ·  Dec 20, 2017
    维护者博客中提到关于时间对象不可变是团队的共识, 但是由于历史遗留原因无法做出改变.
    [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.
    Supplement 4  ·  Dec 20, 2017
    声明: 我没有喷 moment, 一个第三方库而已, 可以换另一个.
    我喷的是 js, 是 js 的生态圈, 3 万多 star 的一个开源项目怎么会发展成这样!
    108 replies    2018-04-27 17:00:06 +08:00
    1  2  
    airycanon
        1
    airycanon  
       Dec 20, 2017
    看上去是在浏览器的 console 里写的测试?
    Phariel
        2
    Phariel  
       Dec 20, 2017
    指向同一个内部 object 了吧 你自己把时间取一下好了 不要依赖返回对象赋值
    Pastsong
        3
    Pastsong  
       Dec 20, 2017
    这和库有关系?不是自己蠢?
    sunnygaofan
        4
    sunnygaofan  
       Dec 20, 2017 via iPhone
    楼上+1
    codermagefox
        5
    codermagefox  
       Dec 20, 2017
    console 都是瞎 b 打印的.....
    EridanusSora
        6
    EridanusSora  
       Dec 20, 2017
    var now = moment() 实例化了一个 moment 对象,然后你后面都对这一个对象操作,当然是这样的结果了。
    InternetExplorer
        7
    InternetExplorer  
       Dec 20, 2017
    所以 34760 个点 star 的人不觉得有问题,你为什么不考虑一下是自己理解有问题;
    moment 文档里的操作几乎都是 moment(). 打头;
    https://momentjs.com/docs/#/parsing/moment-clone/
    fe619742721
        8
    fe619742721  
       Dec 20, 2017
    看标题好可怕,还以为是大佬来声讨痛斥 js 垃圾库泛滥了,
    coderluan
        9
    coderluan  
       Dec 20, 2017
    这就是一个加入 V 站半年多的会员该有的表现?
    f0rger
        10
    f0rger  
       Dec 20, 2017 via iPhone
    实力证明自己不懂还装懂
    Lothar
        11
    Lothar  
       Dec 20, 2017
    每次看到这种贴,都感觉有可能是楼主故意卖个蠢,来骗回复铜币的...
    maichael
        12
    maichael  
       Dec 20, 2017
    喷了……
    seki
        13
    seki  
       Dec 20, 2017
    moment 就是这样的呀,好好看文档
    要想不修改原来的值的话,用 date-fns
    LeungJZ
        14
    LeungJZ  
       Dec 20, 2017   ❤️ 1
    @Pastsong #3 +1

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

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

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

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

    其实我赞同楼主的观点,返回值该是 immutable 的。但是楼主你干嘛偏要用奇怪的术语,CQS 原则是啥?没听过。另外楼主你先用自然语言描述一下问题不行吗。
    otakustay
        46
    otakustay  
       Dec 20, 2017
    moment 的 API 确实不好(主要是 immutable,以及一堆没意思的字符串参数),但这是历史问题,Java 也有 7 也有 8,moment 都多久的库了,star 是积累出来的也同时 star 数的增长是有惯性的,如果对 Immutable 是强需求,可以用 luxon
    quickma
        47
    quickma  
       Dec 20, 2017
    一个 34760 Star 该有的表现是由你说了算的?上来就把别人批判一番,也不看看自己做了什么贡献?
    tjsdtc
        48
    tjsdtc  
       Dec 20, 2017
    虽然没用过 moment 但是同意楼主的观点,这样设计确实很蛋疼
    chairuosen
        49
    chairuosen  
       Dec 20, 2017
    有返回值就不应该有副作用,有副作用就不该有返回值。YES
    lihongjie0209
        50
    lihongjie0209  
    OP
       Dec 20, 2017
    @x7395759 #47 我说了不算, 所以我把 github issue 贴上了, 还把维护者的博客也贴上了.
    lihongjie0209
        51
    lihongjie0209  
    OP
       Dec 20, 2017
    @ipwx #45 command query separation, 命令与查询分离.
    lihongjie0209
        52
    lihongjie0209  
    OP
       Dec 20, 2017
    @tjsdtc #48 反人类
    ORZRRR
        53
    ORZRRR  
       Dec 20, 2017
    😀摸楼主🐶头!
    FinnBai
        54
    FinnBai  
       Dec 20, 2017
    @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  
       Dec 20, 2017
    也不说下有啥问题。。。
    Shy07
        56
    Shy07  
       Dec 20, 2017   ❤️ 2
    这个坑我也遇到过,后来都是用原生 Date 记录当前时间,然后生成 moment 对象再处理

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

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

    就像:

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

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

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

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

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

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

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

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

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

    库本身是不能改的,不然就是 breakable change 了,你让之前用的人怎么办
    FrankFang128
        96
    FrankFang128  
       Dec 21, 2017   ❤️ 1
    @breeswish 升级大版本即可
    am241
        97
    am241  
       Dec 21, 2017 via Android   ❤️ 1
    不懂 js,但在别的语言里,这种功能该由 static 方法提供。这种用法确实反直觉
    ywm8812
        98
    ywm8812  
       Dec 21, 2017
    @crs0910 #94 真是简洁啊
    jea
        99
    jea  
       Dec 21, 2017
    那啥, 虽然不大会 js, 可是别人的库你不用就行了啊, 别人不也说明原因了吗? 你这吐槽是显本事来了? 自己写个 pq 提交过去证明一下自己
    AV1
        100
    AV1  
       Dec 21, 2017
    我以为喷的是一个库,然后以为喷的是 JS 生态圈,再后来以为喷的是 JS,直到再看最后附言就懂了,原来是 JS 和生态圈一起喷……
    1  2  
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5851 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 268ms · UTC 06:37 · PVG 14:37 · LAX 23:37 · JFK 02:37
    ♥ Do have faith in what you're doing.