當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]有些人會(huì)想:只要程序運(yùn)行結(jié)果好,就不管原程序編得怎樣。但絕對(duì)不是這樣的。軟件不是一次性就做完的,有必要做修改,擴(kuò)展等管理。所以原程序要盡量做成易看懂,管理方便。 這樣做,第一是為了軟件開發(fā)者方便,其次還會(huì)影響到軟件的性能。管理不方便的程序不








有些人會(huì)想:只要程序運(yùn)行結(jié)果好,就不管原程序編得怎樣。但絕對(duì)不是這樣的。軟件不是一次性就完的,有必要做修改,擴(kuò)展等管理。所以原程序要盡量做成易看懂,管理方便。

這樣做,第一是為了軟件開發(fā)者方便,其次還會(huì)影響到軟件的性能。管理不方便的程序不會(huì)做出好的軟件。

希望通過這篇文章能學(xué)到好的編程習(xí)慣。要理解這文章的內(nèi)容,你至少要懂得1個(gè)開發(fā)工具語(yǔ)言。這里舉例說明的都是C語(yǔ)言,但你對(duì)C語(yǔ)言沒有了解也不要擔(dān)心。這里說明的是原理而不是特定的語(yǔ)言。

1. 語(yǔ)句要結(jié)束得徹底---(冒號(hào);)

程序員經(jīng)常有的失誤之一是忘記在語(yǔ)句結(jié)束后加一個(gè)冒號(hào)。這樣的問題點(diǎn)不易發(fā)現(xiàn),時(shí)而讓程序員不知所措。編程時(shí)要時(shí)時(shí)注意每個(gè)語(yǔ)句是否以冒號(hào)結(jié)束,雖然不是所有語(yǔ)言都以冒號(hào)結(jié)束。下面有忘記點(diǎn)冒號(hào)的例子。

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

很多的人犯這樣的錯(cuò)誤。不到幾條的程序是不難發(fā)現(xiàn)這樣的問題,但1000條以上的程序里呢?查找那忘記寫冒號(hào)了的語(yǔ)句不會(huì)是很容易的事。記住,結(jié)束一條語(yǔ)句,一定要寫冒號(hào),如同一般文章結(jié)束后點(diǎn)句號(hào)一樣。

還有一種關(guān)于冒號(hào)的失誤是不該寫冒號(hào)的時(shí)候?qū)懨疤?hào)。有經(jīng)驗(yàn)的程序員看到下面例子會(huì)覺得好笑,但筆者確實(shí)看到了很多這樣的失誤。

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

函數(shù)或Method后面是不該寫冒號(hào)的。

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

C語(yǔ)言是不分辨空格的,因此程序也可以不需要空格一直寫下去,但這樣的程序會(huì)是誰(shuí)都看不懂的"很有難度"的程序,請(qǐng)看以下例子:

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

這樣寫,也許會(huì)節(jié)省空間,但不僅別人,編程的本人也會(huì)很難看懂。程序要寫得容易看懂!

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

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

3. 統(tǒng)一使用大括號(hào)和切斷方式

每個(gè)程序員使用大括號(hào)({})和改行的方式都有自己的習(xí)慣,這樣,把程序移交給別人繼續(xù)做的時(shí)候,會(huì)出現(xiàn)混亂。比如以下例子:

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

有些程序員會(huì)這樣寫大括號(hào):

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

筆者是喜歡第二種方式。因?yàn)橐欢握Z(yǔ)句的開始和結(jié)束很明顯。我們不能要求每個(gè)程序員都用某一種方式來編程,但一個(gè)程序里一定要統(tǒng)一。還有,看別人編的程序時(shí)要想到他人編程的習(xí)慣也許與你不同。

4. 不亂用if語(yǔ)句

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

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語(yǔ)句?不是。好的方法是用“switch-case”語(yǔ)句來寫簡(jiǎn)便的程序:

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一致的值,會(huì)執(zhí)行default里定義的作業(yè),上面的例子是要執(zhí)行結(jié)束。

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

很多人經(jīng)常亂用程序切斷。使用三個(gè)以上的切斷是比較難以看懂的程序。請(qǐng)看下面例子:

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");
    }
  }
}

這也許是夸張了,但確實(shí)有很多人真的這樣做。那如何寫得更好一點(diǎn)呢?一種方法是用函數(shù)來分寫:

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);
}

