同事非让我把代码写成这样,该怎么办?

2016-08-04 13:29:09 +08:00
 tiancaiamao

我们代码提交有比较严格的 review 机制,必须得到两个人以上点赞了,才能够 merge 。

写 lexer 的时候,提交的一段代码,用了个 trie 结构打了张表,遍历得到相应的 token 。

	// search a trie to scan a token
	ch := ch0
	node := &ruleTable
	for {
		if node.childs[ch] == nil || s.r.eof() {
			break
		}
		node = node.childs[ch]
		s.r.inc()
		ch = s.r.peek()
	}


	initTokenByte('>', int('>'))
	initTokenByte('<', int('<'))
	initTokenByte('(', int('('))
	initTokenByte(')', int(')'))
	initTokenByte(';', int(';'))
	initTokenByte(',', int(','))
	initTokenByte('&', int('&'))
	initTokenByte('%', int('%'))
	initTokenByte(':', int(':'))
	initTokenByte('|', int('|'))
	initTokenByte('!', int('!'))
	initTokenByte('^', int('^'))
	initTokenByte('~', int('~'))
	initTokenByte('\\', int('\\'))
	initTokenByte('?', placeholder)
	initTokenByte('=', eq)

	initTokenString("||", oror)
	initTokenString("&&", andand)
	initTokenString("&^", andnot)
	initTokenString(":=", assignmentEq)
	initTokenString("<=>", nulleq)
	initTokenString(">=", ge)
	initTokenString("<=", le)
	initTokenString("!=", neq)
	initTokenString("<>", neqSynonym)
	initTokenString("<<", lsh)
	initTokenString(">>", rsh)

有个同事非要把代码改成这样子,用非常长的 switch-case ,代码丑到暴:

	switch ch0 {
	case '|':
		s.r.inc()
		if s.r.peek() == '|' {
			s.r.inc()
			return oror
		}
		return '|'
	case '&':
		s.r.inc()
		switch s.r.peek() {
		case '&':
			s.r.inc()
			return andand
		case '^':
			s.r.inc()
			return andnot
		}
		return '|'
	case '<':
		s.r.inc()
		ch1 := s.r.inc()
		switch ch1 {
		case '=':
			s.r.inc()
			if s.r.peek() == '>' {
				s.r.inc()
				return '>'
			}
			return '='
		}
		return '<'
	case '!':
		s.r.inc()
		if s.r.peek() == '=' {
			s.r.inc()
			return neq
		}
		return '!'
		case '@':
		return s.startWithAt()
	case '/':
		return s.startWithSlash()
	case '-':
		return s.startWithDash()
	case '#':
		s.r.incAsLongAs(func(ch byte) bool {
			return ch != '\n'
		})
		return s.scan()
	}
	...以下省略几百行的 switch-case
	...

争执在于,他说这样写可读性好,性能高。他认为代码长一点不重要。他认为这样写的代码最直观。 switch-case 里面长一点的缩进提出到函数里就行了。

我认为写成这样可读性一点都不好。性能高的那一点点根本不值得把代码写这么丑。代码长了直接影响阅读。提到函数里不会让总的代码量减少,不会被重用的代码提成函数没太多价值。

现在我没法说服他,他没法说服我,但是他不给赞同就没法合进去。我又不想为了得到赞同把自己不喜欢的代码提交进去。 遇到这种情况我该怎么办?


最后补一个笑话:据说写 C++的人分很多派系,有的人喜欢 boost 。有的人不喜欢 boost ,对付异类很简单,用了 boost 的代码 review 就不给通过,他们合不了代码年底评审打分就低,一直打分低就让他让们走人,于是世界就是美好的大同社会了。

10388 次点击
所在节点    编程
71 条回复
lhbc
2016-08-04 20:14:01 +08:00
我估计你同事初中就有十万行代码的经验
直到他学会循环
a2ex
2016-08-04 20:14:47 +08:00
一半按照你的写法,一半按照他的写法咯
Marlon
2016-08-04 20:55:03 +08:00
大赞你们的公司的开发制度。
exch4nge
2016-08-04 21:03:28 +08:00
性能高是主要需求的话,用第二种方式好些,不好看的问题,其实像楼上有人说的一样,用宏处理一下,估计会好看很多,但我猜估计不会是这种情况。
wupher
2016-08-04 22:06:39 +08:00
你们同事是傻吧……
要么就是他觉得你傻,忽悠你呢……
这不是一眼看过去就知道的事
jon
2016-08-04 22:39:18 +08:00
第二段代码能看么。。。
ianva
2016-08-04 23:06:56 +08:00
估计觉得一般 lexer 都这么写,当是个定式,你写花哨了人家觉得不舒服
PrideChung
2016-08-04 23:59:01 +08:00
这居然还有得争,菜鸟真是最喜欢拿性能来当遮羞布,然而其实连性能的量级都没搞懂
bomb77
2016-08-05 00:22:38 +08:00
是时候 py 交易了 233333333
kooze
2016-08-05 00:25:03 +08:00
要是我直接写汇编干死丫的。
troyl
2016-08-05 05:17:28 +08:00
我们公司也是,必须两个人以上 Approve 才能 Merge 。我一般遇到这种事情就多加 reviewer ,然后等到批准的人够了,就直接 merge 。
jeffw
2016-08-05 08:30:34 +08:00
要啥自行车
Felldeadbird
2016-08-05 08:56:50 +08:00
我就是楼主的同事……然后晒楼主写的代码。哈哈
mazyi
2016-08-05 09:10:43 +08:00
哈哈哈哈哈,第二种直观?就是一个笑话~~~
htfy96
2016-08-05 09:55:49 +08:00
lexer 很多这种大型 switch …可能有几种原因:
- 历史上 lexer 写的很早,对性能要求严格,教科书风格就遗传了下来
- switch 之后要加一些奇怪的处理比较方便

所以这取决于需求
zacard
2016-08-05 10:00:09 +08:00
第二种毫无可读性
marffin
2016-08-05 10:38:52 +08:00
做一下 profiling ,看看性能数据。如果不是差的特别大,让你同事去死。
hydyy
2016-08-05 11:42:26 +08:00
只看颜值~还是第一种吧!
jason19659
2016-08-05 11:48:38 +08:00
反对 switch
102errors
2016-08-05 11:56:27 +08:00
至少很羡慕你们的 review 制度

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

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

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

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

© 2021 V2EX