成功軟體開發者的9種程式設計習慣 (轉)

worldblog發表於2007-12-04
成功軟體開發者的9種程式設計習慣 (轉)[@more@]

好的原做出好的

  有些人會想:只要程式執行結果好,就不管原程式編得怎樣。但絕對不是這樣的。軟體不是一次性就作完的,有必要做修改,擴充套件等管理。所以原程式要儘量作成易看懂,管理方便。

  這樣做,第一是為了者方便,其次還會影響到軟體的。管理不方便的程式不會作出好的軟體。

  希望透過這篇文章能學到好的習慣。要理解這文章的內容,你至少要懂得1個開發工具語言。這裡舉例說明的都是C語言,但你對C語言沒有了解也不要擔心。這裡說明的是原理而不是特定的語言。

1. 語句要結束得徹底---(冒號;)

  程式設計師經常有的失誤之一是忘記在語句結束後加一個冒號。這樣的問題點不易發現,時而讓程式設計師不知所措。程式設計時要時時注意每個語句是否以冒號結束,雖然不是所有語言都以冒號結束。下面有忘記點冒號的例子。

int main(void)
{
  /* 沒有冒號,導致問題*/
  printf("Hello World!n")
  return(0);
}

  很多的人犯這樣的錯誤。不到幾條的程式是不難發現這樣的問題,但1000條以上的程式裡呢?查詢那忘記寫冒號了的語句不會是很容易的事。記住,結束一條語句,一定要寫冒號,如同一般文章結束後點句號一樣。

  還有一種關於冒號的失誤是不該寫冒號的時候寫冒號。有的程式設計師看到下面例子會覺得好笑,但筆者確實看到了很多這樣的失誤。

/* main() 後面不該寫冒號 */
int main(int argc, char *argv[]);
{
  printf("Hello World");
  return(0);
}


或Method後面是不該寫冒號的。

2. 要適合使用空格和tab鍵

  C語言是不分辨空格的,因此程式也可以不需要空格一直寫下去,但這樣的程式會是誰都看不懂的"很有難度"的程式,請看以下例子:

if(x==0) {a=b=c=d=MAX; x++;}

  這樣寫,也許會節省空間,但不僅別人,程式設計的本人也會很難看懂。程式要寫得容易看懂!

if(x == 0)
{
  a = b = c = d = MAX;
  x++;
}

  這樣寫,看起來不很清楚嗎?程式要有確切的空格才容易看得懂。

3. 統一使用大括號和切斷方式

  每個程式設計師使用大括號({})和改行的方式都有自己的習慣,這樣,把程式移交給別人繼續做的時候,會出現混亂。比如象以下例子:

int main()
{
  int x = 1;
  int y = 10;
  while(x < y ){
    printf("Value of x is %dn", x);
   x++;
  }
}

有些程式設計師會這樣寫大括號:

int main()
{
  int x = 1;
  int y = 10;
  while(x < y )
  {
    printf("Value of x is %dn", x);
    x++;
  }
}

  筆者是喜歡第二種方式。因為一段語句的開始和結束很明顯。我們不能要求每個程式設計師都用某一種方式來程式設計,但一個程式裡一定要統一。還有,看別人編的程式時要想到他人程式設計的習慣也許與你不同。

4. 不亂用if語句

有些人很喜歡用“if”語句,如下:

if(a == 0)
{
  a++;
  return(a);
}

if(a == 1)
{
  a += 5;
  return(a);
}

if(a == 2)
{
  a += 10;
  return(a);
}

if(a == 3)
{
  a += 20;
  return(a);
}

if(a == 4)
  exit(1);

  有沒有比這更好的辦法呢?else if語句?不是。好的方法是用“switch-case”語句來寫簡便的程式:

switch(a)
{
  case 0: a++;
    return(a);

  case 1: a += 5;
    return(a);

  case 2: a += 10;
    return(a);

  case 3: a += 20;
    return(a);

  default: exit(1);
}

  如果沒有與a一致的值,會default裡定義的作業,上面的例子是要執行結束。

5. 不亂用程式切斷(Block)

  很多人經常亂用程式切斷。使用三個以上的切斷是比較難以看懂的程式。請看下面例子:

int a = 10;
int b = 20;
int c = 30;
int d = 40;

if(a == 10)
{
  a = a + d;
  if(b == 20)
  {
    b = b + a;
    if(c != b)
    {
      c = c + 1;
      if(d > (a + b))
        printf("Made it all the way to the bottom!n");
    }
  }
}

  這也許是誇張了,但確實有很多人真的這樣做。那如何寫得更好一點呢?一種方法是用函式來分寫:

void next(int a, int b, int c, int d)
{
  if(c != b)
  {
    c = c + 1;
    if(d > (a + b))
      printf("Made it all the way to the bottom!n");
  }
}

int main()
{
  int a = 10;
  int b = 20;
  int c = 30;
  int d = 40;

  if(a == 10)
  {
    a = a + d;
    if(b == 20)
    {
      b = b + a;
      next(a, b, c, d);
    }
  }
return(0);
}

  要這樣寫,也許會增加工作量,但程式編得結構化,容易看懂,而且如果函式做得更好,也可以在其他地方再使用。

6. 寫好註釋

  要養成寫註釋的習慣。特別是別人難以理解的程式或變數一定要註釋,一個月後,也許你自己也需要看那註釋呢。

int x = 100;
int y = 1000;

if(x < y)
  a = 0;
else
  a = 1;

  你能知道上面的程式意味著什麼?如果不知道變數x,y和a指的是什麼,那麼很難理解。讓我們給它標個註釋再看吧:

/*
* 檢測損益的程式
*/

int x = 100;
/* x 是賣書的總額*/
int y = 1000
/* y是做書本的費用*/
int a;
/* 確認是否有贏利*/

/* 比較x和y: */
if(x < y)
/* 1指損失 */
  a = 1;
else
/*0指贏利 */
  a = 0;

  這樣註釋,不懂C語言的人也會看懂各語句意味著什麼,各變數指的是什麼。寫註釋是好習慣,但不要什麼都註釋。註釋是為了好理解,不是為了寫長編文章。

int profit = 1;
/* 贏利等於1 ?? */
int loss = 0;
/* 虧損等於 0 ?? */

/* 如果贏利等於1 */
if(profit == 1)
  /* 列印出“得贏利啦”??*/
  printf("We made a profit!n");
/* 如果不是 */
  else
  /*列印出“我們虧損啦”*/
  printf("We made a loss!n");


  這樣註釋是浪費時間。一般是定變數或變數值的時候需要註釋,還有說明程式的目的,使用某個函式,procedule等的時候也需要。

7. 起名要合理

  程式,變數,procedure,structure等名一定要跟它的內容聯絡起來,變數不要起名如”x”,”y”,”z”

  也許你會說筆者在上面舉的例子裡也用了x,y等,可筆者這樣做的理由是他不牽涉到其他程式,實際開發軟體的時候,筆者當然會使用有意義的變數名。請看下面例子:

void x(int a, int b)
{
  int z;
  z = a + b;
  printf("z is %dn", z);
}

  在這,我們可以知道x做什麼,但不知道它意味著什麼。a,b,z也一樣。讓我們稍微改過來再看吧:

void sum_of_ages(int jacks_age, int jills_age)
{
  int total_age;
  total_age = jacks_age + jills_age;
  print("total_age is %dn", total_age);
}

  雖然沒有註釋,但容易看出來要做什麼。起名起得好,沒有註釋也可以。

8. 確認Buffer

  要時時確認對設定的排列或變數的大小,以避免資料混亂或導致出問題。請看下面使用者輸入資料的例子: char city[10];
/* 為都市名稱的排列 */

printf("Enter a city name: ");
scanf("%s", city);
printf("City is %sn", city);

  在這裡,都市名稱設定為10字(英文字)以內。如果使用者輸入10字以上的都市名稱會怎麼樣呢?可以說程式失敗或覆蓋Buffer裡面的資料。不管怎樣,不要做冒險的事,你要檢查文字的長度:

char city[10];
/*為都市名稱的排列*/

printf("Enter a city name: ");
fgets(city, sizeof(city), stdin);
printf("City is %sn", city);

  上面已修改的程式是:如果使用者輸入10字以上的都市名,只接受Buffer能接受的長度為止,其外的會不接受。

9. 絕對不相信使用者

  這是很重要的規律。千萬不要相信將要使用你的軟體的人,不要認為使用者會按你希望的方式來操作,反而把他們想成專門發現程式毛病的人。舉例說,上面的程式就是為了那些輸入都市名更長的的使用者而確認文字長度的。

  象C語言需要明確的資料形式的開發工具使用者,要記住確認輸入資料形式和程式資料形式是否一致,不然會出現問題。

磨刀不誤砍材工

  以上的程式設計習慣是為你自己的方便。實際程式設計之前,要多做準備(分析,設計)。雖然稍麻煩,但為了編出易懂整齊的程式,不要捨不得花時間準備,不然以後會需要更多的時間來修改,擴充套件你的程式的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988078/,如需轉載,請註明出處,否則將追究法律責任。

相關文章