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

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 就不给通过,他们合不了代码年底评审打分就低,一直打分低就让他让们走人,于是世界就是美好的大同社会了。

10349 次点击
所在节点    编程
71 条回复
yanyandenuonuo
2016-08-04 13:31:49 +08:00
效率高点吧 没啥好争议的
mahone3297
2016-08-04 13:33:53 +08:00
好像。。。确实是 lz 的版本,可读性更好。。。
申请老大仲裁啊。。。最简单。。。
tiancaiamao
2016-08-04 13:34:40 +08:00
@yanyandenuonuo 局部这点写法在效率上区别,对于程序整体而言根本没有差异。
xbb7766
2016-08-04 13:43:21 +08:00
给你同事跪了,那么多 switch … case 简直看的头发昏了要。至于性能一说更是扯, CPU 又不差这点运算能力。
aprikyblue
2016-08-04 13:54:53 +08:00
好像确实是。。。第二个可读性好个毛。。。性能更是扯。。。
endlessroad1991
2016-08-04 14:14:39 +08:00
语言貌似是 go 。

go 有 go generate ,下面那段代码可以用类似你上面那一小段来生成。
BingoXuan
2016-08-04 14:20:12 +08:00
可读性而言,第二个完全不存在可读性。 lz 的粗略一看就知道用来干嘛,你同事的我还要一行行看代码。
jydeng
2016-08-04 14:24:12 +08:00
第二个版本完全没有看的欲望
dubaiyouyue
2016-08-04 14:24:45 +08:00
楼主坚持住啊,一忍成千古包子后面被人随便捏!
ChiangDi
2016-08-04 14:24:47 +08:00
赞,公司制度这么好
moosoome
2016-08-04 14:29:17 +08:00
哈哈~要我真没耐心写那么长
bk201
2016-08-04 14:33:10 +08:00
可以找第三个人打分,结束
tabris17
2016-08-04 14:33:42 +08:00
一般编译器会把 switch 优化成跳转表。 C 语言中如果一定要用超长 switch...case ,一般都用宏定义来优化一下。

go 不清楚。不过这代码不能忍
tiancaiamao
2016-08-04 14:43:37 +08:00
@dubaiyouyue 问题就在于,他不点赞代码很难合进去。
至于被“随便捏”,理论上讲,如果单纯出于报复我以后在他提代码的时候,坚持认为他某个风格有问题不给他点赞。只是从价值观上,不能这么干。一般我 review 别人的代码比较包容,不会太介意写法。


@ChiangDi 我们的代码是开源放在 github 的...被众目暌暌之下,这个问题会更让人纠结。
9hills
2016-08-04 14:46:36 +08:00
@tiancaiamao 找 CodeMaster 啊,所有 code 应该都有 master ,冲突后由 Master 决定

如果 Master 还不支持你,要么忍,要么走
tiancaiamao
2016-08-04 14:58:51 +08:00
@9hills 在写代码方面做的比较民主。也就是按照目前的制度, master 或者说 boss 提代码,也是要经过两个人 review 同意了才能合并的。大概区别在于存在分歧时,说服别人同意会容易一些。

算了我坚持现在的写法,然后争取到其它人的投票吧。
raincious
2016-08-04 15:02:04 +08:00
楼主,现在 3 点,下午茶时间,你可以买个奶茶贿赂下他 LOL
fantasyczl
2016-08-04 16:06:41 +08:00
第二个不光是丑啊,一个函数中的代码太长,好几屏,看都不想看啊,而且容易出错
shimanooo
2016-08-04 16:13:28 +08:00
trie: 动态地自动生成状态机
你同事:静态手动生成状态机
lexer generator :静态自动生成状态机
tiancaiamao
2016-08-04 17:12:15 +08:00
@shimanooo 之前版本就是 lexer generator 生成代码的
但是有些问题,维护性比较差,生成的代码是不可读的。
性能不太好,而介于代码是生成的,不好做优化。

现在正在做重构

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

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

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

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

© 2021 V2EX