代碼規範、代碼複審、PSP

做業三: 代碼規範、代碼複審、PSP

代碼規範

代碼規範的重要性

1、規範的代碼能夠促進團隊合做 
  一個項目大多都是由一個團隊來完成,若是沒有統一的代碼規範,那麼每一個人的代碼一定會風格迥異。且不說會存在多我的同時開發同一模塊的狀況,即便是分工十分明晰的,等到要整合代碼的時候也有夠頭疼的了。大多數狀況下,並不是程序中有複雜的算法或是複雜的邏輯,而是去讀別人的代碼實在是一件痛苦的事情。統一的風格使得代碼可讀性大大提升了,人們看到任何一段代碼都會以爲異常熟悉。顯然的,規範的代碼在團隊的合做開發中是很是有益並且必要的。 

2、規範的代碼能夠減小bug處理 
  不少IT人士將程序員比作民工,這也的確很是的形象。就像剛纔提到的,複雜的算法或邏輯只佔項目中很小的比例,大多僅僅是壘代碼的工做。但是越是簡單,測試的bug反而是越多,並且是無窮無盡的bug。這裏很大的程度上是因爲代碼不規範所致。沒有規範的對輸入輸出參數的規範,沒有規範的異常處理,沒有規範的日誌處理等等,不但致使了咱們老是出現相似空指針這樣低級的bug並且還很難找到引發bug的緣由。相反,在規範的開發中,bug不但能夠有效減小,查找bug也變得垂手可得。規範不是對開發的制約,而確實是有助於提升開發效率的。 程序員

3、規範的代碼能夠下降維護成本 
  隨着咱們項目經驗的累積,會愈來愈重視後期維護的成本。而開發過程當中的代碼質量直接影響着維護的成本。所以,咱們不得不從開發時便當心翼翼。在第一點中曾提到,規範的代碼大大提升了程序的可讀性,幾乎全部的程序員都曾作過維護的工做,不用多說,可讀性高的代碼維護成本必然會大大下降。可是,維護工做不只僅是讀懂原有代碼,而是須要在原有代碼基礎上做出修改。咱們能夠先想像沒有統一風格的狀況下,A完成開發之後,B進行維護加一段代碼,過一段時間C又加一段代碼。。。。。。直到有一天X看到那一大堆亂碼想死的心都有了,維護也就進行不下去了。所以,統一的風格有利於長期的維護。另外,好的代碼規範會對方法的度量、類的度量以及程序耦合性做出約束。這樣不會出現須要修改一個上千行的方法或者去擴展一個沒有接口的類的狀況。規範的代碼對程序的擴展性提升,無疑也是對維護人員的一個獎勵。 

4、規範的代碼有助於代碼審查 
  我我的是比較贊同進行代碼審查的,這樣能夠及時糾正一些錯誤,並且能夠對開發人員的代碼規範做出監督。團隊的代碼審查同時也是一個很好的學習機會,對成員的進步也是頗有益的。可是,開發隨意,加劇的代碼審查的工做量及難度,而且使得代碼審查工做沒有根據,浪費了大量的時間卻收效甚微。代碼規範不只使得開發統一,減小審查拿督,並且讓代碼審查有據可查,大大提升了審查效率和效果,同時代碼審查也有助於代碼規範的實施。一舉多得,何樂而不爲呢。 

