上週和兩個朋友聊天談到了物件導向,大家對程式中物件定義的範疇進行了討論。物件可以是現實世界中的實體,物件可以是作用在這些實體上的一組操作,也可以是多個實體之間的相互作用。程式設計師經常把需要實現的一種服務定義為物件,或者乙個流程定義為物件。面對現實世界中的諸多因素,究竟能抽象出哪些物件定義?
我從討論中受到了一些啟發,結合最近正在看的狀態機和規則集合,有了些想法記錄於此。
現實世界最基本的要素是事物和事物之間的關係,即實體和實體之間的作用。具體表現為:
(1)實體有個體和集合的概念,如個人,人群。
(2)實體包含多種屬性,這些屬性值的笛卡爾乘積即是這個實體的多個狀態。
(3)實體受到外部作用,引發自身的反應,自身狀態發生變化。這是狀態機模型,是實體被動的反應。
(4)當自身狀態和外部狀態滿足一定的條件,實體執行一些動作,對其他實體作用。
這是規則集模型,是實體主動的反應。
我們在程式裡首先可以把實體定義為物件,物件上的方法則是物件受到外部作用後被動反應和主動反應的綜合體現。如圖所示:
從應用的角度來分析:
(1)方法反映為對實體的操作
。即外部作用於實體,實體狀態發生變化,再依據變化後的狀態,做出一些反應,作用其他的實體。例如「人
.挨打」這個方法,在方法內部根據輸入的打擊的力度和部位,改變一些自身的狀態,再根據狀態決定逃跑或者還擊。
(2)方法反應為實體提供的功能和服務,即實體處理分配的任務
。外部通知實體,交給實體一些要處理的任務,實體根據狀態決定怎麼處理,將處理後的結果返回。例如「人
.工作」這個方法,輸入工作任務,根據狀態決定是否做還有怎麼做,將處理後的結果返回。
(3)多個操作可以組成乙個更高層次的操作。乙個操作的實現內部可以引發乙個或者多個其他的操作。
(4)同樣多個服務可以組成乙個更高層次的服務。乙個服務的實現內部可以依賴於乙個或者多個其他的服務。
(5)一組對操作的呼叫可以組成乙個流程,成為更大的乙個操作。一組對服務的呼叫可以組成乙個流程,實現為乙個更大的服務。
(6)更高層次的操作和服務可以沒有現實中的實體來對應,但程式裡可以定義乙個新物件來包含這些更高層次的操作和服務。
(7)實體物件和物件上的方法是一對多的關係,很多時候我們把這些方法提出實體物件之外來定義實現。這些方法可以構成乙個新物件,方法實現物件。好處是乙個實體物件可以在執行時繫結不同的方法實現物件。
(8)多個物件組成集合。對集合的操作引發對集合內部各個物件的操作,集合提供的服務由集合內各個物件的服務組合而成。
概括一下:在程式中,我們首先把現實世界中的實體定義為物件,物件的方法表示物件上的操作和物件提供的服務;我們可以把這些方法提到該物件之外定義實現,組成乙個新的物件;多個操作和服務可以構成更高層次,更大的操作和服務,可以定義乙個物件包含這些沒有實體對應的操作和服務。
按照以上的思路,和設計模式作對應,覺得有很多契合的地方:
(1)物件的狀態機模型和
state(狀態)
模式對應。
(2)物件構成集合和
composite
(組成)模式對應。
(3)實體物件和方法物件分離,對應
interpreter
(直譯器)模式,
interator
(迭代器)模式,
visitor
(訪問者)模式。
(4)大的操作和大的服務由更小操作和服務組合而成,對應
decorator
(裝飾)模式,
chiain of responsibility
(職責鏈)模式。
(5)一組操作和服務呼叫構成的流程實現為新的物件,對應
template method
(模板)模式。
設計模式的乙個中心思想就是保證方法集合(即介面)最大程度的固定,可以對實體物件動態繫結同一介面的不同實現;多個實體物件和這些實體物件組成的集合具有同一介面;細粒度的操作和服務與由它們組成的粗粒度操作和服務具備同一介面;在流程既定時可以動態繫結流程中間一些方法的不同實現。以此來確保程式有好的擴充套件性。
不在此具體描述,關於物件導向和設計模式的思考有點容易意會,難以言傳。覺得很難把自己的想法說的全面透徹,至少一小篇文章不行。:)
關於物件導向設計原則的一些理解
簡介 因為七大原則比較多,所以簡單梳理一下七大原則之間的關係和邏輯,便於理解和應用。對於每種原則具體的思想和實現,沒有舉例。開閉原則 open closed principle,ocp 黎克特制替換原則 liskov substitution principle,lsp 依賴倒置原則 depende...
關於物件導向的一些思考
物件導向方法被人談論了二十多年了。我接觸它比較晚,直到九十年代中期才開始學習使用它。若說對這個方法做些評價,那還真是大言不慚了。不過這麼些年來,也週期性的對物件導向做些思考。或對或錯,我想都值得總結一下。一家之言,來看的同學不必太當真。首先我們要區分一下 基於物件 和 物件導向 的區別。基於物件,通...
一些關於物件導向的思考
python是一門神奇的語言,看了看裡面一些關於物件導向的描述。覺得挺受啟發的,在c 中同樣適用。主要觀點出自magnus lie hetland的 python基礎教程 1 將屬於一類的物件放在一起。如果乙個函式操縱乙個全域性變數,那麼兩者最好都在類內作為特性和方法出現。2 不要讓物件過於親密。方...