現代新的簡化”物件“和”物件導向“的定義

banq發表於2012-07-14
傳統物件導向定義已經過時,過去定義已經不能滿足新語言新思想的發展,來自A Proposal for Simplified, Modern Definitions of "Object" and "Object Oriented"

一文試圖提出一種新的物件定義,以容納適應新的發展形勢。

新的物件定義是:An object is a first-class module that is invoked polymorphically
物件是能夠被多型呼叫的頂級模組。

這裡模組module定義可以是傳統語言的類Class,也可以是函式語言的函式function。這樣,物件導向定義比以前更加寬廣,可以包含Scala等新的函式語言。

多型性polymorphically被定義成執行呼叫方式,而傳統OO語言的繼承只是其中一個程式碼機制的實現,在執行時實現多型,包括執行時的Mixin實現,在不改變不變動原來程式碼情況下將新的程式碼混入執行。這就更加側重執行時的物件定義,而不是傳統意義上編碼階段的物件定義了。

作者還總結了物件哪些特性是物件的重要本質特性,其中最重要的是可變狀態Mutable State
,值物件是一種不可變物件,大部分函式語言試圖透過迴避可變狀態來實現高併發效能,但是這也許有些激進,因為可變狀態的應用越來越多。

我們有辦法從可變性分離出不變性,我們也有辦法去控制可變性(先容納再控制的哲學),比如在GOF設計模式中只有State, Memento, Observer, Decorator, 以及Chain or Responsibility 和 Adapter都需要可變性. 透過模式,我們達到重點分界可變狀態和不可變狀態,然後圍而分別殲之的策略,這樣,不可變的安全區域才會變得更加廣闊,變成一種預設語境。


作者將標識Identity也歸為物件必須的特性,在領域驅動設計DDD中我們知道實體的特點是標識,用來區別某個具體的物件,標識可以有能力來區別兩個引用是否指向同一個物件,相同物件的定義是它們的引用都指向一個單一的物件建立事件的結果。


作者認為其他特性如類Class 或方法定義Multi-methods都不適合納入新的物件定義之中,還有比如反射reflection, 靜態型別static typing, 介面interfaces, first-class classes, 併發物件concurrent objects, 同步synchronization。




相關文章