課間休息後,引號迫不及待發問:「面向對象不就是特殊的命令式嗎?」冒號搖頭:「姑且叫它 OO 或對象式。OOP 核心思想可泛化為:以數據為中心組織邏輯,將系統視為相互作用的對象集合,利用繼承與多態增強重用性。這種思想能應用到函數式、邏輯式中——只是把方法從過程換成函數或斷言。命令式、函數式、邏輯式互相平行,而 OOP 與它們正交。」
問號問:「十二種流行語言只有 C 非 OO,OOP 要一統天下了?」
冒號糾正:「VB(除 .NET)、JavaScript 只是基於對象,非純 OO。OOP 不會一統天下:第一,純粹 OOP 不存在,必須結合其他範式;第二,沒有銀彈。OOP 適合大型複雜、交互式、與現實緊密相關的系統,但在小型應用、數學計算、符號處理無優勢。語言流行與大公司商業推動密切相關——有人戲稱 OOP 其實是 MOP(Money-Oriented Programming)。」
逗號背誦教科書:「OOP 提高可重用性、可擴展性、靈活性。」冒號反問:「為什麼過程式就差了?C 用 static 實現信息隱藏,用組合代替繼承,多態也有變通。設計合理,C 程序同樣具備這三性,效率還更高。操作系統、數據庫等大型軟體仍以 C 為主,足證其堪大用。」
見逗號語塞,冒號語氣緩和:「我不反對 OOP,但希望大家少點人云亦云,多點獨立思考。」
引號回答設計理念差異:「過程式重過程,自頂向下、逐步求精;OOP 重數據,自底向上、逐步實現。」
冒號以倒樹比喻:過程式像分析法(執果索因),從樹根(主函數)向下分支;OOP 像綜合法(執因索果),從樹葉(對象)向上合併。句號補充:「樹根近用戶需求,過程式一旦需求變更,從根波及到葉,維護困難;OOP 從葉開始,抽象度高,受影響小,易維護重用。」
歎號指出:「OOP 以對象為基本模塊,模擬現實實體,更自然人性化。」冒號贊同:「OOP 最大賣點雖是重用性,但相比其他範式並無明顯優勢。真正深入人心的是更接近人類認知模式——編程者更容易、更樂於用這種方式編程。」
API 簡潔性對比:Win32 API、OCI 參數動輒十餘個,名稱冗長晦澀;Java API 則平易近人。冒號解釋:「Java 把接口粗粒度化了。C 函數無狀態,包裝後接口不如 Java 簡潔,但應更高效。OOP 本質是將相關函數用數據粘合、重新包裝、貼上對象標簽——與其說更具重用性,不如說更具易用性。」
冒號設問:「收音機、電視機(電器產品)重用性高,還是電阻、電容(元件)高?」歎號答:「元件。」冒號總結:「元件功能單一如函數,產品封裝多元件如對象。元件可用於不同產品,重用性高;產品重用性低,但易用性高。」
「對無獨立思考習慣者,認同理論實則認同權威。你們可懷疑我觀點,但絕不可放棄自己思考——這就是第一課提到的批判精神。」
冒號收尾:「過程式世界是君主制——主函數是國王,函數是臣民,等級分明,為國王服務;OO 世界是民主制——對象是獨立平等公民,有權保護財產隱私、尋求服務,有義務提供承諾服務,通過信息交流協作。優秀程序設計師,也應是優秀管理者。」
[1] 基於對象有兩種含義:限制版 OOP(如 VB),或基於原型/實例非類(如 JavaScript)。
[2] 此處「純粹 OOP」指不含其他範式,非指「一切皆對象」。
[3] 出自 Fred Brooks《No Silver Bullet》。
[4] 更準確說是結構化編程思想。