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

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

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

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

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

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

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

6843 次点击
所在节点    程序员
56 条回复
boydfd
2016-03-25 11:37:49 +08:00
@expkzb 可能之前我说的有点难理解,再说清楚点,我写的是,三个请求,会调用不同的三个回调函数,在三个回调函数中,调用同一个函数。
老板的意思是,三个回调函数中不要调用相同的函数,都分开写,这样写清晰一点。
所以你的意思应该就是我之前的做法。
heqichang
2016-03-25 11:48:47 +08:00
我也不理解 callback_a()\_b()\_c()调用 a(),b(),c(),如果 a(),b(),c()都一样的话,为啥要分哩。
anerevol
2016-03-25 11:51:17 +08:00
重复的代码可以抽成函数,用组合方式减少重复。
不太清楚以后需求的变化方向,也许不同请求返回接口格式也会发生不同的变化。
JamesRuan
2016-03-25 11:59:22 +08:00
一个函数做一件事,单个函数不要超过一页。

先按这两个原则去改改看看。

Copy & Paste 永远都应该避免的,除非他们表示的其实是不同的东西,只是暂时还是相同而已,这个主要看语义。
mhycy
2016-03-25 12:12:11 +08:00
具体情况具体分析,这个只有当事人理解
注意重用代码的通用程度,如果三个函数都极其通用,那么这部分通用代码可以抽出来
不要在通用函数内部做三个事情的分别处理,如果这么做,这叫增加复杂度

另外楼上的继承其实不能乱用,不是重复代码多就一定要用继承的模式
如果编写的架构不适用于 OOP 思维,强行使用也是会增加复杂度的

剩下就自己判断吧
没贴代码我们不好判断
boydfd
2016-03-25 12:40:05 +08:00
@zhicheng golang 里没有继承啊,只能使用接口来复用,我这里的做法其实和继承是一样的。老板的意思是不要继承,分成三个类。

@jmc891205 没, golang 里面复用是由接口来做的,不需要任何 if else 来判断,只需要针对不同的类型写不同的函数即可

@anerevol 可能返回会发生变化吧。

@JamesRuan 好的

@mhycy 我现在写有点不一样,不是通过抽出通用部分的办法,而是“模板模式”,就是设计模式中的那个,先写好了框架,由于查找 redis 或 MySQL 的语句不是不同么?就是把这个不同,通过 golang 的接口来进行区分。代码的话挺多的,感觉贴不下
mhycy
2016-03-25 12:43:37 +08:00
@boydfd
只是查询语句不同而且差别只在某个标记位的话,可以抽出
cxshun
2016-03-25 12:47:38 +08:00
方法尽量写得通用,一些比较特殊的业务由上层自己去处理,这个应该是尽量去满足的要求,在没法满足的情况下就另外想办法。

实际上你分三个方法去处理,然后调同个函数,这是没问题的啊。但感觉你可以写个大概的代码结构出来,大家会方便知道具体情况哈。
expkzb
2016-03-25 12:58:19 +08:00
@boydfd 原来如此,这我就不太理解你老板的意图了。你的做法以后改起来也灵活啊
dallaslu
2016-03-25 13:31:07 +08:00
都说代码如诗,可是诗歌算是把重复用到了极至。
iniwap
2016-03-25 13:34:21 +08:00
忽然想上那张表情图
9hills
2016-03-25 13:34:59 +08:00
老板说的不对,你说的对。

本质是一个接口,输入是时间,输出是 Data ,为啥要分开。。
mengzhuo
2016-03-25 13:35:16 +08:00
接口和函数不是一个概念啊
接口尽量单参数甚至无参数,这样看的人就比较清楚
函数自然不重复
你老板水平有限就这么简单
phx13ye
2016-03-25 13:38:18 +08:00
你老板不懂 dry
calease
2016-03-25 13:38:25 +08:00
DRY 不是说代码一定不能重复。
而是代码要简明扼要。
所以 copy paste 并不一定是坏毛病,
花时间构建通用的方法也并不一定就是最好的实现方式。
很多人都有这种误区。
至于楼主的个例,没有 context 无法判定。
楼主不妨和人交流交流,对于对方的回答多问问为什么。不要别人说什么你就好的好的回头问其他人对不对。
boydfd
2016-03-25 13:47:41 +08:00
@calease 我之前和老板已经讨论过,我是坚持自己这么写好,但是他只说它们是不一样的东西,就是因为他没有给我关键的理由,所以我才来这里问的啊。 copy paste 最大的坏处我就是觉得改动需要去三个地方改,不能统一进行更改,这样不仅麻烦,而且觉得会出错。
chuhemiao
2016-03-25 14:08:35 +08:00
这你能忍!
yxaaa123
2016-03-25 14:11:47 +08:00
IDEA 里直接大黄色浪线给标出来,一般人都没法忍
wuyadong
2016-03-25 14:35:06 +08:00
你是对的,但你 boss 怎么说你就按他的做。
ybh37
2016-03-25 15:31:56 +08:00
接口 必须是 3 个不同的
但是实现的时候,你可以使用一个公共函数统一处理。

你可以理解为原先一个函数,现在拆成了 4 个

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

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

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

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

© 2021 V2EX