程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【編程好習慣】避免使用魔數

【編程好習慣】避免使用魔數

編輯:關於C語言

魔數magic number),即在編寫程序時直接在程序中運用數字,而不是采用定義宏或是const變量的方式,圖1是使用了魔數的一個示例程序。其中的64是指Msk的最大字節數。從這一程序中可以看出,Msk的最小字節數是MIN_MSK_LEN,即20。采用魔數的危害有:
   1) 降低了程序的可讀性。有人可能會提出,那加一些注釋不就完了嗎?如果真是采用加注釋的方式,那為什麼不將其定義成一個宏或是const常量呢?要知道查看注釋的效率肯定沒有直接看代碼來得快和方便,也不存在不同步的問題代碼與注釋有可能不同步)。
   2) 如果下一次這個最大值要從64改為128,那得在adjustMask()中對每一處都進行更改。另外,當一個項目較大時,魔數的存在會使得程序維護非常、非常困難。
由此看來,這裡的“魔”不應理解成象“魔法magic)”那樣神奇,而應理解為象“魔鬼monster)”那樣可怕。

example.c
00290: #define MIN_MSK_LEN 20
00291:
00292: int adjustMsk (MskContext* Context)
00293: {
00294:     char temp [64] = {0};
00295:
00296:     if (Context->lenMsk > 64) {
00297:         memcpy (temp, Context->msk + (Context->lenMsk - 64),    64);
00298:         ...
00399:         memcpy (Context->msk, temp, 64);
00300:     }
00301:     else if (Context->lenMsk < MIN_MSK_LEN) {
00302:         return ERROR;
00303:     }
00304:     ...
00305: }圖1

圖2是采用宏之後的版本。其中定義了MAX_MSK_LEN的大小為64,如果其它函數中也需要用到Msk的最大值,那麼也可以引用這一宏。如果下一次想將最大值從64改為128時,只要改MAX_MSK_LEN宏的定義就行了。另外,這種宏定義的存在有利於模塊與模塊之間共享,從而在一定程度上提高重用性。

example.c
00289: #define MIN_MSK_LEN 20
00290: #define MAX_MSK_LEN 64
00291:
00292: int adjustMsk (MskContext* Context)
00293: {
00294:     char temp [MAX_MSK_LEN] = {0};
00295:
00296:     if (Context->lenMsk > MAX_MSK_LEN) {
00297:         memcpy (temp, Context->msk + (Context->lenMsk - MAX_MSK_LEN),
00298:             MAX_MSK_LEN);
00399:         ...
00300:         memcpy (Context->msk, temp, MAX_MSK_LEN);
00301:     }
00302:     else if (Context->lenMsk < MIN_MSK_LEN) {
00303:         return ERROR;
00304:     }
00305:     ...
00306: }
圖2

本文出自 “至簡李雲” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/265730

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved