V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
realpg
0.01D
V2EX  ›  程序员

又是被写其他语言库的 Java 党搞恶心的一天

  •  1
     
  •   realpg ·
    PRO
    ·
    realpg · 11 小时 5 分钟前 · 10720 次点击

    编程语言: golang

    原因, 阿里云 oss sdk 从 v1 升级到 v2 因为 v1 有些问题他们不修了

    破防原因:

    v1 语法:

    client := oss.New("endpoint","accesskey","secretkey")
    简洁明了 全世界的人都是这么初始化的...
    

    v2 语法:

    var region = "cn-hangzhou"
    
    var endpoint = "oss-cn-hanghzou-internal.aliyuncs.com"
    
    var myProvider := credentials.NewStaticCredentialsProvider("accessKey", "secretkey")
    
    cfg := oss.LoadDefaultConfig().
    	WithRegion(region).
        WithEndPoint(endpoint).
        WithUseDualStackEndpoint(true).
    	WithCredentialsProvider(myProvider)
    
    client,err := oss.NewClient(&cfg)
    

    希望你们这些 Java 神仙不写 Java 时候干啥都这样

    晚上睡觉前先给自己 WithComdom WithSildenafil 一下 再来个 PullProvider, PushProvider, SuckProvider, SleepProvider,

    182 条回复    2025-09-30 20:07:49 +08:00
    1  2  
    wxw752
        1
    wxw752  
       11 小时 4 分钟前   ❤️ 1
    我怀疑他们的 KPI 是按照代码数量计算的
    micean
        2
    micean  
       11 小时 3 分钟前
    会不会是 java 代码直接转的……
    ninja543
        3
    ninja543  
       11 小时 3 分钟前
    现在这个年代还在搞语言歧视,编程语言只不过是 ai 的 if-else 罢了,
    renfei
        4
    renfei  
       11 小时 3 分钟前
    哎,有时候感觉那帮人就是在炫技,各种设计模式,其实不如直接明了的传参
    xtreme1
        5
    xtreme1  
       11 小时 1 分钟前
    同意 #2, 甚至不基于 parsing 只是单纯文本替换
    realpg
        6
    realpg  
    OP
    PRO
       11 小时 0 分钟前
    @xtreme1 #5
    Exception 怎么替换
    zzxCNCZ
        7
    zzxCNCZ  
       10 小时 57 分钟前
    一行变十行,kpi*10 ,你就说先不先进吧
    k9982874
        8
    k9982874  
       10 小时 57 分钟前 via Android
    不是,哥们你是多久没更新知识库了,要不你去看看 slog 的实现。。
    realpg
        9
    realpg  
    OP
    PRO
       10 小时 55 分钟前   ❤️ 6
    @renfei #4

    你内部爱怎么设计怎么设计 你暴露给客户的简单接口搞这些没用的干啥
    如果你库内非得这么设计我举双手赞同
    你给我个 InitClient 方法 然后你内部爱怎么 provider 怎么 provider

    我支持你库内部高级工程化 代码高度可控

    你要求引用你的库给你传三个参数还得研究你定义的这么多类是定义的 链式关系是怎样的


    而且他还有超级复杂的鉴权 因为我只选用了我自己给他鉴权字符串
    它是一个库 不是一个项目 这个库内部实现了超级复杂的鉴权读取机制 从环境变量 从文件 从静态

    问题是, 你是一个三方调用库啊, 谁家 app 不是自己有配置文件 自己有环境变量 自己有数据库读取配置的东西
    这些写好的废物 Provider 压根就没有任何应用场景

    你阿里云还能通过什么手段知道各个项目的配置都在哪吗
    javaisthebest
        10
    javaisthebest  
       10 小时 52 分钟前   ❤️ 4
    假如有一天 v1 里面要新增功能你怎么做?新增字段在 New 里面?

    假如这个 sdk 越来越复杂怎么处理? New 里面放七八个字段?
    realpg
        11
    realpg  
    OP
    PRO
       10 小时 51 分钟前
    @k9982874 #8

    不知道你说的 slog 是啥

    找到了 rust 的一个知名 slog

    随便查看了他的 example

    初始化并不需要我创建一大堆 provider with 一大堆东西 只需要必要参数

    zone10
        12
    zone10  
       10 小时 49 分钟前   ❤️ 1
    golang 的惯例应该是这样子

    client := oss.New("endpoint","accesskey","secretkey",
    oss.WithRegion(region),
    oss.WithUseDualStackEndpoint(true),
    )

    可选参数可以不填
    FrankAdler
        13
    FrankAdler  
       10 小时 48 分钟前 via Android
    @javaisthebest 改成 NewClient 传入 cfg 对象我觉得就能满足绝大多数的情况了吧,字段随便加,但是现在的明显复杂多了
    realpg
        14
    realpg  
    OP
    PRO
       10 小时 48 分钟前
    @javaisthebest #10

    哪怕到地球毁灭, s3 协议初始化也只需要 ep ak sk 三个字段
    如果不是这么稳定的特性 也不可能这么设计 肯定是传一个可变 struct


    如果你觉得我吐槽的问题是这个 那只能说你的理解真的逆天
    来世投胎一个高低杠吧
    realpg
        15
    realpg  
    OP
    PRO
       10 小时 46 分钟前
    @zone10 #12

    endpoint 就覆盖了所有的 with 选项
    它的 with 就是为了拼接 endpoint

    s3 协议的标准都是只有 endpoint

    然后它的 sample 里还是要求你这么写 为了不犯错误 所以我才这么写的 region 双栈 这类的

    严格说 你指定了 endpoint 的域名 其他一切都没用了 只是它 sample 这么写 我才这么搞的
    ripperdev
        16
    ripperdev  
       10 小时 45 分钟前
    @realpg #11 说的是 golang 里的官方库 slog
    BeUself
        17
    BeUself  
       10 小时 41 分钟前
    卧槽,你这么一说我还真有感觉,python 的 oss 库也是这个鸟样子,一堆 Provider ,原来是因为 javaer
    gadfly3173
        18
    gadfly3173  
       10 小时 41 分钟前 via Android   ❤️ 1
    很可惜云存储规范的权威 aws 也是类似写法,aws 不改其他人大概也不会改😅
    lqm
        19
    lqm  
       10 小时 39 分钟前
    现在好多 golang 的库都这么写
    NessajCN
        20
    NessajCN  
       10 小时 35 分钟前   ❤️ 3
    jvavboy 们会把 PullProvider, PushProvider, SuckProvider, SleepProvider 都定义一遍
    然后只用得到 SleepProvider
    问他们前面三个你用不到定义它干啥他会说万一以后用到呢
    dimwoodxi27
        21
    dimwoodxi27  
       10 小时 34 分钟前 via Android
    还是奥卡姆剃刀大法好
    leelotov2er
        22
    leelotov2er  
       10 小时 33 分钟前   ❤️ 37
    @ninja543 曾经我也觉得语言歧视很 low ,直到后来我见得多了,我发现语言真的能影响人的大脑结构,javaer 的大脑已经发生了生理性的变化
    AutumnVerse
        23
    AutumnVerse  
       10 小时 31 分钟前 via iPhone   ❤️ 4
    这样写没啥大问题,问题是他妈一堆这么写的 sdk 没有一个像样的文档,我踏马怎么知道要调你哪个 with 设置 xx 参数

    相比之下,v1 那种清晰明了,没文档也看得懂
    zone10
        24
    zone10  
       10 小时 25 分钟前
    @realpg 我重点想说明 golang 编程规范是怎么样的.
    之前看到阿里有开源一个编程语言转换库, 他们的 sdk 应该是从 Java 直接转换来的,按国内厂商的尿性能用就不错了, 怎么可能花钱专门配个 gopher 让你用得开心.
    阿里云的 oss sdk 我记得功能是不全的, 前端直传还得翻文档调 api, 那个加密签名给我折腾的
    laikicka
        25
    laikicka  
       10 小时 22 分钟前   ❤️ 1
    @realpg 你写 Go. 不知道 slog? 你平常都在写啥? https://pkg.go.dev/log/slog
    spike0100
        26
    spike0100  
       10 小时 22 分钟前
    看着和 AWS 的有点像。
    QlanQ
        27
    QlanQ  
       10 小时 21 分钟前
    当你问一个设计模式相关的问题时候,通义和腾讯以及元宝的答案就能看出 java 的影子
    我问 直接 match ( a=>new a,b=>new b)java 硬是说 要 $re = [a=>new a,b=>bew b] 然后 $n = $re[$type]然后和你说,这样 以后加 c 的时候,不用改代码,ai 说 加 c 的时候,要加 match ,后面的方式只是加配置,改 match 是改代码,改配置不算是改代码,说这是什么 语义的不同,可能我确实不太适合 写代码吧
    laikicka
        28
    laikicka  
       10 小时 21 分钟前
    slog 都是 2 年前的东西了. 这都不知道级别吐槽阿里云的 sdk 了. 水平太差了
    realpg
        29
    realpg  
    OP
    PRO
       10 小时 20 分钟前
    @gadfly3173 #18
    @lqm #19

    我从来不反对软件功能内部你这样写 反正你自己写的你都不嫌麻烦 挺好的 清晰 好调试 好找问题 超大型工程这么干肯定是有优势的 要不 java spring 生态也不能一统天下对不对

    你一个简单三方库 暴露给外面的简单初始化接口我还得研究你所有 provider 都是啥

    这就测试开发环境写个 HelloWorldProvider 一样扯犊子


    @AutumnVerse #23
    不得不说 其实阿里云的这个库的文档相对其他开源项目 已经挺靠谱的了 这是真挣钱的库... 什么都有了 但是我得看老半天 然后发现它屁用没有 我公司的这些还真的在环境变量里 然后我研究了自带的 EnvironmentProvider 发现他只支持写死的 ALIYUN_OSS_AK 这种环境变量

    你要自定义 你自己又得写 Provider...



    @leelotov2er #22
    这根本不是语言歧视的问题
    我组里也有 java 出身的啊, 人家只在必要的复杂场景这么写, 肯定不会给别的成员暴露接口让他们去它的文档里找得怎么写 Provider
    artiga033
        30
    artiga033  
       10 小时 18 分钟前 via Android
    阿里 nacos 的 rust sdk 也很折磨,字里行间同样充斥着爪哇味就不说了。那个 Error 结构巨大也不 Box 一下,以至于我光引用它的类型 clippy 就报 warning ,还得我自己的代码帮它装箱。然后看着每个月都有 commit ,结果依赖都落后两三个版本,feature 也没有最小化,明明它依赖的 tonic 只需要 grpc client ,但就是不改一下 feature ,非要把 server 部分也带上,完了怕不是自己还在那偷偷吐槽 rust 编译慢不如爪哇...

    只能说少用阿里的产品是对的,让他们降本增效去吧
    BestPix
        31
    BestPix  
       10 小时 17 分钟前   ❤️ 3
    不好意思,你们歧视的其实是还算有点技术的 javaer ,向我们这种菜逼 javer 只会写一堆构造方法
    sky3hao9
        32
    sky3hao9  
       10 小时 15 分钟前   ❤️ 1
    确实如此, java 的人大脑是被污染过的, 如果第一次接触编程就学 java 的人, 一般无可救药
    rozbo
        33
    rozbo  
       10 小时 15 分钟前   ❤️ 71
    > 不知道 slog 是什么
    slog 是 go 的新日志库,是 go 的 **标准库**

    这种模式也是 go 推荐的模式,叫 Option Pattern ,是 go 的最佳实践之一。go 语言团队的 rob 早在 11 年前,就发文提出了这种模式,具体链接是 https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html ,这种模式避免了构造函数参数过多或需要导出过多内部字段的问题。



    设计模式是所有语言通用的,builder Pattern 和 Option Pattern 都有它们各自的优点。
    而 java 之所以多使用 Builder 是因为早期语言不区分空置,比如一个 Boolean 类型的变量,如果没有初始化,默认就是 false ,那么你如何区分它是赋值了 false ,还是没有赋值?这就是为什么引入了 builder 。
    Option 模式是为了解决 go 中没有 get 和 set 的不足,当一个 struct 有很多成员都需要初始化,又为了安全不将它们为公开,或者设置为公开时,也很难保证外部调用 struct 一一传递,就算保证了一一传递,也很难在写代码时有提示。打个比方,一个 struct 有 100 个成员要初始化,难道你提供导出一个 100 个参数的 New 函数吗?或者不提供 New 函数,直接让 Struct 公开,让所有人调用的时候一一传递成员? Option 模式就可以解决这个问题。在初始化的时候,直接初始化默认值,并导出需要修改的函数,让调用方可以视情况自定义。


    从你不认识 slog 也不懂常见设计模式,并把这归咎于 java ,可以看出来你的偏见与自满。在怀疑这个世界的时候,请先怀疑下自己。


    这个世界上聪明的人并不少,不是只有你聪明。
    darrh00
        34
    darrh00  
       10 小时 15 分钟前   ❤️ 1
    slog 不知道确实不应该吧

    除了吐槽 java 的点,还有觉得 region 是多余的?

    毕竟是大厂还是好一点的,工作到跟一个国内的 cdn 厂商打交道,sdk 扔到 github 上,模块名称不带域名,别人都没法导入,只好爬源代码到自己项目,然后调完了接口不能用,数据获取不到,根本是半成品。
    Yukineko
        35
    Yukineko  
       10 小时 14 分钟前
    java 人是这样的
    selca
        36
    selca  
       10 小时 13 分钟前
    即使是 java ,我也烦这个,作为第三方库,接收初始化参数,启动就完事了。

    我要怎么 provider 进去,sdk 就别管了
    fengxsong
        37
    fengxsong  
       10 小时 12 分钟前
    我感觉很多 golang 的库也这么写啊,例如我接触的 controller-runtime ?还有挺多 rust 的也是这样写的啊。。
    realpg
        38
    realpg  
    OP
    PRO
       10 小时 12 分钟前
    @artiga033 #30
    没办法 要是正常纯用 oss,我们可以用 aws s3 库和自己搞的轻量的 s3 兼容库,都写的比开源的要好很多,还没有不必要功能更省心

    这个是用阿里的其他产品 直接支持内联他自己的 oss 想省事就得走这个 而这个不再兼容 v1 的老库了
    Kyle18Tang
        39
    Kyle18Tang  
       10 小时 12 分钟前
    @rozbo 我想知道接下来 OP 是虚心学习还是...
    realpg
        40
    realpg  
    OP
    PRO
       10 小时 9 分钟前
    @darrh00 #34
    slog 问题 主要我也不是全职开发 也不找工作 不需要有面试能力

    我们公司这边 golang 架构和运维团队巨大 有自己的 log 系统 自带庞大 log client 的 全自己公司手搓的 是纯网络的 log 没有任何本地 log 和控制台的

    说实话 已经几百年没用过外部的 logger 了

    而个人闲扯淡的娱乐项目 我不太用 golang 的 只用过一次 zap 还是几年前了
    基本只关注语言特性啥的 这些平日用不上的基本库更新 根本不看的
    kakki
        41
    kakki  
       10 小时 7 分钟前   ❤️ 2
    Javaer 喝杯咖啡都能给你搬来一个咖啡工厂.
    exiaoxing
        42
    exiaoxing  
       10 小时 4 分钟前   ❤️ 1
    写了好多年 go ,我也不知道 slog ,逃......
    WhiskerSpark
        43
    WhiskerSpark  
       10 小时 4 分钟前
    v2 比 v1 优雅多了
    realpg
        44
    realpg  
    OP
    PRO
       10 小时 4 分钟前
    @fengxsong #37

    我自己团队里也有复杂项目内部这么写的啊
    但是没人暴露给外部接口还让人把简单的参数复杂化的
    要配置就要配置
    yyysuo
        45
    yyysuo  
       10 小时 2 分钟前
    作为吃瓜群众只想知道楼主到底懂不懂 slog ,楼主不回答的话,就会觉得楼主是没道理的。
    Ghostisbored
        46
    Ghostisbored  
       10 小时 1 分钟前
    有点像娱乐圈 各种拉踩 关键有时候还没有弄到点子上
    dzdh
        47
    dzdh  
       10 小时 1 分钟前
    oss 兼容 s3 协议。所以为啥不直接用 s3
    dzdh
        48
    dzdh  
       10 小时 0 分钟前
    s3 v2 也是这样

    ```go
    cfg, err := config.LoadDefaultConfig(context.TODO(),
    config.WithRegion(region),
    config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
    accessKey,
    secretKey,
    "",
    )),
    )
    ```
    best9999
        49
    best9999  
       9 小时 57 分钟前 via iPhone
    这个可能你不能怪阿里云,aws 的 go sdk v2 版本就是这种恶心的风格,阿里云只是对标 aws 而已,应该怪 aws
    dosmlp
        50
    dosmlp  
       9 小时 56 分钟前
    可能是周报没得写了,就整点花活出来
    Amex
        51
    Amex  
       9 小时 55 分钟前 via iPhone
    计较这个干啥 sdk 不都是自动生成的么
    dosmlp
        52
    dosmlp  
       9 小时 54 分钟前
    @javaisthebest 你这不都是假如嘛,假如以后没有新增功能你这不多此一举,等有了需求在设计不就行了
    CEBBCAT
        53
    CEBBCAT  
       9 小时 53 分钟前
    这个还好吧,chain+option 的模式,但的确可以提供一个 New()的 wrapper 。slog 这点上,可以平时追一下 go 版本发布,Go 是个社区的语言,这一点上我觉得挺好的。

    https://antonz.org/go-1-25/
    https://antonz.org/which-go/#1.21
    collery
        54
    collery  
       9 小时 50 分钟前
    这也能吵
    rozbo
        55
    rozbo  
       9 小时 48 分钟前   ❤️ 30
    @Kyle18Tang 哈哈哈不重要,我是给大家看的,防止大家被带偏,从而对 Option Pattern 带有偏见。
    这种问题但凡深入思考下,或者遇到足够复杂的场景就会明白。而且他连标准库都不知道,连设计模式都分不清楚,就说明他对 go 其实不是很了解的,甚至是 go 的新手。
    下文他自己也说了:

    > slog 问题 主要我也不是全职开发 也不找工作 不需要有面试能力
    > 我不太用 golang 的 只用过一次 zap 还是几年前了
    他自己都承认了不太用 golang

    > 说实话 已经几百年没用过外部的 logger 了
    到现在还是认为 slog 是外部 logger

    ---

    而且他能认真去查了什么叫 slog ,虽然他查错了 :) 至少大家对技术还是有一种赤子之心。

    --
    javaer 也不需要感到被歧视,java 的很多模式虽然繁琐,那都是因为要弥补语言特性的缺陷,比如上文提到的 builder 是为了解决 optional value 的问题,这其实是一个很聪明的做法。工厂模式更是一种提供职责分离,降低耦合度,同时又提供了灵活性的必不可少的做法。这正是编程中`高内聚,低耦合`的绝佳体现。

    从另外一方面说,这些 sdk 能不辞辛苦写的这么复杂,正是负责任的表现,很多功能可能其暂时用不到,觉得这样繁琐,那也有可能是因为其业务复杂度没到达到用到这些的地步。

    很多人自己菜的离谱,搞语言歧视,呆在自己的井底,狂喷天空太小,放佛全世界就自己最聪明。殊不知正是因为其无知,才缺乏敬畏,才狂妄。
    Rat3
        56
    Rat3  
       9 小时 39 分钟前
    Slog 一出来,OP 还是没有承认自己就是单纯的歧视 Java ,而不是写法...
    Torpedo
        57
    Torpedo  
       9 小时 37 分钟前   ❤️ 1
    @leelotov2er #22 主要很多人就只了解一门语言,而 java 很多人是只了解 spring 框架
    profchaos
        58
    profchaos  
       9 小时 37 分钟前
    不用 go ,但是改的看起来没什么问题啊,知道 slog
    client := oss.New("endpoint","accesskey","secretkey"), 说实话这样用太多 primitive type 会不会把 accesskey 和 secretkey 倒了都不知道,不太懂设计模式,看起来像是把两个 primitive type 换成了一个 domain type, 感觉没什么问题
    zhybb2010
        59
    zhybb2010  
       9 小时 33 分钟前
    我感觉 v1 和 v2 是并存的关系,复杂配置 v2 是更优雅的,v1 就太简陋了。。
    xitler
        60
    xitler  
       9 小时 33 分钟前   ❤️ 2
    这就是你和阿里程序员的差别
    javaisthebest
        61
    javaisthebest  
       9 小时 30 分钟前   ❤️ 2
    @realpg

    这么喜欢抬杠 我看你这辈子就是个杠精了

    我还特地去看了下云服务的 SDK

    这你怎么说? 嫌弃阿里味太冲了 那微软这一套代码怎么说?微软 net 味太冲了?还是说你喜欢亚马逊的 javaer 写的 s3 ?

    这不还是得手动提供各种 provider 信息?亚马逊是放置在项目配置目录里导入 你就当看不见不用维护 provider 了是吧?

    有这个时间去喷阿里喷 java 还不如多花点时间琢磨下 为什么要用 config/object 搭配 with




    AWS S3 v2
    ```go
    func main() {
    // Load the Shared AWS Configuration (~/.aws/config)
    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
    log.Fatal(err)
    }

    // Create an Amazon S3 service client
    client := s3.NewFromConfig(cfg)
    ```


    微软 azure 对象存储

    ```go
    // TODO: replace <storage-account-name> with your actual storage account name
    url := "https://<storage-account-name>.blob.core.windows.net/"
    ctx := context.Background()

    credential, err := azidentity.NewDefaultAzureCredential(nil)
    handleError(err)

    client, err := azblob.NewClient(url, credential, nil)
    handleError(err)
    ```


    ```go
    func main() {

    // 方式一:只填写 Region (推荐)
    cfg := oss.LoadDefaultConfig().
    WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
    WithRegion("cn-hangzhou") // 填写 Bucket 所在地域,以华东 1 (杭州)为例,Region 填写为 cn-hangzhou ,SDK 会根据 Region 自动构造 HTTPS 访问域名

    // 方式二:同时填写 Region 和 Endpoint
    // cfg := oss.LoadDefaultConfig().
    // WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
    // WithRegion("cn-hangzhou"). // 填写 Bucket 所在地域,以华东 1 (杭州)为例,Region 填写为 cn-hangzhou
    // WithEndpoint("https://oss-cn-hangzhou.aliyuncs.com") // 填写 Bucket 所在地域对应的公网 Endpoint 。以华东 1 (杭州)为例,Endpoint 填写为'https://oss-cn-hangzhou.aliyuncs.com

    ```

    @dosmlp

    所以 v2 就用了 object 替代了变量引入了 builder 模式啊 你未来想新增功能 直接更新 sdk 追加 api 就好了 原有的代码不用任何变动
    monmon
        62
    monmon  
       9 小时 28 分钟前   ❤️ 7
    我有罪,我用 Java ,我危害人间,我辜负苍生 。大早上摸摸鱼发现一不小心就会被全世界除名 。我洗心革面学习 Go ,却总被人嫌弃有 Java 味 ,但是没关系,这种帖子你尽管发,评论区是真的能学到知识,总有一天我会拿回属于我的一切
    Lenic
        63
    Lenic  
       9 小时 25 分钟前
    没人发现头像是亮点吗?
    fuchaofather
        64
    fuchaofather  
       9 小时 20 分钟前   ❤️ 3
    菜、执拗、性子急、偏见
    jingdongkehu
        65
    jingdongkehu  
       9 小时 19 分钟前
    楼主是来秀下限的吗
    crackidz
        66
    crackidz  
       9 小时 15 分钟前
    他们 SDK 应该是自动生成的,不是手工撸的
    nananqujava
        67
    nananqujava  
       9 小时 13 分钟前
    我用 Java 我是罪人 我危害人间 我辜负苍生
    yoyolichen
        68
    yoyolichen  
       9 小时 13 分钟前
    总结下来就是,又菜又急
    queifa
        69
    queifa  
       9 小时 8 分钟前
    对不起,我有罪我用 java ,又是对不起 go 爷的一天
    jhdxr
        70
    jhdxr  
       9 小时 8 分钟前
    v2 这写法不是明显优于 v1 吗?而且这是语言无关的明显优于啊。v1 只能说勉强够用。。。
    居然这么多人跟着喷,v2ex 现在水平这么菜了吗?
    ninjaJ
        71
    ninjaJ  
       9 小时 7 分钟前
    aws 和 r2 都是这样的,跟 Java 不 Java 没关系,我写 rust 也得老老实实用它们的 provider
    joshuacavell
        72
    joshuacavell  
       9 小时 6 分钟前
    本来只是破防,现在变伤害追加了.OP 最后的<<纽约生活 66 句小嗲话>>说的不错,建议多说
    internelp
        73
    internelp  
       9 小时 6 分钟前
    你在这里喷阿里,会被很多阿里股东喷。
    MIUIOS
        74
    MIUIOS  
       9 小时 5 分钟前
    阿里的 sdk 全是自动生成的
    reavid
        75
    reavid  
       9 小时 2 分钟前
    稍微写的规范一点、可扩展一点就急了。。。
    wu00
        76
    wu00  
       9 小时 2 分钟前
    我司 VP 从阿里毕业出来的

    进来就搞代码量统计,xx 代码行 bug 率,搞出来的结论是:
    java 项目的代码量是天量,python 和 dotnet 的代码量则少数倍!就跟没事干似的... 然而业务体量上相差并没有那么大。

    搞得大家现在代码特别规范~ 能换行的绝不写在一行(更美观~),以前用 mapper 映射 dto 等 poco 类的代码,在 AI 插件补全的帮助下全都变成了显式赋值(更直观~)
    visper
        77
    visper  
       8 小时 59 分钟前
    provider,builder,factory,strategy ,Adapter ,visitor
    lostwolfkf
        78
    lostwolfkf  
       8 小时 58 分钟前
    这些所谓大厂的 sdk ,最擅长的就是把简单的事情复杂化。然后文档和 demo 对不上,客服还不说人话...
    chimission
        79
    chimission  
       8 小时 56 分钟前
    不止于此,单纯风格问题,没有 go 的风格, 也有可能是自动生成的代码
    cheng6563
        80
    cheng6563  
       8 小时 56 分钟前
    他这 SDK 不是自动生成多语言版本?会不会就是为了兼容多语言语法写成这样呢
    shenlanAZ
        81
    shenlanAZ  
       8 小时 55 分钟前   ❤️ 1
    我觉得 OP 应该没什么错,创建一个 OSS 实例应该最少需要 endpoint 和 credentials provider ,其他的参数可选用 with 。
    你非要切换端点应该使用不同的实例,而不是修改当前实例的信息。另外,如果不明确构造实例的参数,怎么去合理的创建一个客户端。
    chimission
        82
    chimission  
       8 小时 51 分钟前   ❤️ 1
    go 函数支持可变长度的切片作为参数, 正经 go 风格是用可变函数参数,而不是 chain 链式调用, 不过都是风格问题,影响不大
    NotLongNil
        83
    NotLongNil  
       8 小时 48 分钟前   ❤️ 1
    @realpg #11 不是,你连标准库到 slog 都不知道啊……
    LICOEVE
        84
    LICOEVE  
       8 小时 47 分钟前
    全程都是我司,何不是另外一种井底之蛙呢
    cloudzhou
        85
    cloudzhou  
       8 小时 44 分钟前   ❤️ 2
    真的是菜到家了,才会把 Option Pattern 模式,Builder 模式,都归于 Java

    Go 著名布道者 cheney 2014 年开始的文章
    https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis

    之后很多 Go SDK 都习惯采用的方式,WithXXX 作为 Option 参数
    cloudzhou
        86
    cloudzhou  
       8 小时 43 分钟前
    当 cfg 参数足够复杂的时候,不管是 Option ,还是 Builder ,还是简单 Set ,其实没有本质区别
    复杂度不是来源那么几行代码,而是 cfg 已经足够复杂
    tohuer00
        87
    tohuer00  
       8 小时 36 分钟前
    典型的 javaboy 思维,假如有一天……
    等那一天来临的时候重构一下这块代码是简单到不能再简单的事情。那一天可能很久以后才来,也可能永远不来,那么有必要在现在就牺牲可读性做这种设计吗?

    java 的设计理念太多了,其实这些理论也是 java 发展这么多年来非常宝贵的经验,但是很多初学者没有吃透各种设计的本质,只会照本宣科,建议在平时还是要多一些自己的思考。
    Ghostisbored
        88
    Ghostisbored  
       8 小时 36 分钟前
    @rozbo 说得太好了 很多人业务复杂度没到达到用到这些的地步 就开始乱喷 成见太深了
    SingeeKing
        89
    SingeeKing  
    PRO
       8 小时 32 分钟前
    OP 说的是 builder pattern ,下面很多人聊的是 option pattern ,其实不是一个东西
    lizy0329
        90
    lizy0329  
       8 小时 30 分钟前
    这种组合式,可以极大地扩展功能需求吧
    micone
        91
    micone  
       8 小时 30 分钟前   ❤️ 2
    javaer 应该是受设计模式最深的一群人了,builder 模式是一个挺好的东西,有没有可能因为 v2 变得复杂了,为了让代码更清晰,不得不变复杂呢?
    如果 v2 的的代码变成这样你觉得好看不:
    ```
    oss.NewCLient(region, endPoint, Null, Null, "accessKey", "secretKey", Null, Null, Null, Null, True)
    ```
    zzjcool
        92
    zzjcool  
       8 小时 29 分钟前 via iPhone
    虽然但是,这种风格还真不是 java 的🤣很多 sdk 都这样封装,也没见多复杂啊
    phithon
        93
    phithon  
       8 小时 26 分钟前
    很明显 v2 这种更优雅
    crysislinux
        94
    crysislinux  
       8 小时 25 分钟前 via Android
    如果确实需要给使用者代码级别的灵活性,我觉得 provider 还是挺好的。如果最后还是只配置几个字符串,那属实没啥必要。
    tabc2tgacd
        95
    tabc2tgacd  
       8 小时 21 分钟前
    这写法确实离了个大谱,就算以后需要拓展参数,也可以使用对象的方式传入,何必搞这么一长串,看着就头疼。
    iyiluo
        96
    iyiluo  
       8 小时 18 分钟前
    和 java 有毛关系,这种初始化 builder 不挺常见,v1 在参数少的时候很清晰,但是参数多了就行,就可以说自己用不上这些参数,但是 sdk 开发人员肯定要考虑所有参数情况
    Tink
        97
    Tink  
    PRO
       8 小时 13 分钟前
    不管咋设计的,这个设计应该在 api 实现内部去搞吧,为什么要把这东西给到调用方呢
    ccpp132
        98
    ccpp132  
       7 小时 42 分钟前
    @tabc2tgacd client,err := oss.NewClient(&cfg) 这不就是对象传入?哦人家把构造对象的部分放在这里你就嫌他是一长串?
    AlexRoot
        99
    AlexRoot  
       7 小时 40 分钟前
    @rozbo 中肯的,一语中的的。
    lesismal
        100
    lesismal  
       7 小时 39 分钟前   ❤️ 1
    @rozbo #33 #55
    你说的 Option Pattern 相关的,对于这个模式本身、以及它要解决的问题,是能够自圆其说的。

    但放到具体案例,可能并不准确。
    比如就 OP 这个例子而言,绝大多数人 oss.New("endpoint","accesskey","secretkey")就够用了,可以在 New 内部工厂去构造默认值。
    你说的 bool 类型默认值这些默认工厂里已经有了,如果需要额外设置,提供 Get 、Set 也更简单明了,WithXXX 则显得臃肿。

    很多鼓吹 Public 、Private 一定要分离的,对于变更涉及 struct/class 内部复杂逻辑的,我是支持的。
    但对于简单场景,例如简单的配置项,很多都是让代码变得更臃肿。

    官方 slog 出来的晚,有很多人用以前封装好的 log 库、不知道官方 slog 也正常,毕竟三方的一些已经很好且足够用了。标准库的东西很多,自己用不到的也没必要全知道,所以很多楼层里也没必要鄙视。


    > 很多人自己菜的离谱,搞语言歧视,呆在自己的井底

    java 被歧视的非常多,这个是 java 自己的原因造成的,性能和安全等问题且不提,就 java 的代码臃肿是无人能出其右的。
    而且如我前面所言,一个模式为了解决这个模式的理论上能自圆其说,但放到具体案例里并非全然适合,但 java 几乎从不区分这种、凡事皆模式、样样搞臃肿,缺乏从实际出发的精神,逆奥卡姆剃刀而行。
    这不是别人凭空冤枉它。

    更重要的,是 java 社区全家桶对 javaer 工程思维的驯化,与其说驯化,我甚至觉得奴化更贴切。这种奴化使绝大部分 java 工程师的基本功弱化。技术知识非常大,像一个大池子,但多数 javaer 用习惯了社区全家桶、常年徘徊在浅水区。

    所以我觉得,认为 java 没问题本身也是个问题。

    虽然歧视这个词不好,但合理适度的技术语言歧视往往是有根之木,只有因为这些歧视导致不必要的争论和对人的歧视时才更不恰当。

    @realpg BTW, WithCondom 拼写错误 😁
    1  2  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 12:24 · PVG 20:24 · LAX 05:24 · JFK 08:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.