荷兰 Gov 根据要求公开身份验证 App 的源代码 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alexkuang
V2EX    分享发现

荷兰 Gov 根据要求公开身份验证 App 的源代码

  •  
  •   alexkuang 2023-01-18 16:06:07 +08:00 8456 次点击
    这是一个创建于 1072 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言    2023-01-19 17:08:30 +08:00
    最初消息来源和截图来源:
    https://twitter.com/JeroenFrijters/status/1615204074588180481

    标题只是简单地翻译了一下
    78 条回复    2023-01-20 13:17:15 +08:00
    sadfQED2
        1
    sadfQED2  
       2023-01-18 16:13:03 +08:00 via Android   4
    挺好的呀,清晰易懂,比那些套了一层又一层最后循环了 800 次才输出几个点的代码好多了
    bubblegz
        2
    bubblegz  
       2023-01-18 16:16:14 +08:00   1
    清晰即可
    crab
        3
    crab  
       2023-01-18 16:25:17 +08:00
    这两个不复制的话怎么快捷打出来。
    murmur
        4
    murmur  
       2023-01-18 16:34:35 +08:00   3
    这代码维护性无敌,以后需求一改还可以 OOXXXOOXXX 这样换花样
    zidian
        5
    zidian  
       2023-01-18 16:34:59 +08:00   2
    清晰明了。想起之前看过一个判断闰年的,直接把未来的十几个闰年写死在一个 list 里
    hhjswf
        6
    hhjswf  
       2023-01-18 16:36:28 +08:00 via Android
    这也叫挺好吗。。
    luob
        7
    luob  
       2023-01-18 16:38:25 +08:00   11
    这段代码不是“挺好”,“也可以”,而是标准的最佳实践

    经常会遇到一些自作聪明的人把这样的逻辑继续抽象出一个函数来计算每 0.1 percentage 等于几个球,感觉自己能省好几行代码,实际上是蠢到家了。
    awalkingman
        8
    awalkingman  
       2023-01-18 16:41:23 +08:00
    @crab 诶你这不是做到了嘛。帖子里是图片,复制都没得复制
    lakehylia
        9
    lakehylia  
       2023-01-18 16:46:10 +08:00
    反正现在内存硬盘用不完,这段代码很好啊。
    hhjswf
        10
    hhjswf  
       2023-01-18 16:46:34 +08:00 via Android   4
    @luob 这不是二极管吗,*10 取整就完了。。
    TWorldIsNButThis
        11
    TWorldIsNButThis  
       2023-01-18 16:46:56 +08:00 via iPhone
    如果用 pattern matching 的 switch 就更 declarative 了
    luob
        12
    luob  
       2023-01-18 16:52:53 +08:00
    @hhjswf 欢迎对号入座
    Jimmyisme
        13
    Jimmyisme  
       2023-01-18 17:02:14 +08:00   4
    @crab Windiws 有个叫 IME 的功能。Win+v 是剪贴板历史; Win+; || win+.打开搜索面板. 直接搜 blue || white circle
    MAGA2022
        14
    MAGA2022  
       2023-01-18 17:05:38 +08:00 via Android
    这都能吹
    gimp
        15
    gimp  
       2023-01-18 17:09:26 +08:00
    清晰易懂,我觉得不错。
    NoOneNoBody
        16
    NoOneNoBody  
       2023-01-18 17:14:48 +08:00
    有些看不懂……楼上的一些楼层
    那 ppm 该怎么写呢?
    urnoob
        17
    urnoob  
       2023-01-18 17:19:30 +08:00
    最喜欢这样的代码了
    唯一的缺点 最后一行默认返回全白比较好
    mozhizhu
        18
    mozhizhu  
       2023-01-18 17:23:47 +08:00   5
    完全不需要&&左边的判断
    kkkkkkhalil
        19
    kkkkkkhalil  
       2023-01-18 17:26:32 +08:00
    @luob #7 不明白抽象函数的坏处,能指点一下原因吗?
    ikushi
        20
    ikushi  
       2023-01-18 17:31:59 +08:00 via iPad
    @luob 不太明白这个“最佳实践”里的>判断是干什么用的?
    churchill
        21
    churchill  
      nbsp;2023-01-18 17:36:32 +08:00   3
    “最佳实践”可还行,逻辑都不讲了
    dingjs
        22
    dingjs  
       2023-01-18 17:57:02 +08:00   2
    @luob 产品: 我们要显示更精准的进度,用 100 个球来显示
    AV1
        23
    AV1  
       2023-01-18 18:11:00 +08:00
    我也有过同样的实现,但我不用人力一个一个地写,会另写一段代码来生成代码。
    Yourshell
        24
    Yourshell  
       2023-01-18 18:15:51 +08:00 via Android
    看来我还是太菜了,想不出来该怎么吹这段代码。
    luob
        25
    luob  
       2023-01-18 18:19:31 +08:00   5
    @NoOneNoBody
    @dingjs

    有一个从别人那里接手的陈年老项目,需求是把十个球改成一百万个球,你是希望原项目写的是上面那样的,还是这样一串?

    x = Int(Math.ceil(p*10))
    String.repeat("" * x) + String.repeat("" * (10-x))

    任何一个智力正常的人最多 0.5 秒就能知道这十行球写的什么,但是推明白这两行各位需要多长时间?
    simple2025
        26
    simple2025  
       2023-01-18 18:35:37 +08:00   1
    居然是 C#
    iseki
        27
    iseki  
       2023-01-18 18:42:24 +08:00 via Android
    10 个球有点多了,要是 3 个 5 个这么写我觉得还行
    iseki
        28
    iseki  
       2023-01-18 18:48:29 +08:00 via Android
    主要是 3 个以内不容易写错看错,10 个一手滑就不好了。至于代码生成的还是歇一会儿吧,还不如拿 Math 函数凑合下

    @luob 这两行有个两三秒也看懂了,可按上例堆上个几十行我得仔细看有没有反直觉的条件,改时候也得小心翼翼
    iseki
        29
    iseki  
       2023-01-18 18:49:19 +08:00 via Android
    顺带一提…你那两行写的不太对吧
    iseki
        30
    iseki  
       2023-01-18 18:54:39 +08:00 via Android
    如果你们用 Math 函数写东西都是这种风格,我建议还是老老实实堆条件吧,起码不出错
    n18255447846
        31
    n18255447846  
       2023-01-18 18:55:14 +08:00
    跟标题有什么关系?
    elfive
        32
    elfive  
       2023-01-18 18:56:29 +08:00 via iPhone
    @luob 属于前期计划不足,后期写代码过度设计了。

    能完成当前设定的目标,而且足够简单,就足够了。当然前提是前期设计足够细致完善。
    mogita
        33
    mogita  
       2023-01-18 20:05:08 +08:00 via iPhone
    @dingjs 放心,不是所有 PM 都怀揣着一颗和世界较劲的心。
    20015jjw
        34
    20015jjw  
       2023-01-18 21:08:43 +08:00 via iPhone
    当年 obama care 的网页也就这水平
    政 @府外包嘛不能要求什么
    clrss
        35
    clrss  
       2023-01-18 21:12:34 +08:00   20
    var get_rating_string = function(rating) {
    return "★★★★★☆☆☆☆☆".substring(5 - rating, 10 - rating);
    };
    NoOneNoBody
        36
    NoOneNoBody  
       2023-01-19 01:00:11 +08:00   1
    @luob #25
    你想的点错了,这两行只适合一个项目,但不应只考虑眼前问题
    我写的话,会以 dict, enum 等等类似的格式传入,这样调用的人在构建参数的时候自然也清楚目的是什么
    因为问题的本质就是一一对应的选择,输入 a 输出 A ,使用的人理清出入的格式就够了,不需理会中间如何实现

    此题的话,传入 0.1 ~ 0.9 九个 breakpoint ,("" * x) 组成的十个结果,以及测试值
    构建前面这两个参数的人自然清楚是做什么
    至于中间实现的代码,难读也没所谓,快速和高效更重要

    例如这个 python 小函数,我几乎全部项目都有用到,是个通用函数
    def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
    ... i = bisect(breakpoints, score)
    ... return grades[i]
    理解 breakpoints, grades 两个参数应该比四个 if 容易吧
    KMpAn8Obw1QhPoEP
        37
    KMpAn8Obw1QhPoEP  
       2023-01-19 03:33:47 +08:00 via Android
    @clrss 妙啊 滑动窗口了
    binux
        38
    binux  
       2023-01-19 03:55:41 +08:00 via Android
    @luob 任何一个智力正常的人检验#24 的正确性只用 2 秒,但是看完原文这十行需要多长时间?
    pikashi
        39
    pikashi  
       2023-01-19 08:26:46 +08:00 via Android
    这代码不光简单易读,而且性能应该也是最高吧
    jaggle
        40
    jaggle  
       2023-01-19 09:02:43 +08:00 via iPhone
    @enchilada2020 抱歉好像是你看懂了,能否解释一下,长度不够还能回到第一列取?
    manhere
        41
    manhere  
       2023-01-19 09:18:36 +08:00
    人和代码有一个能跑就行
    rocksolid
        42
    rocksolid  
       2023-01-19 09:20:08 +08:00   5
    大开眼界,这小学生代码也能吹一波
    uNoBrain
        43
    uNoBrain  
       2023-01-19 09:34:07 +08:00 via Android
    @rocksolid 国外大师惊世之作
    rocksolid
        44
    rocksolid  
       2023-01-19 09:34:32 +08:00   3
    还有吹性能的,就算是 20 年前这点性能区别狗都看不上
    lysS
        45
    lysS  
       2023-01-19 09:45:24 +08:00
    @Jimmyisme 用自带的输入法,选择列表的最右边就有
    nevergotit
        46
    nevergotit  
       2023-01-19 09:55:47 +08:00
    人家 10 秒钟写完代码回家陪孩子了,你还在这掰扯写的不够高级
    ncepuzs
        47
    ncepuzs  
       2023-01-19 10:00:07 +08:00
    这也能吹,还“性能应该也是最高吧”……
    wwbfred
        48
    wwbfred  
       2023-01-19 10:16:59 +08:00
    @luob 我希望采用的是"标准的最佳实践",毕竟把十个明文字符改成一百万个明文字符,那可太容易了。
    这个实践的优点还包括简单易读,一百万个字符,大家数一数就是知道是多少个了,完全不需要注释,也很好检查是否少了一个。
    KMpAn8Obw1QhPoEP
        49
    KMpAn8Obw1QhPoEP  
       2023-01-19 10:22:59 +08:00 via Android
    @jaggle 我没太看明白你的问题是什么。。他定义了一个长度为 10 的字符串 然后从中取固定长度为 5 的子串 根据 rating 的值来决定起点 终点即是起点+5
    agdhole
        50
    agdhole  
       2023-01-19 10:23:48 +08:00
    意大利面条
    wdwwtzy
        51
    wdwwtzy  
       2023-01-19 10:36:26 +08:00
    竟然是用 C#的 xamarin 写的 ios 和安卓 app 。
    其实 C#可以使用模式匹配,达到更好的效果。
    ```
    return percentage switch
    {
    > 0.1 and < 0.2 => "1",
    > 0.2 and < 0.3 => "2",
    > 0.3 and < 0.4 => "3",
    ......
    };
    ```
    watzds
        52
    watzds  
       2023-01-19 11:25:47 +08:00
    很优雅的代码,扩展性很强,比如大于多少分,圆圈换个颜色之类的
    assiadamo
        53
    assiadamo  
       2023-01-19 11:32:53 +08:00
    我去荷兰是不是也能找到这样的工作
    lchynn
        54
    lchynn  
       2023-01-19 12:04:20 +08:00
    @sadfQED2 的确这才是写给人来维护的代码。循环嵌套也就算了, 还用各种奇技淫巧,美其名为代码 geek ,压根是不想其他人正常读懂吧。
    Jirajine
        55
    Jirajine  
       2023-01-19 12:51:52 +08:00   2
    难道重点不是标题里 gov 开源身份验证应用的源码吗
    iceheart
        56
    iceheart  
       2023-01-19 13:09:56 +08:00 via Android
    简洁,高效,自注释,易维护,易排错。
    取舍恰到好处,不知道有啥可喷的。觉得不好的贴个你认为更好的版本呀
    Genshin2020
        57
    Genshin2020  
       2023-01-19 13:20:47 +08:00   3
    楼主,你应该说国内的同事写的代码,这样大家的想法就一致了,你用洋大人的源码,肯定有牧羊犬的
    darknoll
        58
    darknoll  
       2023-01-19 13:59:08 +08:00
    简单明快,舒服
    SimbaPeng
        59
    SimbaPeng  
       2023-01-19 14:47:38 +08:00
    总有拿可读性来尬吹小学生代码的
    learningman
        60
    learningman  
       2023-01-19 15:08:33 +08:00
    觉得可读性强的,盲猜是自己只会写这种代码
    Jimmyisme
        61
    Jimmyisme  
       2023-01-19 15:21:00 +08:00
    @lysS 自带输入法 bug 很多(很多游戏里不能打中文)已经习惯搜狗+双拼了
    Lighfer
        62
    Lighfer  
       2023-01-19 15:28:17 +08:00 via iPhone
    在能满足现有需求的前提下这代码没什么可挑剔的。
    至于有些人说产品经理之后要改成显示更精确的进度,这段代码改起来也很轻松,无论是什么人来改都没问题。
    在我看来,一个项目不必在每一个如此小的功能点都要设计得很复杂,所谓的可扩展应该是针对整个项目的局部,但不是局部到如此细节,更多的情况下是这段代码可能这辈子都不会动它了。
    最后,每个人的品味都不一样,单单这段代码我个人认为并不存在可挑剔的地方,更上升不到人身攻击的程度。
    叠个盾牌: 仅针对这段代码及这个帖子内容发言,不要拿我没看过项目中的其他代码说事,因为我真的没看。
    netabare
        63
    netabare  
       2023-01-19 16:07:47 +08:00 via Android   1
    这哪里最佳实践了,扯性能,10 个 if 也不是没有代价的,说可读性,写代码的人一般情况下都懂小学数学,这种代码没有任何优势,而且一堆小于大于号粗心写错的可能性也不是没有。

    而且,如果传入的是负数怎么办?
    ramondoo
        64
    ramondoo  
       2023-01-19 16:15:56 +08:00   1
    代码还是有些问题的
    ( 1 )参数小于 0 的情况处理不当
    ( 2 ) double 类型的参数与零比较方式有问题
    revlis7
        65
    revlis7  
       2023-01-19 16:39:22 +08:00
    哪儿呢么多废话,就问一句,你就说这结果对不对吧!
    Genshin2020
        66
    Genshin2020  
       2023-01-19 16:50:21 +08:00
    说一个冷知识点,蓝色字符长度为 2 ,白色字符长度为 1

    好了,继续讨论
    k9982874
        67
    k9982874  
       2023-01-19 16:54:18 +08:00 via Android
    发现楼上有个看不懂 10 取模的程序员
    Genshin2020
        68
    Genshin2020  
       2023-01-19 16:56:16 +08:00   1
    @netabare 我不知道多少人尝试自己优化一下,我尝试以后发现这样的办法也许真的是比较高效的方法。

    但是那些说这个代码好的,我怀疑他们没有自己去实现,单纯因为是洋人写的

    比如,蓝色字符长度为 2 ,白色字符长度为 1 ,这个关键点都没有人点出来
    Genshin2020
        69
    Genshin2020  
       2023-01-19 17:01:21 +08:00
    console.log(' ===>',''.length)
    console.log(' ===>', ''.length)

    可以自己在控制台打印一下
    westoy
        70
    westoy  
       2023-01-19 17:46:24 +08:00
    @Genshin2020

    也不一定, 的 unicode 码是 128309

    支持 UCS4 的语言实现里是 1 个字长, 比如 python 、ruby 、haskell 、rust 、go(utf8.RuneCountInString)等等

    只支持 UCS2 的语言里是 2 个, 像 jvm 系、c#、node 等等
    moioooo
        71
    moioooo  
       2023-01-19 17:54:45 +08:00 via iPhone
    js 里我也这么写的。
    一开始想着等逻辑理清楚,代码完成之后再吧打印改的简洁点
    后来回头看,感觉挺适合 review ,就留着了
    ccraohng
        72
    ccraohng  
       2023-01-19 17:57:36 +08:00
    b.repeat(y ,b) + w.repeat(10 - y, 'w')
    在我这是一坨大便
    Genshin2020
        73
    Genshin2020  
       2023-01-19 20:31:21 +08:00
    @westoy 原来如此,受教了,十分感谢。

    我是前端,JS 回家的路上想到解决方案,但是按照之前的答主,写出来也是对阅读不友好的方案。

    #35 的改版,只是计算公式符合我说的这种情况
    iikebug
        74
    iikebug  
       2023-01-19 20:48:54 +08:00
    这样的代码都有人吹易读性的吗?
    adoal
        75
    adoal  
       2023-01-19 21:22:38 +08:00
    当代程序员价值观众生相
    hhjswf
        76
    hhjswf  
       2023-01-19 21:23:13 +08:00 via Android
    有内味了,把贾浅浅的屎屁尿放进高考阅读理解,想必各位大佬也能品出一番风味。别问,问就是蠢人欢迎对号入座
    lengyuqu
        77
    lengyuqu  
       2023-01-20 07:46:45 +08:00
    国外的屎都是可以吹的
    zhlxsh
        78
    zhlxsh  
       2023-01-20 13:17:15 +08:00 via iPhone
    看了下原文的推特机翻的标题:荷兰 gov 被迫发布其 DigiD 数字身份验证 iOS 应用程序的源代码。它是用 C# 编写的。

    我记得高中 pascal 写的字母塔也是用 for 循环
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1648 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 16:18 PVG 00:18 LAX 08:18 JFK 11:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86