關於物件導向的一些思考

2021-05-21 22:45:35 字數 1088 閱讀 4416

物件導向方法被人談論了二十多年了。我接觸它比較晚,直到九十年代中期才開始學習使用它。若說對這個方法做些評價,那還真是大言不慚了。不過這麼些年來,也週期性的對物件導向做些思考。或對或錯,我想都值得總結一下。一家之言,來看的同學不必太當真。

首先我們要區分一下「基於物件」和「物件導向」的區別。

基於物件,通常指的是對資料的封裝,以及提供一組方法對封裝過的資料操作。比如 c 的 io 庫中的 file * 就可以看成是基於物件的。

物件導向,則在基於物件的基礎上增加了多型性。所謂多型,就是可以用統一的方法對不同的物件進行同樣的操作。當然,這些物件不能完全不同,而需要有一些共性,只有存在了這些共性才可能用同樣的方法去操作它們。我們從 c++ 通常的實現方法的角度來看,a 和 b 在繼承關係上都有共同的祖先 r ,那麼我們就可以把 a 和 b 都用對待 r 的控制方法去控制它們。

為什麼需要這樣做?

回到乙個古老的話題:程式是什麼?

程式 = 演算法 + 資料結構

在計算機的世界裡,資料就是乙個個位元的組合;**的執行流程就是順序、分支、迴圈的程式結構的組合。用計算機解決問題,就是用程式結構的組合去重新排列資料的組合,得到結果。為了從龐大的輸入資料(從 bit 的角度上看,任何輸入資料都可能非常的龐大),通過**對映到結果資料。我們就必須用合理的資料結構把這些位元資料組合起來,形成數量更少的單元。

這些單元,就是物件。物件同時也包括了對它進行操作的方法。這樣,我們完成了一次封裝,就變成了:

程式 = 基於物件操作的演算法 + 以物件為最小單位的資料結構

封裝總是為了減少操作粒度,資料結構上的封裝導致了資料資料的減少,自然減少了問題求解的複雜度;對**的封裝使得**得以復用,減少了**的體積,同樣使問題簡化。

接下來來看 基於物件操作的演算法。這種演算法必須將操作物件看成是同樣的東西。在沒有物件的層次上,演算法操作的都是位元組,是同類。但是到了物件的層次,就不一定相同了。這個時候,演算法操作的是乙個抽象概念的集合。

在物件導向的程式設計中,我們便少不了容器。容器就用來存放一類有共同抽象概念的東西。這裡說有共同概念的東西,而沒有說物件。是因為對於演算法作用於的集合,裡面放的並不是物件實體,而是乙個對實體的引用。這個引用表達的是,演算法可以對引用的那一頭的東西做些什麼,而並不要求那一頭是什麼。

一些關於物件導向的思考

python是一門神奇的語言,看了看裡面一些關於物件導向的描述。覺得挺受啟發的,在c 中同樣適用。主要觀點出自magnus lie hetland的 python基礎教程 1 將屬於一類的物件放在一起。如果乙個函式操縱乙個全域性變數,那麼兩者最好都在類內作為特性和方法出現。2 不要讓物件過於親密。方...

對物件導向的一些思考

到底什麼是物件導向,再討論這個問題之前我們先來假設一下如果不用物件導向用過程試程式設計來想象一下是什麼樣子的。過程試的程式設計很好理解,我們再乙個main方法中從頭到尾一行一行的寫 同時定義多個變數來完成我們的邏輯。後來高階一點的程式設計師會抽取一些共有功能,定義乙個函式。再 任何地方,我們都可以使...

關於物件導向的一些想法

這兩天在寫程式,一直在想模組之間的資訊交流到底用什麼方式,gui中接收到的資料如何才能和邏輯層中的業務進行交流,一開始我使用的是字串,感覺這種方式很不好,於是開始考慮使用物件來傳遞訊息。使用字串是一開始程式設計的時候很容易想到的,很直觀簡單,可是使用的時候就不是這個樣子了,使用字串的話,模組之間的耦...