5、養成代碼規範的習慣,有助於程序員自身的成長 
  即便明白代碼規範的好處,可是有的迫於項目壓力,有的由於繁瑣的規範做出不少額外的工做,更有的不重視維護的問題,而很難貫徹代碼規範。那麼,咱們須要瞭解,規範開發最大的受益人實際上是本身!你有沒有花費不少的時候查找本身的代碼呢?尤爲是出現bug的時候須要逐行的debug?本身寫的代碼亂了頭緒的確實也見了很多。咱們應該作的就是規範開發,減小本身出現的錯誤。不少時候項目的壓力一部分也是因爲前期開發中遺留的衆多的問題。還有的人以爲本身能夠完成高難度的算法,就認爲本身能力很強,不把規範放在眼裏。不少人確實是這樣,追求個性,大概讓別人看他的代碼一頭霧水更以爲得意。卻不知複雜的算法確實能夠體現你我的的邏輯能力,可是毫不表明你的開發水平。咱們知道一些開源項目,一些大師級人物寫得程序都是極其規範的。並不是規範了就表明高水平,其實是規範的代碼更有利於幫助你理解開發語言理解模式理解架構,可以幫助你快速提高開發水平。不明白這點,即便你寫的再高明的算法,沒準哪天也被看成亂碼別處理掉。記住!天天壘亂碼(或許你不以爲,可是大多時候在別人眼中確實就是亂碼)並不能使你得到更多的進步,相反要達到高水平的程序員,養成良好的開發習慣是絕對必需的。不要沉迷表面的得失,看似無用的東西要通過慢慢的累積由量變達到質變的時候,你才能感覺到其價值所在。 算法


 

