纠结于service层中函数入参的两种方式

请教一下大佬们,在service层中函数入参,以下两种方式有哪些利弊?

1.所有参数都传过来
Laravel

2.部分参数作为一个数组对象传过来
Laravel

To live is to change the world
附言 1  ·  1年前

感谢大家的回复,已经按照dto的方式,把需要的业务参数封装到一个类当中

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
fatrbaby
最佳答案

《重构·改善既有代码的设计》— 过长的参数

1年前 评论
ycstar (楼主) 1年前
讨论数量: 23

效果都差不多 只是一个简洁点一个多了点 自己开发的话传数组没啥问题,因为你写的大概知道参数,如果是协同开发的话那就老实选传个参,别给别人挖坑

1年前 评论

如果是比较复杂的参数,而且有可能会动态添加的话,是不是用类来传递比较好?类似于java的bean这样子

1年前 评论
CodeUndefined (作者) 1年前
ycstar (楼主) 1年前

如果是编写底层代码,第一种规范,业务代码第一种没必要,而且回头再看调用方法的代码的时候根本不知道参数的每项啥意思,感觉很乱,第二种约定好写好注释就行了

1年前 评论
fatrbaby

《重构·改善既有代码的设计》— 过长的参数

1年前 评论
ycstar (楼主) 1年前

个人更偏向把这些参数设计成类属性,再配上 getter/setter 虽然这样看起来类本身就有点儿啰嗦了

1年前 评论
ycstar (楼主) 1年前
陈先生
abstract public function exampleFunctionName(string $name, int $age, ...$extra_params):void;
1年前 评论

可以做链式调用,类似DB这种

1年前 评论

定义一个 order 模型传进来不就完事了

1年前 评论
DonnyLiu

我们公司现在更偏向于第二种。

1年前 评论

两种方式都不好,根据业务需求分解成多个对象,分别组装,最后传入,比如10个参数变成3个对象这样。参数过多的问题是,难以理解和维护。

1年前 评论
raybon 1年前

我觉得两种都不是很好,第一种参数过多且过于分散(如出发地和目的地可以合并为两个参数,将经纬度包在一起),第二种虽然参数少了,但是对于调用者来说构建 params 数组比较耗费心智,如果不了解业务,只能去读 Service 层的逻辑来来构造 params 数组,代码简单的话还好,如果有几百行,且分布于多个文件中……

我的建议: 将订单所需参数归类,定义为 Class,例如:

class Coordinate {
    public float $latitude;
    public float $longitude;
}

class InitOrderInput {
    public Coordinate $original;
    public Coordinate $destination;
    public string $requestTime;
    public integer $serviceType;
    public string $comment;
}

public function initialOrder(User $user, InitOrderInput $input) {}

这样调用者构造的时候,即便不了解业务也能构造出准确的入参。

1年前 评论
arvin-hermit 1年前

不建议传参过长~

1年前 评论
panda-sir

都不建议 传个对象进来就行 :unamused: 可以参考下py的 dataclass

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!