看得好心累,到处都是 interface 的 go 代码该怎么阅读

2017-10-24 01:54:19 +08:00
 johnsneakers
同事写的一个比较大的功能里面,到处定义的 interface, 平均实现一个 interface 的类方法至少 3 个,大段大段的 if 多层嵌套,看得想自杀。
3911 次点击
所在节点    Go 编程语言
32 条回复
nomoon
2017-10-24 01:58:55 +08:00
if 是在转类型么?试试 case ?(虽然也好不到哪里去。。。
johnsneakers
2017-10-24 02:02:13 +08:00
@nomoon if 嵌套是另外一个恶心的问题, 主要是他调一个 interface 方法有特么至少 3 个结构实现了这个方法, 我得一个一个看, 每个方法都特么乱七八糟 哎醉了
wweir
2017-10-24 07:44:26 +08:00
如果是不带 else 的 if 嵌套,是可以换种写法拉平的。

三种以上具体实现的 interface 不是标准玩法么,要是只有一种实现,去用 interface 那才是恶心。你需要的是对代码的熟悉以及一个高度集成的 IDE
zjsxwc
2017-10-24 08:38:52 +08:00
这个有点恶心, 把 golang 写得和动态语言一样, 后面根本不好维护
nekoyaki
2017-10-24 09:09:51 +08:00
@zjsxwc
我怎么觉得你说反了,虽说不看代码不好说,我第一反应是这人把 golang 写得和 java 一样……
mikulch
2017-10-24 09:17:41 +08:00
@nekoyaki 不会吧 java 很少这么写代码的

golang 这个语言 如果 java 都写不好的人真的不要碰。
nekoyaki
2017-10-24 09:26:14 +08:00
@mikulch
我的意思是 java 特别喜欢过度追求设计模式,别的语言里我感觉是没那么严重。
到 golang 里很多不需要靠设计模式就能完成的逻辑,如果过度追求设计模式,就会写成大量 interface 的过度包装形式了。
ZSeptember
2017-10-24 09:33:03 +08:00
一个 interface 没有多个实现,那还要这个 interface 做什么??
yongzhong
2017-10-24 09:39:26 +08:00
interface 不是本来就是用来抽象然后多实现的吗?
cabing
2017-10-24 09:52:17 +08:00
这样子很难维护~~
你同事在坑你们项目组了。

就不能封装下吗?至少 alias 一下。。
zts1993
2017-10-24 10:05:31 +08:00
goland 可以分析
janxin
2017-10-24 10:14:17 +08:00
interface 不就是做这种抽象的嘛?不是很清楚,可能是 Java 程序员 XD
HarrisonZ
2017-10-24 10:25:59 +08:00
我用 interface 有时候只是为了把不通层的代码分开,不一定有多个实现。我是觉得这样更好读一些。比如 rpc 层只处理 rpc 本身的逻辑,至于数据具体的存取,就放在数据层实现,rpc 层定义自己需要的存取 interface,数据层实现。不一定一个 interface 就一定要有多个实现吧。
SuperMild
2017-10-24 10:26:30 +08:00
静态语言一切都在源代码里定义清楚了,这个 interface 的具体实现是什么,在前面肯定有声明的,很容易搞清楚,另外用好的 IDE 也能帮你自动分析。

还可以善用 godoc,生成 html 文件看,结构非常清晰。
SuperMild
2017-10-24 10:28:41 +08:00
其实问题是项目本身复杂,用了 interface 已经算好的了,不用的话更难看
mengzhuo
2017-10-24 10:30:10 +08:00
明显用错了

比如 io.Reader 就只实现 Reader 的功能,不要再看各个 type 自己的实现才是 interface 的正确用法
jameshuazhou
2017-10-24 10:49:49 +08:00
能用就行了,至于代码、风格、神马之类的,当没有看到就好了。
hjc4869
2017-10-24 10:51:17 +08:00
@SuperMild golang 实现一个 interface 是 implicit 的,不需要声明实现,只要你实现了那几个函数就可以作为 interface 到处传,其实跟动态语言没啥区别,只是用鸭子类型的时候要先说好这个鸭子能干啥。
pubby
2017-10-24 10:59:17 +08:00
用 interface,if 都没毛病。看不到代码我们能说啥
SuperMild
2017-10-24 11:11:37 +08:00
@hjc4869 隐形实现并不影响分析,要当作 interface 用的时候还是必须先声明这个变量是个 interface 并且其具体实现是什么。

例如 var i InterfaceFoo = TypeBar{"hello"} 就说明 i 是一个 interface,其具体实现是 TypeBar。

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

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

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

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

© 2021 V2EX