Time of Update: 2018-12-05
.不要以為注釋好寫,有一些演算法是很難說或寫出來的,只能意會,我承認有這種情況的時候,但你也要寫出來,正好可以訓練一下自己的表達能力。而表達能力正是那種悶頭搞技術的技術人員最缺的,你有再高的技術,如果你表達能力不行,你的技術將不能得到充分的發揮。因為,這是一個團隊的時代。/*************************************************************************
Time of Update: 2018-12-05
確定在uses子句中增加DDEMan。uses windows, ddeman, ......function Get_URL(Servicio: string): String;var Cliente_DDE: TDDEClientConv; temp:PChar; file://<<----------------這是新的begin Result := ''; Cliente_DDE:= TDDEClientConv.Create( nil );
Time of Update: 2018-12-05
——————————千萬不要忽略了頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C檔案,這兩個C檔案都include了同一個標頭檔。而編譯時間,這兩個C檔案要一同編譯成一個可運行檔案,於是問題來了,大量的聲明衝突。還是把標頭檔的內容都放在#ifndef和#endif中吧。不管你的標頭檔會不會被多個檔案引用,你都要加上這個。一般格式是這樣的: #ifndef <標識> #define <標識> ...... ......
Time of Update: 2018-12-05
原始碼如下:<HTML><HEAD><TITLE>示範</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"></HEAD><BODY bgColor=#ffffff><p><OBJECT id=yancey style="LEFT: 0px; TOP: 0px"
Time of Update: 2018-12-05
我看見你說了,這有什麼好說的。還是先看一段程式碼吧。 if ( ch >= '0' && ch <= '9' ){ /* 正常處理代碼 */ }else{ /* 輸出錯誤資訊 */ printf("error ....../n"); return ( FALSE ); }這種結構很不好,特別是如果“正常處理代碼”很長時,對於這種情況,最好不要用else。先判斷錯誤,如: if ( ch &
Time of Update: 2018-12-05
—————————可能許多人對記憶體配置上的“棧 stack”和“堆
Time of Update: 2018-12-05
————————接上一條,變數一定要被初始化再使用。C/C++編譯器在這個方面不會像JAVA一樣幫你初始化,這一切都需要你自己來,如果你使用了沒有初始化的變數,結果未知。好的程式員從來都會在使用變數前初始設定變數的。如: 1) 對malloc分配的記憶體進行memset清零操作。(可以使用calloc分配一塊全零的記憶體) 2) 對一些棧上分配的struct或數組進行初始化。(最好也是清零)
Time of Update: 2018-12-05
—————————你會處理出錯資訊嗎?哦,它並不是簡單的輸出。看下面的樣本: if ( p == NULL ){ printf ( "ERR: The pointer is NULL/n" ); } 告別學生時代的編程吧。這種編程很不利於維護和管理,出錯資訊或是提示資訊,應該統一處理,而不是像上面這樣,寫成一個“寫入程式碼”。第10條對這方面的處理做了一部分說明。如果要管理錯誤資訊,那就要有以下的處理: /* 聲明出錯代碼 */ #define
Time of Update: 2018-12-05
—————————————————————有人說,最好的程式員,就是最喜歡“偷懶”的程式,其中不無道理。如果你有一些程式的程式碼片段很相似,或直接就是一樣的,請把他們放在一個函數中。而如果這段代碼不多,而且會被經常使用,你還想避免函數調用的開銷,那麼就把他寫成宏吧。千萬不要讓同一份代碼或是功能相似的代碼在多個地方存在,不然如果功能一變,你就要修改好幾處地方,這種會給維護帶來巨大的麻煩,所以,做到“一改百改”,還是要形成函數或是宏。
Time of Update: 2018-12-05
—————————————————看一下下面這個例子: for( i=0; i<1000; i++ ){ GetLocalHostName( hostname ); ... }
Time of Update: 2018-12-05
如果一個比較複雜的運算式中,你並不是很清楚各個操作符的憂先級,即使是你很清楚優先順序,也請加上括弧,不然,別人或是自己下一次讀程式時,一不小心就看走眼理解錯了,為了避免這種“誤解”,還有讓自己的程式更為清淅,還是加上括弧吧。比如,對一個結構的成員取地址: GetUserAge( &( UserInfo->age )
Time of Update: 2018-12-05
————————————我看到許多程式對變數名和函數名的取名很草率,特別是變數名,什麼a,b,c,aa,bb,cc,還有什麼flag1,flag2, cnt1, cnt2,這同樣是一種沒有“修養”的行為。即便加上好的注釋。好的變數名或是函數名,我認為應該有以下的規則: 1) 直觀並且可以拼讀,可望文知意,不必“解碼”。 2) 名字的長度應該即要最短的長度,也要能最大限度的表達其含義。 3)
Time of Update: 2018-12-05
———————————對於一些函數中的指標參數,如果在函數中唯讀,請將其用const修飾,這樣,別人一讀到你的函數介面時,就會知道你的意圖是這個參數是[in],如果沒有const時,參數表示[in/out],注意函數介面中的const使用,利於程式的維護和避免犯一些錯誤。雖然,const修飾的指標,如:const char*
Time of Update: 2018-12-05
————————————向函數傳參數時,一般而言,傳入非const的指標時,就表示,在函數中要修改這個指標把指記憶體中的資料。如果是傳值,那麼無論在函數內部怎麼修改這個值,也影響不到傳過來的值,因為傳值是只記憶體拷貝。什嗎?你說這個特性你明白了,好吧,讓我們看看下面的這個常式:voidGetVersion(char* pStr){ pStr = malloc(10); strcpy ( pStr, "2.0" );}main(){ char* ver = NULL;
Time of Update: 2018-12-05
—————————————————函數的參數個數最好不要太多,一般來說6個左右就可以了,眾多的函數參數會讓讀代碼的人一眼看上去就很頭昏,而且也不利於維護。如果參數眾多,還請使用結構來傳遞參數。這樣做有利於資料的封裝和程式的簡潔性。也利於使用函數的人,因為如果你的函數個數很多,比如12個,調用者很容易搞錯參數的順序和個數,而使用結構struct來傳遞參數,就可以不管參數的順序。而且,函數很容易被修改,如果需要給函數增加參數,不需要更改函數介面,只需更改結構體和函數內部處理,而對於調用函數的程式來說
Time of Update: 2018-12-05
———————————當你維護別人的程式時,請不要非常主觀臆斷的把已有的程式刪除或是修改。我經常看到有的程式員直接在別人的程式上修改運算式或是語句。修改別人的程式時,請不要刪除別人的程式,如果你覺得別人的程式有所不妥,請注釋掉,然後添加自己的處理常式,必竟,你不可能100%的知道別人的意圖,所以為了可以恢複,請不依賴於CVS或是SourceSafe這種版本控制軟體,還是要在源碼上給別人看到你修改程式的意圖和步驟。這是程式維護時,一個有修養的程式員所應該做的。如下所示,這就是一種比較好的修改方法:
Time of Update: 2018-12-05
在軟體產品的研發過程中,軟體品質一直處於最為核心的地位。軟體企業能否順利發展需要多方面的努力,其中軟體品質保障在其發展過程中佔有非常重要的位置。對於一個軟體項目而言,由於所呈現的大多是腦力勞動成果的形式,很大程度上取決於項目群組成員的集體智慧、編碼水平和群體貢獻。所以從軟體項目的開始到結束(發布)過程中的動態不確定因素很多,這必然極大地增加了項目品質控制的難度,使得在按時提交軟體產品的前提下有效保障軟體品質成為了一個比較棘手的問題。 不同的項目組對品質保障問題的解決方案肯定不盡相同,下面我
Time of Update: 2018-12-05
——————————————我看到很多程式寫函數時,在函數的傳回型別方面不太注意。如果一個函數沒有傳回值,也請在函數前面加上void的修飾。而有的程式員偷懶,在返回int的函數則什麼不修飾(因為如果不修飾,則預設返回int),這種習慣很不好,還是為了原代碼的易讀性,加上int吧。所以函數的傳回值類型,請不要省略。另外,對於void的函數,我們往往會忘了return,由於某些C/C++的編譯器比較敏感,會報一些警告,所以即使是void的函數,我們在內部最好也要加上return的語句,這有助於代碼的
Time of Update: 2018-12-05
—————————N年前,軟體開發的一代宗師——迪傑斯特拉(Dijkstra)說過:“goto statment is harmful !!”,並建議取消goto語句。因為goto語句不利於程式碼的維護性。這裡我也強烈建議不要使用goto語句,除非下面的這種情況: #define FREE(p) if(p) { / free(p); / p = NULL; /
Time of Update: 2018-12-05
——————很多程式員不知道C中的“宏”到底是什麼意思?特別是當宏有參數的時候,經常把宏和函數混淆。我想在這裡我還是先講講“宏”,宏只是一種定義,他定義了一個語句塊,當程式編譯時間,編譯器首先要執行一個“替換”來源程式的動作,把宏引用的地方替換成宏定義的語句塊,就像文字檔替換一樣。這個動作術語叫“宏的展開”使用宏是比較“危險”的,因為你不知道宏展開後會是什麼一個樣子。例如下面這個宏: #define MAX(a, b) a>b?a:b當我們這樣使用宏時,沒有什麼問題: