如何寫(xiě)出干凈的代碼 代碼越少越干凈嗎?
在我眼中,干凈的代碼就是簡(jiǎn)單、易于理解的代碼。不過(guò)分設(shè)計(jì),模板文件盡可能地少,語(yǔ)義明確。那么,這樣是否就意味著代碼越少越干凈呢?
我不這么認(rèn)為。大多數(shù)情況下,更少的代碼往往語(yǔ)義更模糊,更難理解(因此更難維護(hù))。
當(dāng)我使用jBehave工作和測(cè)試元過(guò)濾時(shí),我寫(xiě)了類似于下面的代碼:
- public Embedder configuredEmbedder() {
- Embedder embedder = super.configuredEmbedder();
- ignoreStoriesAndScenariosWithMetaInformationParameter(embedder, "ignore");
- return embedder;
- }
- private void ignoreStoriesAndScenariosWithMetaInformationParameter(Embedder embedder, String ignoreParameter) {
- embedder.useMetaFilters(Arrays.asList("-" + ignoreParameter));
- }
在之后對(duì)這些代碼的討論中,我的一個(gè)同事表示,他剛剛刪除了一些“沒(méi)有必要”的私有方法,于是代碼變成了這樣:
- @Override
- public Embedder configuredEmbedder() {
- Embedder embedder = super.configuredEmbedder();
- embedder.useMetaFilters(Arrays.asList("-ignore"));
- return embedder;
- }
顯然,方法更短,代碼更少了。對(duì)我們來(lái)說(shuō),使用這樣的類,或許能讓我們?cè)诠ぷ鲿r(shí)對(duì)這個(gè)方法所發(fā)生的變化一目了然。但是如果有新加入項(xiàng)目的人呢,并且 這家伙之前從未使用過(guò)jBehave呢?對(duì)他而言,長(zhǎng)一點(diǎn)的代碼反而可以獲取更多的信息,即使他不知道jBehave是如何工作的,不清楚“元過(guò)濾器”是 什么,不懂minus的意思——但是至少能理解我們想要實(shí)現(xiàn)的目標(biāo)。
當(dāng)我試圖解釋自己的看法時(shí),其他開(kāi)發(fā)人員雖然同意我的觀點(diǎn),但卻認(rèn)為通過(guò)添加注釋也可以達(dá)到相同的效果。是的,我完全同意,添加注釋肯定是有效的。 這只是風(fēng)格問(wèn)題。我個(gè)人不喜歡注釋而已,不過(guò),在上述這種情況下,或許注釋的確是更好的選擇,因?yàn)槲覀兛梢酝ㄟ^(guò)注釋解釋元過(guò)濾器代碼和jBehave層文 件之間的聯(lián)系。
所以***,代碼成了這樣的:
- @Override
- public Embedder configuredEmbedder() {
- Embedder embedder = super.configuredEmbedder();
- // ignore stories and scenarios with meta information parameter @ignore.
- embedder.useMetaFilters(Arrays.asList("-ignore"));
- return embedder;
- }
當(dāng)然你可以說(shuō),這樣一個(gè)小小的事例不值一提。但是,一個(gè)項(xiàng)目的風(fēng)格,我認(rèn)為是非常重要的。你也可以通過(guò)討論具體的例子找到一種普遍的風(fēng)格。也許其他開(kāi)發(fā)人員會(huì)因此而考慮他的代碼是否會(huì)給新加入的同事帶來(lái)困惑,從而去添加注釋,而不是將方法縮成減一行代碼。
結(jié)論
干凈的代碼并不總意味著更少的代碼。所以,你需要在編寫(xiě)更多的小方法和縮減代碼行數(shù)之間權(quán)衡得失。關(guān)于編碼風(fēng)格,以后我會(huì)再發(fā)帖子予以討論。
你更喜歡哪種解決方案,為什么呢?歡迎留下各位的看法。
譯文鏈接:http://www.codeceo.com/article/is-clean-code-less-code.html
英文原文:Is Clean Code less Code?