一些程序封装的疑问

2020-04-23 15:42:13 +08:00
 basefas

例如一个获取用户信息的功能,但是可能不同接口需要不同的字段。假设 user 表包含 id, created_at, updated_at, username, password, email 字段,一个接口需要 idusername,另一个接口需要 usernameemail,项目为普通的 mvc 架构,controller 层提供接口,service 层对接 controller 和数据库,现在我能想到的有三种方式,不知道大家平时都怎么使用。

  1. service 层方法查出 user 的全部字段,在 controller 层通过创建新 object,将所需字段赋值给 object
  2. service 层方法参数和返回值设置为 interface,在 controller 层调用时将需要查询的 object 作为参数传入
  3. service 层写两个方法,分别返回不同 object

1 的问题在于需要做额外的赋值操作,2 的话入参结构有不确定性,可能引起问题,3 的话主要是会多些重复代码,但是能保证方法返回可预期,个人比较倾向方法 3 。 其实还有方法 4 就是什么都不处理都返回去,让调用方筛选,不过这个被直接 pass 了。

3121 次点击
所在节点    程序员
30 条回复
WUWENZE
2020-04-23 18:13:57 +08:00
PopRain
2020-04-23 18:16:23 +08:00
如果是 c# ,分别返回不同对象很简单,就动态声明一个对象,包括需要的对象属性即可。java 不熟
Cmdhelp
2020-04-23 18:21:43 +08:00
一个接口一个方法,不混用
MOONYANYI
2020-04-23 18:49:43 +08:00
![Snipaste_2020-04-23_18-46-31.png]( )
yafoo
2020-04-23 19:54:40 +08:00
方法 2,动态传参,最合理。
方法 1,造成很多多余字段。
方法 3,部分接口可以使用。
pastgift
2020-04-23 20:20:52 +08:00
调用方指定需要的字段,统一过滤返回字段,合并成一个接口。
不能面向前端写后端,一个需求一个接口这么做,后端本身要自洽
xuanbg
2020-04-23 20:42:59 +08:00
返回使用不同的 dto 即可,不同类型的转换可以用 A 对象序列化后再反序列化为 B 来转,不需要一个个 get/set
no1xsyzy
2020-04-23 21:19:42 +08:00
@basefas #15 你这样强行缩略并不优雅
Premature optimization is the root of all evil.
neilq
2020-04-23 21:44:11 +08:00
我是 1,3 结合着来的,
关于 1,我不是手动对两个 object 赋值,而是用了相应 mapper 库,c#的话用 AuthMapper 。
但是 1 不能解决返回指定字段,一开始我是让前端参数指定需要的字段,动态得只返回相应字段。后来觉得没有必要,而是根据业务情况,拆分成不同接口,这样语义化比较清晰。基础 get 接口返回一般性的基础字段,最多十几个把。其他字段可能只是具体的某一项业务用到,根据业务语义拆分接口,使用不同的 dto 。
另外补充一句,对于一个对象或者分页类几十条数据,10 个字段和 50 个字段在 http 上的性能损耗几乎可以忽略。对于一次返回几百几千条数据的可以单独优化,没必要在框架上做抽象。
buffzty
2020-04-24 10:16:01 +08:00
我是这样弄的, 查询的时候可以带上 scene 参数. 默认是 defaultScene, 普通人获取自己的详情就是 default, 管理员获取就是 adminScene. 注意要对 scene 做权限检查

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX