方法中要增加参数,但是项目中这个方法很多地方用了,大家会怎么做? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
guyeuro
V2EX    程序员

方法中要增加参数,但是项目中这个方法很多地方用了,大家会怎么做?

  •  
  •   guyeuro 2017-08-16 11:07:56 +08:00 5583 次点击
    这是一个创建于 2997 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方法中要增加参数,但是项目中这个方法很多地方用了,

    这个方法所在的类也通过 dubbo 暴露给其他服务了

    大家怎么做?

    45 条回复    2017-08-17 14:33:57 +08:00
    amon
        1
    amon  
       2017-08-16 11:12:01 +08:00
    重载?
    Morriaty
        2
    Morriaty  
       2017-08-16 11:14:38 +08:00   1
    这就体现函数默认参数的优越性了,当然,如果是 golang,就当我没说。
    guyeuro
        3
    guyeuro  
    OP
       2017-08-16 11:25:44 +08:00
    @Morriaty java
    guyeuro
        4
    guyeuro  
    OP
       2017-08-16 11:26:32 +08:00
    @amon 其他要用这个方法的地方也需要这个增加多个参数的方法,所以重载解决不了
    yibin001
        5
    yibin001  
       2017-08-16 11:28:22 +08:00
    如果当时的参数是一个对象的话,可以通过增加属性来解决。
    如果是基本类型就。。。
    U7Q5tLAex2FI0o0g
        6
    U7Q5tLAex2FI0o0g  
       2017-08-16 11:34:53 +08:00
    php 一般就加默认值
    Qlccks2
        7
    Qlccks2  
       2017-08-16 11:35:07 +08:00
    原 method(param1~paramN){
    掏空
    新 method(param1~paramN,null)
    }
    新 method(param1~paramN,new param){
    原方法实现
    }
    不知道是否可行,尽量避免吧。
    kaulie
        8
    kaulie  
       2017-08-16 11:36:33 +08:00
    1. 有没有可能通过其他参数附带传进来;
    2. 考虑下参数的动态绑定
    SuperMild
        9
    SuperMild  
       2017-08-16 11:42:46 +08:00
    原来已经使用该函数的代码,不需要使用新增参数吧?那可以考虑增加一个函数给新写的代码用。
    liuzhen
        10
    liuzhen  
       2017-08-16 11:55:04 +08:00
    @guyeuro 重载是对的

    你把这个事情理解为这个方法所属服务的升级

    老方法保留 供其他方法调用 保证以前调用它的地方不会出问题

    新方法加参数,升级服务,调用了老方法的服务再升级调用新方法
    0TSH60F7J2rVkg8t
        11
    0TSH60F7J2rVkg8t  
       2017-08-16 12:56:17 +08:00   7
    我个人会采取这种方式来修改接口声明:

    假设原函数: method(param1, param2)

    首先,新增函数: method2(param1, param2, param3)

    然后让原函数 method() 直接内部直接 call method2,并添加默认值的 param3 传递。

    开发文档和源码里标记 method 为 deprecated。并注明将在数个版本后彻底移除该函数,建议使用 method2 替代。
    liyu4
        12
    liyu4  
       2017-08-16 13:04:45 +08:00
    @Morriaty 跟 golang 有什么关系,golang 有方法啊
    SuperMild
        13
    SuperMild  
       2017-08-16 13:21:49 +08:00
    @liyu4 有些动态语言,比如 Javascript,函数的参数是不固定数量的,同一个函数,调用的时候塞两个参数给它也行,塞三个参数给它也行。
    zj299792458
        14
    zj299792458  
       2017-08-16 13:25:3 +08:00 via iPhone
    Java:重载,c:写个和原来一样的方法,以默认参数调用新方法。
    rocksolid
        15
    rocksolid  
       2017-08-16 13:33:51 +08:00
    说重载的估计没理解楼主意思,如果你在 100 个地方调用了这个函数,重载还是要在 100 个地方修改一遍。楼主估计是只想改这函数不想动调用的地方
    misaka19000
        16
    misaka19000  
       2017-08-16 13:53:05 +08:00
    @rocksolid #15 重载为什么要改调用函数?
    Shura
        17
    Shura  
       2017-08-16 13:53:50 +08:00 via Android
    @rocksolid 不需要改调用啊,直接改函数实现。
    if 参数数量等于原来的
    调用原函数
    else
    调用新函数
    nullen
        18
    nullen  
       2017-08-16 13:55:08 +08:00
    @ahhui 同。
    rocksolid
        19
    rocksolid  
       2017-08-16 13:58:03 +08:00
    @misaka19000 楼主不是说了么,原来的地方需要使用增加参数的新函数
    rocksolid
        20
    rocksolid  
       2017-08-16 13:59:12 +08:00
    @Shura 原来使用旧函数的地方全要换新的增加参数的函数
    maowu
        21
    maowu  
       2017-08-16 14:33:03 +08:00 via Android
    @rocksolid 既然需要调用新方法,那调用方本身也就有了修改的需求不是?
    Morriaty
        22
    Morriaty  
       2017-08-16 15:23:02 +08:00
    @liyu4 go 既不支持重载,又不支持函数默认参数
    rocksolid
        23
    rocksolid  
       2017-08-16 15:26:36 +08:00
    @maowu 我觉得楼主就是这个需求 不想修改调用方
    SingleX
        24
    SingleX  
       2017-08-16 15:29:47 +08:00
    看大家回复,终于明白为什么程序员会撕逼,会跟 PM 掐架了。这需求理解的
    dallaslu
        25
    dallaslu  
       2017-08-16 15:47:30 +08:00
    1. 直接重载出一个新方法,保留原有方法,将原有方法的实现转移到新方法中。
    2. 旧方法不需保留时,可以重构( Change Method Signature )方法,并做好参数为 null 的处理。项目中引用该方法的代码会由 IDE 自动修改。
    maowu
        26
    maowu  
       2017-08-16 16:02:46 +08:00 via Android
    @rocksolid 那重载挺合适的呀,为什么不行呢?
    reus
        27
    reus  
       2017-08-16 16:05:38 +08:00
    参数全都传一个 json !爱怎么加怎么加!
    UncleRiver
        28
    UncleRiver  
       2017-08-16 16:13:07 +08:00
    同 @ahhui
    popbones
        29
    popbones  
       2017-08-16 16:25:52 +08:00 via iPhone
    @Morriaty golang 的好处是直接改,编译报错,强迫调用者升级或者锁定旧版本
    junbaor
        30
    junbaor  
       2017-08-16 17:26:31 +08:00
    @reus 这几天组里也有人主张 api 参数全传 json , 不太明白这是什么想法,java 静态强类型语言非要引入弱类型那一套不利于重构的东西。
    eloah
        31
    eloah  
       2017-08-16 17:28:01 +08:00
    def old_function(a, b):
    new_function(a, b, c)

    def new_function(a, b, c):
    pass

    这样就可以了
    fan123199
        32
    fan123199  
       2017-08-16 17:35:57 +08:00
    如果你用 itellij,有个重构 method 的功能,可以加上默认参数。
    tempdban
        33
    tempdban  
       2017-08-16 17:50:06 +08:00 via Android
    @SuperMild 兄弟,点不在这里,golang 是能写出来可变参数的
    SuperMild
        34
    SuperMild  
       2017-08-16 18:15:31 +08:00
    @tempdban 可以是可以,但是意义不一样,通常在 golang 里看到一个函数有可变参数,一般就认为可以随意传一堆参数进去,但楼主的情况那个函数的个数毕竟还是希望固定数量的,毕竟静态类型语言的优势不想轻易丢掉,参数数量和类型最好还是尽量确定。
    annielong
        35
    annielong  
       2017-08-16 18:16:29 +08:00
    没影响啊,如果老项目中的函数都要增加参数,那就重构函数,反正老项目都要改,如果仅仅新的用,那就单独写个新函数
    sampeng
        36
    sampeng  
       2017-08-16 18:19:40 +08:00
    @ahhui 一般我也采用这种方式。不影响原有功能。其实和重载是一个思路
    current
        37
    current  
       2017-08-16 19:01:52 +08:00
    oldFunc
    oldFuncEx
    充分暴露软粉本质
    iFlicker
        38
    iFlicker  
       2017-08-16 19:36:49 +08:00
    瞬间想到了装饰者模式 然后想到了 Kotlin。。。然后才反应过来是方法加参
    owlsec
        39
    owlsec  
       2017-08-16 21:50:22 +08:00
    还是 @ahhui 的方法最好。
    JamesRuan
        40
    JamesRuan  
       2017-08-16 23:48:10 +08:00
    先看需求是不是伪需求,如果不是,那么该重构就重构。

    我不知道 IDE 怎么做,我自己都是 grep,然后用 vim 的:%s/old/new/gc 一个一个改。
    cncqw
        41
    cncqw  
       2017-08-17 04:28:47 +08:00 via iPhone
    php 加默认值 ++1
    cncqw
        42
    cncqw  
       2017-08-17 04:29:56 +08:00 via iPhone
    或者直接在那个方法下面复制粘贴,命名为 function2
    yidinghe
        43
    yidinghe  
       2017-08-17 08:38:13 +08:00 via Android
    写一个同名的新方法即可。
    xrlin
        44
    xrlin  
       2017-08-17 09:32:19 +08:00 via iPhone
    重载
    weakish
        45
    weakish  
       2017-08-17 14:33:57 +08:00
    既然暴露出去了,那就是公开的 API, 除非有非常非常强烈的理由,否则改不了了。

    public 要严格控制,拿不准就别 public. public 的接口、类、方法就好好设计。

    私有的就随意多了,以后随时可以改。IDE 强力的话改起来成本并不高。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3340 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 04:57 PVG 12:57 LAX 21:57 JFK 00:57
    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