代碼複審

  和我搭檔的是林吉慶同窗,如下是他上次做業階段三的代碼,讓咱們邊看邊發現問題。架構

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace 隨機生成_控制檯
  8 {
  9     class Program
 10     {
 11         static void Main(string[] args)
 12         {
 13             Console.Write("請選擇模式(一、分數 二、整數 三、混合):");//模式選擇
 14             String numType = Console.ReadLine();
 15             switch (numType)
 16             {
 17                 case "1": Fraction(); break;
 18                 case "2": Integer(); break;
 19                 case "3": Mixture(); break;
 20                 default: Console.WriteLine("輸入有誤!");break;
 21             }       
 22             Console.ReadLine();
 23         }
 24         public static void Fraction()//分數模式
 25         {
 26             Console.Write("請輸入生成題目數量:");
 27             String strnum = Console.ReadLine();//接收字符
 28             int num = Convert.ToInt32(strnum);//轉義
 29 
 30             Console.Write("請輸入生成數字上限:");
 31             String strmaxnum = Console.ReadLine();//接收字符
 32             int maxnum = Convert.ToInt32(strmaxnum);//轉義
 33 
 34             Random R = new Random();
 35             int symbol = 0;//運算符
 36             int n1, n2, m1, m2;//分數
 37             for (int i = 0; i < num; i++)//循環輸出
 38             {
 39                 n1 = R.Next(1, maxnum);
 40                 n2 = R.Next(1, maxnum);
 41                 m1 = R.Next(1, maxnum);
 42                 m2 = R.Next(1, maxnum);
 43                 symbol = R.Next(0, 4);
 44                 if (n1 < n2)
 45                 {
 46                     Console.Write(n1 + "/" + n2);
 47                 }
 48                 else if (n1 == n2)
 49                 {
 50                     Console.Write(1);
 51                 }
 52                 else
 53                 {
 54                     Console.Write(n2 + "/" + n1);
 55                 }
 56                 switch (symbol)
 57                 {
 58                     case 0: Console.Write("+"); break;
 59                     case 1: Console.Write("-"); break;
 60                     case 2: Console.Write("*"); break;
 61                     case 3: Console.Write("/"); break;
 62                 }
 63                 if (m1 < m2)
 64                 {
 65                     Console.WriteLine(m1 + "/" + m2 + "=");
 66                 }
 67                 else if (m1 > m2)
 68                 {
 69                     Console.WriteLine(m2 + "/" + m1 + "=");
 70                 }
 71                 else
 72                 {
 73                     Console.WriteLine(1 + "=");
 74                 }
 75             }
 76         }
 77         public static void Integer()//整數模式
 78         {
 79             Console.Write("請輸入生成題目數量:");
 80             String strnum = Console.ReadLine();//接收字符
 81             int num = Convert.ToInt32(strnum);//轉義
 82 
 83             Console.Write("請輸入生成數字上限:");
 84             String strmaxnum = Console.ReadLine();//接收字符
 85             int maxnum = Convert.ToInt32(strmaxnum);//轉義
 86             
 87             Random R = new Random();
 88             int symbol = 0;//運算符
 89             for (int i = 0; i < num; i++)//循環輸出
 90             {
 91                 Console.Write(R.Next(1, maxnum));
 92                 symbol = R.Next(0, 4);
 93                 switch (symbol)
 94                 {
 95                     case 0: Console.Write("+"); break;
 96                     case 1: Console.Write("-"); break;
 97                     case 2: Console.Write("*"); break;
 98                     case 3: Console.Write("/"); break;
 99                 }
100                 Console.WriteLine(R.Next(1, maxnum) + "=");
101             }
102         }
103         public static void Mixture()//混合模式
104         {
105             Console.Write("請輸入生成題目數量:");
106             String strnum = Console.ReadLine();//接收字符
107             int num = Convert.ToInt32(strnum);//轉義
108 
109             Console.Write("請輸入生成數字上限:");
110             String strmaxnum = Console.ReadLine();//接收字符
111             int maxnum = Convert.ToInt32(strmaxnum);//轉義
112 
113             Random R = new Random();
114             int symbol = 0;//運算符
115             int n1, n2, m1, m2;//分數
116             for (int i = 0; i < num; i++)//循環輸出
117             {
118                 if (i < (num / 2))
119                 {
120                     Console.Write(R.Next(1, maxnum));
121                     symbol = R.Next(0, 4);
122                     switch (symbol)
123                     {
124                         case 0: Console.Write("+"); break;
125                         case 1: Console.Write("-"); break;
126                         case 2: Console.Write("*"); break;
127                         case 3: Console.Write("/"); break;
128                     }
129                     Console.WriteLine(R.Next(1, maxnum) + "=");
130                 }
131                 else
132                 {
133                     n1 = R.Next(1, maxnum);
134                     n2 = R.Next(1, maxnum);
135                     m1 = R.Next(1, maxnum);
136                     m2 = R.Next(1, maxnum);
137                     symbol = R.Next(0, 4);
138                     if (n1 < n2)
139                     {
140                         Console.Write(n1 + "/" + n2);
141                     }
142                     else if (n1 == n2)
143                     {
144                         Console.Write(1);
145                     }
146                     else
147                     {
148                         Console.Write(n2 + "/" + n1);
149                     }
150                     switch (symbol)
151                     {
152                         case 0: Console.Write("+"); break;
153                         case 1: Console.Write("-"); break;
154                         case 2: Console.Write("*"); break;
155                         case 3: Console.Write("/"); break;
156                     }
157                     if (m1 < m2)
158                     {
159                         Console.WriteLine(m1 + "/" + m2 + "=");
160                     }
161                     else if (m1 > m2)
162                     {
163                         Console.WriteLine(m2 + "/" + m1 + "=");
164                     }
165                     else
166                     {
167                         Console.WriteLine(1 + "=");
168                     }
169                 }
170             }
171         }
172     }
173 }

      在看到他的代碼的第一眼給個人感受就是格式至關的整齊,使讀者能夠很好的瞭解程序員想要表達的思想,並且在有的地方還加上了一些註釋。可是在對他的程序進行運行測試後也發現了一些問題,這個混合模式爲既有全爲整數也有全爲分數的,但沒有一個式子中分數和整數並存的,並且也沒有作出答案判斷,還需有待增強。dom


 

PSP四則運算耗時

PSP2.1 Personal Software Process Stages Time(min)
Planning  計劃  
  • Estimate
  • 估計這個任務須要多少時間
180
Development 開發  
  • Analysis
  • 需求分析
20
  • Design Spec
  • 生成設計文檔
15
  • Design Review
  • 設計複審(和同事審覈設計文檔)
0
  • Coding Standerd
  • 代碼規範(爲目前的開發制定合適的規範)
5
  • Design
  • 具體設計
60
  • Coding
  • 具體編碼
30
  • Code Review
  • 代碼複審
30
  • Text
  • 測試(自測,修改代碼,提交修改)
30
Reporting 報告  
  • Text Report
  • 測試報告
15
  • Size Measurement
  • 計算工做量
10
  • Postmortem & Process Improvement Plan
  • 過後總結,並提出過程改進計劃
20
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息