• 请不要在回答技术问题时复制粘贴 AI 生成的内容
guyeuro
V2EX  ›  程序员

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

  •  
  •   guyeuro · Aug 16, 2017 · 5927 views
    This topic created in 3214 days ago, the information mentioned may be changed or developed.

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

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

    大家怎么做?

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

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

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

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

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

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

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

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

    def new_function(a, b, c):
    pass

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

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

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

    私有的就随意多了,以后随时可以改。IDE 强力的话改起来成本并不高。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5798 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 145ms · UTC 02:54 · PVG 10:54 · LAX 19:54 · JFK 22:54
    ♥ Do have faith in what you're doing.