五种应该避免的代码注释
酷殼:?http://CoolShell.cn/?
原文:?http://coolshell.cn/?p=2746
?
在酷殼,有很多文章都提到了代碼注釋,如:《十條不錯的編程觀點》、《優質代碼的十誡》、《整潔代碼的4個提示》、《惹惱程序員的十件事》等等。今天,某國外的程序員在這里列舉五種應該避免的程序注釋,我覺得比較有道理,但我覺得有少數幾個觀點也并不絕對。所以,我把原文的這五種應該避免的程序注釋羅列在下面,并放上原作者和我的個人觀點作為比較。希望對大家有用。
一、自戀型注釋
(注:原文為Proud,我覺得“自戀”更好一點)
public class Program {static void Main(string[] args){string message = "Hello World!"; // 07/24/2010 BobConsole.WriteLine(message); // 07/24/2010 Bobmessage = "I am so proud of this code!"; // 07/24/2010 BobConsole.WriteLine(message); // 07/24/2010 Bob} }原文:這樣的程序員對于自己的代碼改動非常驕傲和自戀,所以,他覺得需在在這些自己的代碼上標上自己的名字。其實,一個版本控制工具(如:CVS或Subversion)可以完整地記錄下所有的關于代碼的改動的和作者相關的一切信息,只不過不是那么明顯罷了。
陳皓:我同意原文的觀點。在我的團隊里也有這樣的事情發生。有段時間我認真思考過這樣的事情,是否應該把這樣的事情在代碼中鏟除出去。后來,我覺得,允許這樣的行為并不一定是壞事,因為兩點:
?
所以,基于上述考慮,我個人認為,從代碼的技術角度上來說,這樣的注釋很不好。但從團隊的激勵和管理上來說,這樣的方式可能也挺好的。所以,我并不阻止也不鼓勵這樣的注釋。關鍵在于其是否能有更好的結果。
二、廢棄代碼的注釋
public class Program {static void Main(string[] args){/* This block of code is no longer needed* because we found out that Y2K was a hoax* and our systems did not roll over to 1/1/1900 *///DateTime today = DateTime.Today;//if (today == new DateTime(1900, 1, 1))//{// today = today.AddYears(100);// string message = "The date has been fixed for Y2K.";// Console.WriteLine(message);//}} }原文:如果某段代碼不再使用了,那就應該直接刪除。我們不應該使用注釋來標準廢棄的代碼。同樣,我們有版本控制工具來管理我們的源代碼,在版本控制工具里,是不可能有代碼能被真正的物理刪除的。所以,你總是可以從以前的版本上找回你的代碼的。
陳皓:我非常同意這樣的觀點。只要你是廢棄的,就應該是刪除,而不是注釋掉。注釋并不是用來刪除代碼的。也許你會爭論到,在迭代開發中,你覺得被注釋的代碼很有可能在未來會被使用,但現在因為種種問題暫時用不到,所以,你先注釋著,然后等到某一天再enable它。所以你注釋掉一些未來會有的程序。在這樣的情況,你可以注釋掉這段代碼,但你要明白,這段代碼不是“廢棄”的,而是“臨時”不用的。所以,我在這里提醒你,請不要教條式地在你的程序源碼中杜絕這樣的注釋形式,是否“廢棄”是其關鍵。
三、明顯的注釋
public class Program {static void Main(string[] args){/* This is a for loop that prints the* words "I Rule!" to the console screen* 1 million times, each on its own line. It* accomplishes this by starting at 0 and* incrementing by 1. If the value of the* counter equals 1 million the for loop* stops executing.*/for (int i = 0; i < 1000000; i++){Console.WriteLine("I Rule!");}} }原文:看看上面的例子,代碼比注釋還容易讀。是的,大家都是程序員,對于一些簡單的,顯而易見的程序邏輯,不需要注釋的。而且,你不需要在你的注釋中教別人怎么編程,你這是在浪費時間去解釋那些顯而易見的東西。你應該用注釋去解釋你的代碼功能,原因,想法,而不是代碼本身。
陳皓:非常同意。最理解的情況是你的代碼寫得直接易讀,代碼本身就是自解釋的,根本不需要注釋。這是最高境界。注釋應該說明下面的代碼主要完成什么樣的功能,為什么需要他,其主要算法怎么設計的,等等。而不是解釋代碼是怎么工作的。這點很多新手程序員都做得不夠好。別外,我需要指出的是,代碼注釋不宜過多,如果太多的話,你應該去寫文檔,而不是寫注釋了。
四、故事型注釋
public class Program {static void Main(string[] args){/* I discussed with Jim from Sales over coffee* at the Starbucks on main street one day and he* told me that Sales Reps receive commission* based upon the following structure.* Friday: 25%* Wednesday: 15%* All Other Days: 5%* Did I mention that I ordered the Caramel Latte with* a double shot of Espresso?*/double price = 5.00;double commissionRate;double commission;if (DateTime.Today.DayOfWeek == DayOfWeek.Friday){commissionRate = .25;}else if (DateTime.Today.DayOfWeek == DayOfWeek.Wednesday){commissionRate = .15;}else{commissionRate = .05;}commission = price * commissionRate;} }原文:如果你不得不在你的代碼注釋中提及需求,那也不應該提及人名。在上面的示例中,好像程序想要告訴其它程序員,下面那些代碼的典故來自銷售部的Jim,如果有不懂的,你可以去問他。其實,這根本沒有必要在注釋中提到一些和代碼不相干的事。
陳皓:太同意了。這里僅僅是代碼,不要在代碼中摻入別的和代碼不相干的事。這里你也許會有以下的爭辯:
對于第一點,我覺得這是一種情緒化。如果你的上級提出一些很SB的想法,我覺得你應該做的是努力去和他溝通,說明你的想法。如果這樣都不行的話,你應該讓你的經理或是那個高手很正式地把他的想法和方案寫在文檔里或是電子郵件里,然后,你去執行。這樣,當出現問題的時候,你可以用他的文檔和郵件作為你的免責證據,而不是在代碼里干這些事。
對于第二點,這些需求的聯系人應該是在需求文檔中,如果有人有一天給你提了一個需求,你應該把其寫在你的需求文檔中,而不是你的代碼里。要學會使用流程來管理你的工作,而不是用注釋。
最后,關于故事型的注釋,我需要指出也有例外的情況,我們團隊中有人寫注釋喜歡在注釋或文檔里寫一些名人名言(如?22條經典的編程引言,編程引言補充,Linus Torvalds 語錄 Top 10?),甚至寫一些小笑話,幽默的短句。我并不鼓勵這么做,但如果這樣有利于培養團隊文化,有利于讓大家對工作更感興趣,有利于大家在一種輕松愉快的環境下讀/寫代碼,那不也是挺好的事嗎?
另外,做為一個管理者,有時候我們應該去看看程序員的注釋,因為那里面可能會有程序員最直實的想法和情緒(程序員嘴最臟??)。了解了他們的想法有利于你的管理。
五、“TODO”注釋
public class Program {static void Main(string[] args){//TODO: I need to fix this someday – 07/24/1995 Bob/* I know this error message is hard coded and* I am relying on a Contains function, but* someday I will make this code print a* meaningful error message and exit gracefully.* I just don’t have the time right now.*/string message = "An error has occurred";if(message.Contains("error")){throw new Exception(message);}} }原文:當你在初始化一個項目的時候,TODO注釋是非常有用的。但是,如果這樣的注釋在你的產品源碼中出現了N多年,那就有問題了。如果有BUG要被fix,那就Fix吧,沒有必要整一個TODO。
陳皓:是的,TODO是一個好的標志僅當存在于還未release的項目中,如果你的軟件產品都release了,你的代碼里還有TODO,這個就不對了。也許你會爭辯說,那是你下一個版本要干的事。OK,那你應該使用項目管理,或是需求管理來管理你下一個版本要干的事,而不是使用代碼注釋。通常,在項目release的前夕,你應該走查一下你代碼中的TODO標志,并且做出決定,是馬上做,還是以后做。如果是以后做,那么,你應該使用項目管理或需求管理的流程。
上述是你應該避免使用的注釋,以及我個人的一些觀點,也歡迎你留下你的觀點!
from:?http://blog.csdn.net/haoel/article/details/5782907
總結
以上是生活随笔為你收集整理的五种应该避免的代码注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享成为高效程序员的7个重要习惯
- 下一篇: 如何管理并设计你的口令