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

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

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

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

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

    大家怎么做?

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

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

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

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

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

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

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

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

    def new_function(a, b, c):
    pass

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

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

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

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