要這樣寫,也許會(huì)增加工作量,但程序編得結(jié)構(gòu)化,容易看懂,而且如果函數(shù)做得更好,也可以在其他地方再使用。

6. 寫好注釋

要養(yǎng)成寫注釋的習(xí)慣。特別是別人難以理解的程序或變量一定要注釋,一個(gè)月后,也許你自己也需要看那注釋呢。

int x = 100;
int y = 1000;

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

你能知道上面的程序意味著什么?如果不知道變量x,y和a指的是什么,那么很難理解。讓我們給它標(biāo)個(gè)注釋再看吧:

/*
* 檢測(cè)損益的程序
*/

int x = 100;
/* x 是賣書的總額*/
int y = 1000
/* y是做書本的費(fèi)用*/
int a;
/* 確認(rèn)是否有贏利*/

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

這樣注釋,不懂C語(yǔ)言的人也會(huì)看懂各語(yǔ)句意味著什么,各變量指的是什么。寫注釋是好習(xí)慣,但不要什么都注釋。注釋是為了好理解,不是為了寫長(zhǎng)編文章。

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");

這樣注釋是浪費(fèi)時(shí)間。一般是定變量或變量值的時(shí)候需要注釋,還有說明程序的目的,使用某個(gè)函數(shù),procedule等的時(shí)候也需要。

7. 起名要合理

程序,變量,procedure,structure等名一定要跟它的內(nèi)容聯(lián)系起來,變量不要起名如”x”,”y”,”z”,也許你會(huì)說筆者在上面舉的例子里也用了x,y等,可筆者這樣做的理由是他不牽涉到其他程序,實(shí)際開發(fā)軟件的時(shí)候,筆者當(dāng)然會(huì)使用有意義的變量名。請(qǐng)看下面例子:

void x(int a, int b)
{
  int z;
  z = a + b;
  printf("z is %d\n", 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 %d\n", total_age);
}

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

8. 確認(rèn)Buffer

要時(shí)時(shí)確認(rèn)對(duì)設(shè)定的排列或變量的大小,以避免數(shù)據(jù)混亂或?qū)е孪到y(tǒng)出問題。請(qǐng)看下面使用者輸入數(shù)據(jù)的例子:

char city[10];
/* 為都市名稱的排列 */
printf("Enter a city name: ");
scanf("%s", city);
printf("City is %s\n", city);

在這里,都市名稱設(shè)定為10字(英文字)以內(nèi)。如果使用者輸入10字以上的都市名稱會(huì)怎么樣呢?可以說程序失敗或覆蓋Buffer里面的數(shù)據(jù)。不管怎樣,不要做冒險(xiǎn)的事,你要檢查文字的長(zhǎng)度:

char city[10];
/*為都市名稱的排列*/
printf("Enter a city name: ");
fgets(city, sizeof(city), stdin);
printf("City is %s\n", city);

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

9. 絕對(duì)不相信使用者

這是很重要的規(guī)律。千萬不要相信將要使用你的軟件的人,不要認(rèn)為使用者會(huì)按你希望的方式來操作,反而把他們想成專門發(fā)現(xiàn)程序毛病的人。舉例說,上面的程序就是為了那些輸入都市名更長(zhǎng)的的使用者而確認(rèn)文字長(zhǎng)度的。

像C語(yǔ)言需要明確的數(shù)據(jù)形式的開發(fā)工具使用者,要記住確認(rèn)輸入數(shù)據(jù)形式和程序數(shù)據(jù)形式是否一致,不然會(huì)出現(xiàn)問題。

磨刀不誤砍材工

以上的編程習(xí)慣是為你自己的方便。實(shí)際編程之前,要多做準(zhǔn)備(分析,設(shè)計(jì))。雖然稍麻煩,但為了編出易懂整齊的程序,不要舍不得花時(shí)間準(zhǔn)備,不然以后會(huì)需要更多的時(shí)間來修改,擴(kuò)展你的程序的。

往期精彩

嵌入式系統(tǒng)軟件架構(gòu)設(shè)計(jì)(長(zhǎng)篇深度好文)

分享一個(gè)非常有用且簡(jiǎn)單C語(yǔ)言測(cè)試框架

分享一個(gè)自己量產(chǎn)項(xiàng)目上的集成測(cè)試軟件MTTEST

使您的軟件運(yùn)行起來: 防止緩沖區(qū)溢出(C語(yǔ)言精華帖)

若覺得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