1. 程式人生 > >C語言設計與模式(開篇)

C語言設計與模式(開篇)

 關於軟體設計方面的書很多,比如《重構》,比如《設計模式》。至於軟體開發方式,那就更多了,什麼極限程式設計、精益方法、敏捷方法。隨著時間的推移,很多的方法又會被重新提出來。

    其實,就我個人看來,不管什麼方法都離不開人。一個人寫不出二叉樹,你怎麼讓他寫?敏捷嗎?你寫一行,我寫一行。還是迭代?寫三行,刪掉兩行,再寫三行。專案的成功是偶然的,但是專案的失敗卻有很多原因,管理混亂、需求混亂、設計低劣、程式碼質量差、測試不到位等等。就軟體企業而言,沒有比優秀的文化和出色的企業人才更重要的了。

    從軟體設計層面來說,一般來說主要包括三個方面:

    (1)軟體的設計受眾,是小孩子、老人、女性,還是專業人士等等;

    (2)軟體的基本設計原則,以人為本、模組分離、層次清晰、簡約至上、適用為先、抽象基本業務等等;
    (3)軟體編寫模式,比如裝飾模式、責任鏈、單件模式等等。

    從某種意義上說,設計思想構成了軟體的主題。軟體原則是我們在開發中的必須遵循的準繩。軟體編寫模式是開發過程中的重要經驗總結。靈活運用設計模式,一方面利於我們編寫高質量的程式碼,另一方面也方便我們對程式碼進行維護。畢竟對於廣大的軟體開發者來說,軟體的維護時間要比軟體編寫的時間要多得多。編寫過程中,難免要有新的需求,要和別的模組打交道,要對已有的程式碼進行復用,那麼這時候設計模式就派上了用場。我們討論的主題其實就是設計模式。

    講到設計模式,人們首先想到的語言就是c#或者是java,最不濟也是c++,一般來說沒有人會考慮到c語言。其實,我認為設計模式就是一種基本思想,過度美化或者神化其實沒有必要。其實閱讀過linux kernel的朋友都知道,linux雖然自身支援很多的檔案系統,但是linux自身很好地把這些系統的基本操作都抽象出來了,成為了基本的虛擬檔案系統。


    舉個例子來說,現在讓你寫一個音樂播放器,但是要支援的檔案格式很多,什麼ogg,wav,mp3啊,統統要支援。這時候,你會怎麼編寫呢?如果用C++語言,你可能會這麼寫。

  1. class music_file  
  2. {  
  3.     HANDLE hFile;  
  4. public:  
  5.     void music_file() {}  
  6.     virtual ~music_file() {}  
  7.     virtualvoid read_file() {}  
  8.     virtualvoid play() {}  
  9.     virtualvoid stop() {}  
  10.     virtual
    void back() {}  
  11.     virtualvoid front() {}  
  12.     virtualvoid up() {}  
  13.     virtualvoid down() {}      
  14. };  
    其實,你想想看,如果用C語言能夠完成相同的抽象操作,那不是效果一樣的嗎?
  1. typedefstruct _music_file  
  2. {  
  3.     HANDLE hFile;  
  4.     void (*read_file)(struct _music_file* pMusicFile);  
  5.     void (*play)(struct _music_file* pMusicFile);  
  6.     void (*stop)(struct _music_file* pMusicFile);  
  7.     void (*back)(struct _music_file* pMusicFile);  
  8.     void (*front)(struct _music_file* pMusicFile);  
  9.     void (*down)(struct _music_file* pMusicFile);  
  10.     void (*up)(struct _music_file* pMusicFile);             
  11. }music_file;  
    當然,上面的例子比較簡單,但是也能說明一些問題。寫這篇文章的目的一是希望和朋友們共同學習模式的相關內容,另一方面也希望朋友們能夠活學活用,既不要迷信權威,也不要妄自菲薄。只要付出努力,付出汗水,肯定會有收穫的。有些大環境你改變不了,那就從改變自己開始。萬丈高樓平地起,一步一個腳印才能真真實實學到東西。如果盲目崇拜,言必google、微軟、apple,那麼除了帶來幾個唾沫星,還能有什麼受用呢?無非白費了口舌而已。

    希望和大家共勉。