ANSI-C物件導向程式設計
前言
沒有萬能的編程技術
沒有只產生正確的結果的程式設計語言
不是每個項目的編程都是從零開始的
物件導向程式設計幾乎是當今包治百病的——雖然它已經發展了超過10年之久。作為一種核心語言,一些技術專家對它的研究已經付出很多,從而形成了很好的編程規則,這些規則我們一直引以為鑒了長達20年之久。C++(Eiffel,Oberon-2,Smalltalk…
由你選擇)是一種新的程式設計語言,因為它是物件導向的——儘管你不需要使用它或許你不想用(或不知道怎麼用),但是你卻能夠使用平凡的ANSI-C
(標準化)像使用這些物件導向語言一樣的方便。在項目當中,僅僅物件導向語言允許代碼重用——雖然一些子程式的思想就像電腦的發展曆史一樣久遠,好的程式員卻總是會利用工具箱或庫來使用這些子程式。
這本書的本意並不是讚揚物件導向程式或批判老的編程規則。我們只是簡單的使用ANSI-C來發掘物件導向語言是怎麼實現的,技巧方法是什麼,為什麼它能夠協助我們解決比較大的問題,和我們怎麼能利用普遍性方法和編程來更早的捕獲錯誤。沿著這麼一個宗旨,我們會邂逅一些行話—類,繼承,執行個體,連結,方法,對象,多態等等—不過我們剝去其神奇的外衣,看如何轉化為一種我們一直都知道和做過的事情。
我很樂意的發掘ANSI-C(標準化)是一種全面的物件導向語言。為了能夠分享這種樂趣,在你開始之前,你需要適當的對ANSI-C
有一定的流利程度—熟悉結構體,指標,原型,並且掌握函數指標是必須的。貫穿全文,你會遇見所有的新說法
— 依照Orwell和Webster的話:“設計是為了縮小思想的廣度”—並且我會儘力證明它是怎樣的結合所有的這些你一直想連續使用的好的方法,結果,你很可能成為一個精通ANSI-C的程式員。
前六章建立ANSI-C物件導向程式設計的基礎。我們將以一個隱藏抽象資料結構的很精確的資訊開始,然後通過結構體的擴充,基於動態連結和代碼繼承的方式來增加功能屬性。最終把他們放到一起構成一個可繼承的類使得代碼更加容易維護。
編程需要規則。好的程式遵循很多規則,大量的規則,標準,自我防禦的方式往往能使事情做對做好。程式員要學會使用工具。優秀的程式員編寫工具去處理日常一些編程常式。ANSI-C
物件導向程式要求有一定數量固定的代碼
— 即名稱改變,資料結構沒有變。因此,在第七章我們建立了一個小的前置處理器建立一個必須的樣板,它更像另外一種新的物件導向語言(也許是yanoodl)但是它並不被如此看待,OOC(物件導向程式設計ANSI-C)拓新而出,更讓我們專註於在解決問題上使用創造性方面的一種新技巧。OOC有很強的可塑性。我們設計出它,理解它並且可改變它,能夠依照我們的意願去寫ANSI-C代碼。
接下來的章節中將精鍊我們的技術。在第八章節,我們增加了動態類型檢查預先的捕獲異常。第九章中我們編排了自動初始化機制防止其它缺陷類的產生。第十章,我們介紹了多態以及怎樣相互協作達到簡化的目的。例如:產生標準主程式的日常事務。更多的章節將與使用類的方法,儲存,和載入結構體資料相關聯,這些結構體資料遵循一致性策略。並且通過嵌套異常處理器系統來做到一致性錯誤恢複自愈。
最終,在最後一章節中,我們避開ANSI-C的局限性並且實現了一個滑鼠操作的計算機,首先對於
curses
終端,接下來應用於 X Window
系統(如果你想瞭解什麼事curses
和x window
查閱相關資料)。
這個例子清晰的證明了我們使用類和對象所做的設計和執行個體的優美性,雖然我們必須處理外在的庫和類層次特性。
在每個章節的前面都有一個概要說明,在這個概要中我會給出一個綱要,來介紹章節中的主要內容和接下來該做什麼,這對於略讀此章的讀者很有協助。大部分章節建議做一下練習;但是這並不意味著很正規,因為我們是從零開始建立這樣的技術。我已經避免製造和使用龐大的類庫,即使一些例子這樣做似乎很有利。如果你想更好的理解物件導向程式設計,掌握這項技術和考慮代碼設計顯得尤為重要;依靠其他人的類庫來做開發是稍後小菜一碟的事。
這本書的一個重要的組成部分是附上了代碼磁碟片----
使用DOS檔案系統,包含了單獨的SHELL命了來建立所有章節中的代碼。磁碟片上有一個ReadMe
檔案----再你產生代碼之前先來閱讀一下它。編程,就像使用如
diff 的程式,跟蹤基類的演變對你會很有好處的。OOC在接下來的章節中會有很好的體現。
這些技術的描述出自我對C++的覺悟,當我需要使用物件導向技術去實現互動式程式設計語言時。並且意識到在C++中不能鑄造一個攜帶型的執行個體。我轉向我所瞭解的,即ANSI-C,我能夠完全做我必須做的。我已經在教學過程中把這項技術分享給很多人,包括我的工作場所。而且其他人已經使用這些方法很好了完成了他們的工作。這本書就駐留於此,因為對我的腳註卻顯得尤為暗淡。Brian
Kernighan ,我的出版社,Hans-Joachim Niclas和John等等,並沒有鼓勵我出版這些筆記(有機會,在適當的時候會從新組織一次),我感謝他們以及協助我去繼續這本書的人,最後,感謝家長控制——並且,不,物件導向機制不會取代“切片麵包”。
Hollage, October 1993
Axel-Tobias Schreiner