最近網友問到這一問題,但我更希望被問的是“C程序員需要學面向對象編程嗎?”,那就讓我先從回答這一問題開始,并做適當的擴展。
就我的成長經歷來看,C程序員必須學習面向對象編程!面向對象編程語言有其天然的一個優勢 — 將軟件世界的一切象現實世界那樣視為對象。我在《專業嵌入式軟件開發》一書的《設計,質量之本》一章中指出,軟件設計的一個原則是“以人為本”,在軟件世界中構建現實世界就能很好地貫徹這一原則,而對象在編程語言中的引入提供了設計便利性。對象的引入使得編程語言具有更具結構化的表達能力,這有助于提高程序的可維護性。
從C程序員的角度來看,通過使用對象能讓程序更具模塊性,而模塊化是我們所倡導的很重要的軟件開發方法之一。一旦掌握面象對象編程,C程序員的設計能力通常會有較大幅度的提升。這種提升使得即便是用C語言編程也能寫出更具模塊化的代碼。這是我主張C程序員一定要學習面向對象編程的根本原因。
然而,盡管面向對象編程這種方法有其優勢,但學習起來并不那么的容易,尤其對于從C語言過渡到C++的程序員。學習的第一個難點在于,面象對象編程與面向過程編程(指C語言)具有完全不同的思維方式。其差異性類似于對于使用拼音輸入法的人來說第一反應是為字拼音,而使用五筆輸入法的第一反應卻是將字拆成字根。象練習五筆輸入法那樣,學習面向對象編程需要一定的時間通過模仿和實踐去掌握面向對象的思維方法。在沒有掌握面向對象編程方法之前,我們會認為它比面象對象編程復雜,且覺得很繞。然而,一旦掌握,你會發現它又是那樣的自然。
學習的第二個難點,在于C++語言本身上。C++編程語言應是最復雜的系統編程語言,這可從《Effective C++》、《More Effective C++》、《Exceptional C++》和《More Exceptional C++》等書加起來有近200個編程規則可以看出。語言的復雜性增加了掌握它的難度。如果不使用像pc-lint這樣的靜態分析工具,我們很難寫出專業的C++程序。
除了C++語言本身的復雜性,C程序員在轉向C++時,由于C++對C語言語法的兼容,使得我們容易犯使用C++編寫面向過程程序的錯誤。這在某種程度上不利于我們更快地掌握面向對象編程。
優雅的編程語言有助于收斂我們的編程行為,從而寫出更好的程序。但真正決定程序可讀性的,是程序員的邏輯思維是否清晰和表達是否精確。再好的編程語言,邏輯混亂和表達不精確的程序員一定會將程序寫成“狗皮膏藥”。從這一點來看,盡管C++倍受爭議,但還是值得C程序員去掌握。另外,在一個C項目上我們可以無縫地使用C++,相信這是C程序員選擇C++很重要的原因。