程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 函數的設計之我見

函數的設計之我見

編輯:關於C語言


對於面向過程你有著怎樣理解的?又是如果理解函數這一概念呢?
眾所周知,C語言是面向過程的,如何在使用C在編寫代碼過程中體現這些過程呢?我的理解是:我們通過函數來體現種種過程。一個完整的C程序通過一個又一個的函數調用來完成自身的全部工作,函數設計得不好,你就等著後面維護的人罵吧。
函數的設計關乎程序是否能讓人正確理解,從而進一步的維護。最典型的一個缺陷就是函數承載了太多的任務(我就曾在項目中見過臃腫到幾千行的程度的函數。顯然這是普通人難以維護的艱巨任務。)
很多的經典教科書與企業的編碼標准中一再說明,一個函數只能完成一到兩件任務,最好一個函數只做好一件事情。一個好的函數封裝能讓我們一目了然的了解這個函數用來干什麼,它需要怎樣的輸入與輸出。

函數通過參數進行輸入,通過返回值將計算結果進行輸出。那麼參數是不是越多越好呢?我不贊同,參數越多,說明需要函數需要完成的事情就越多,失去了簡潔緊湊的特點。而且,我們往往容易將參數的位置弄錯,而帶入了不易發現的錯誤,如果此事再將編譯警告完全關閉,就等著犧牲你的節假日用來debug吧。
參數最好能控制在兩到三個最好,參數太多,一個不方便使用,沒有說明很容易用錯(總會有些家伙喜歡制造垃圾代碼而不留一點注釋)。實在太多就打包一個結構體帶個地址進去就行了。
例如select函數,
在使用這種函數以前,勸你仔細閱讀一下他們的長篇使用說明,還有一系列的宏定義。因為你直接復制過別人代碼有可能是一堆錯誤
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);

int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);
絕大部分標准庫函數的參數都在四個以下,簡單易懂,使用方便。
函數體最好能在一屏內顯示完整,不要翻頁,這些才是令人賞心悅目的函數封裝。
千萬不要讓你的函數又臭又長,被人遺臭萬年。
一個好的函數封裝像一個干淨整潔的美女站在你面前令你百看不厭,一個差勁的設計就像是是又邋遢又丑的女人在糟踐你的眼球,讓你對這個世界感到絕望。

最後舉出一個差勁的反面例子,祝你好運!
void vMErrReport(
SINT4 vlSrvId,
SINT2 vnErrLevel,
SINT8 vnErrPos,
const SCHAR* vsapModuleName,
const SCHAR* vsapFileName,
const SCHAR* vsapErrTitle,
const SCHAR* vsapErrDetail,
SINT4 vlReturnVal,
SINT4 vlSysError)

 

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