V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
darasion
V2EX  ›  程序员

怎样处理这样的函数传参问题?

  •  
  •   darasion · 2013-04-11 17:55:21 +08:00 · 2797 次点击
    这是一个创建于 4004 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以 php 为例:



    假设有个函数是发表文章:
    function post($title, $content) { ... }

    后来可能需要一些改动比如加入一些作者什么的
    function post($title, $author, $content){ ... }

    再后来,再加入了分类:
    function post($title, $auhor, $content, $cat) { .... }

    以此类推。
    这个函数有可能很多地方都在调用,改了签名可能会影响一大堆的地方。这样显然不好。




    于是有人想了个办法:
    function post($data) { ... }
    $data 是个大数组,不论里边怎么变,都不用改动别的代码了。

    但是这又带来另外一个问题:
    我从函数的签名不知道这个函数都能使用哪些参数,违背了一开始封装的初衷,更恼人的是过了几个月之后,代码的作者都不知道这个函数该怎么用了!


    怎么处理这种经常变更的情况呢?
    4 条回复    1970-01-01 08:00:00 +08:00
    skydiver
        1
    skydiver  
       2013-04-11 18:00:38 +08:00
    加入默认参数啊,

    function post($title, $content) { ... }
    改之后变成
    function post($title, $content, $author='skydiver', $cat='default') { ... }
    AlloVince
        2
    AlloVince  
       2013-04-11 18:02:19 +08:00
    OOP

    class Post {
    protected $title;
    protected $content;
    public function getTitle(){}
    public function getContent(){}
    }
    fkccp
        3
    fkccp  
       2013-04-11 19:00:29 +08:00
    默认参数+1
    nkliwenjian
        4
    nkliwenjian  
       2013-04-11 19:12:44 +08:00
    懒得改到最后只会自己吃亏,加参数加到第三个的时候基本上就应该动手重构了。
    重构的话,基本上这个属于典型的参数对象的,把这一堆参数抽象成一个对象,然后传的时候只需要传一个对象就可以了。当然不叫data了,叫article呗,然后里面是article.title,article.content之类的。
    我倒不觉得有很多地方用就很难改。
    函数内部就不说了,调用的地方基本上就是做个正则表达式替换的事情。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1213 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 23:21 · PVG 07:21 · LAX 16:21 · JFK 19:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.