物件導向技術偽術語--主動對象的批判
按照清華大學出版社紹/楊二人的《物件導向的系統分析》一書,主動對象是一組屬性和一組服務的封裝體,其中至少有一個服務不需要接收訊息就能主動執行(主動服務)。另外一種就是被動對象,需要通過訊息的驅動才能執行。該書中給出一個例子,比如哨兵站崗並對發現的情況主動報告。主動對象一般被實現為進程或線程。
我認為這種把對象分成主動對象和被動對象是錯誤的。因為按照物件導向的理論,所有動作都是訊息響應的結果。哨兵站崗也是司令部發出了指令讓其站崗。哨兵主動報告也是因為他發現了情況,也就是得到了(比方說敵人潛入)訊息。所以一個看起來像主動對象的對象,只不過是其服務過程較長。在其服務期間如果發出訊息給其他對象就好像是其主動發出的訊息罷了。
再舉一個被認為是被動對象的售報亭的例子。客戶到報亭買報紙,客戶發出要買報紙的訊息,同時給出訊息參數既要買的那種報紙。售報亭給出響應該報紙的價格。然後客戶給錢,售報亭找零。這麼看來售報亭是一個被動對象了。別急,如果售報亭無法找零,那它是否要主動發訊息告訴客戶多賣一份報紙或者讓客戶找找看自己有沒有零錢。有人會說,這個訊息其實不是售報亭主動發送的,是要系統預先設定好規則的。好吧,接著看下面的進展。售報過程不總是那麼順利。比方說有的客戶挑報紙就要挑很久,有時候找零也會耽擱很多時間。如果總是前面的客戶買完了報紙,後面的客戶才能被服務,那這個售報亭可能要排很長的隊。為了提高效率,售報亭決定允許多個客戶同時買報紙。現在售報亭的運行方式如下:如果沒有客人,售報亭不運作(售報員可以睡覺,呵呵)。如果來了第一個客人要買報紙,售報亭接受該訊息開始運作。如果這個客人買完報紙後沒有其他客戶光臨,售報亭可以再次休息。如果排隊的客人多於2個,當一個客人還在考慮的時候,售報亭主動詢問後面的客人要買什麼報紙。那麼這麼一個售報亭是主動對象還是被動對象呢?如果沒有客人,它完全不運行。它應該不是主動對象。如果只有一個客人,它的操作流程完全的詢問應答型,應該也不是主動對象。如果有多個客人,這時那會主動詢問客戶,這時候看起來是主動對象了。
這麼看來,一個對象,它的服務正在執行,那麼它就是主動的。它的服務未被執行,那它就是被動的。所以根本就不應該使用主動對象和被動對象這種術語。而線程完全是另外一個領域的概念。如果一個對象的服務執行需要較長時間,可以將其放入單獨的線程中執行,提高CPU利用率。