代码有重复不应该想尽办法去除重复吗?

2016-03-25 10:24:45 +08:00
 boydfd

我负责用 Go 写一个从 Redis 或 MySQL 中取数据,并且通过 http 协议将数据返回给客户端。

现在有三个查询,分别是当前,分时,分天的数据。因为发现重复的代码很多,所以我就想通过接口来让它们达到泛化的目的。

我现在的流程时这样的,三个 http 请求都使用同一个回调函数,并传入一个接口,通过接口实现 Redis 或 MySQL 部分在查询的时候,三种不同的处理,由于返回结果的数据接口是一样的,所以返回不成问题。

后来我的上司看了之后,说我这样写不好,要我分开写,他的理由是: 1:这三个请求是不同的请求,不要统一处理。 2:这么写的话,别人看我的代码会比较麻烦。

请问,他说的对吗?能否针对他提的两个理由进行分析一下

6887 次点击
所在节点    程序员
56 条回复
rogerchen
2016-03-25 10:36:10 +08:00
给用户的 API 不要搞万能 API , API 的内部实现可以尽量复用相同部分。
just4test
2016-03-25 10:40:23 +08:00
一个内部的可以传入时间段的接口,再另包三个给客户端
repus911
2016-03-25 10:44:17 +08:00
老板说的对...
boydfd
2016-03-25 10:45:32 +08:00
@rogerchen 给用户的 API 不是一样的,三个不同的请求,但是之后调用的是同一个函数。我上司的意思是,三个不同的请求,之后调用三个函数。因为里面处理的过程是完全一样的,所以才想着去重复。
@just4test 上司的意思是内部的这个不能做成传时间段的接口,要分成三个写啊。
crayygy
2016-03-25 10:46:56 +08:00
API 内部实现可以使用调用某个方法去操作数据,但是对于无法看到内部实现的外部人员来说,能够直观的知道自己调用不同的 API 的用途和思路,这样会有更加清晰的逻辑。
学生党个人观点,如果有什么不足的希望能够指正!谢谢。
boydfd
2016-03-25 10:47:26 +08:00
@repus911 好吧,主要是感觉,每次有改动的地方都要在三个地方进行改动。既然他是对的,那就没办法了
boydfd
2016-03-25 10:48:27 +08:00
@crayygy 外部人员肯定是调用不同的 API 啊,不然怎么区分这三种请求方式啊
hitmanx
2016-03-25 10:52:20 +08:00
可以留三个回调 callback_a() callback_b() callback_c()
然后实现一个 xxx_common()

callback_a()\_b()\_c()都调用这个 xxx_common()
crayygy
2016-03-25 10:53:25 +08:00
@boydfd 我是这样的理解的啊不知道是不是。

Interface_A{};
Interface_B{}
Interface_C{}

这三个接口是给用户调用的,在三个接口的实现里,将能够复用的代码抽象成 function(),设置不同的参数调用。这样在修改的时候可以只修改 function()的代码。
repus911
2016-03-25 11:00:49 +08:00
@boydfd 哦 如果是内部还用三个函数接口的话 那要看函数的复杂度了 值不值得重构了(比较重复的话 建议重构)

当然 作为老板提提对外的 API 的意见也就算了 为什么要管我的内部实现?

别人看我的代码,谁来看?真的看不懂?看注释懂不懂?都是不确定的问题
hitmanx
2016-03-25 11:06:59 +08:00
@boydfd 哈才发现是你啊,已经找到工作了?恭喜了!
boydfd
2016-03-25 11:10:50 +08:00
@hitmanx 我的做法就是这样,但是老板说我需要写成 callback_a()\_b()\_c()调用 a(),b(),c()的情况。

@crayygy 不是这样的,是 interface interface_xxx {},然后有三个回调函数 a,b,c 在这里调用 xxx_common(interface_xxx),在 xxx_common 的内部进行针对不同的类型进行处理

@repus911 现在的情况是我都写完了,他让我改成有重复的情况= =
boydfd
2016-03-25 11:11:43 +08:00
@hitmanx 没,就是之前说的实习,用的 golang ,在这里先干着,我的理想还是 c++啊!!!!
jmc891205
2016-03-25 11:17:23 +08:00
看情况而定吧。。复用当然是好的
但也不要为了复用就把可读性搞的一团糟
xuxu
2016-03-25 11:17:47 +08:00
这个看情况,上司或许看到了业务以后每个接口会不一样
boydfd
2016-03-25 11:24:04 +08:00
@jmc891205 我现在已经改完了,改后感觉函数变多了很多,找起来难多了,不知道是不是心理作用

@xuxu 好的,这个确实是一种可能
imn1
2016-03-25 11:26:14 +08:00
大师兄说得对啊
expkzb
2016-03-25 11:32:29 +08:00
"我上司的意思是,三个不同的请求,之后调用三个函数。"
那你在这三个函数中再调用同一个函数如何呢?
zhicheng
2016-03-25 11:34:17 +08:00
你知道什么叫“继承”吗?
jmc891205
2016-03-25 11:37:44 +08:00
@boydfd 定位函数是 ide 或者 editor 的功能吧
我之前见过有的人为了复用一个函数,在函数里有好多 if else 那样就不太好了

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

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

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

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

© 2021 V2EX