天天看點

面向對象為何而死

參考文章:

  月薪7K的面試題---交通燈管理系統http://blog.csdn.net/zhangxiaoxiang/archive/2011/03/24/6273384.aspx#1636343

  這篇文章其實蠻老的,隻是最近看到有關“面向對象即将死亡”的論調,心中有不平,就拿它來血祭一番。

  在這個簡化的十字路口環境中,文中抽象出了道路、紅綠燈兩個對象類,并分别建立12個執行個體對象來模拟實際的狀态。我沒看完他的文章,因為看到這,我已被震到精分了。。。

  以紅綠燈為例,目前通行路線上的紅綠燈狀态決定了此路線上的車輛能否通行,乍一看,絕對是一個重要的對象啊。但是,如果把問題換一種方式來描述就會發現另一個天地:“用紅綠燈來表示目前交通管制系統中允許通行的路線”,很顯然,“交通管制系統”才是隐藏在紅綠燈背後真正需要被抽象出來的對象,紅綠燈隻是該對象中一個狀态值的表達形式。

  再進一步思考,那麼對于到達路口的汽車來說,是否需要擷取這個“紅綠燈”值來決定自己是否通過呢?如果需要,那至少需要建立表達紅綠燈狀态的一個公共結構來讓汽車或其他對象了解交通管制系統的目前狀态,但如果那樣,我将親手殺死面向對象。

  紅綠燈隻是“交通管制系統”的某個狀态值的一種表達形式,而決定這個狀态值的又是什麼呢?顯然,就是整個題目本身所描述的一套“遊戲規則”。汽車能否通行,本質上不是紅綠燈決定,而是這套規則決定的。規則是什麼?在這裡很簡單,無非就是一系列的函數調用,最後傳回一個True或者False的值來決定汽車能否通行。如此一來,在“交通管制系統”中設定一個方法(函數?子過程?随意。。。)即可,而方法中的檢查規則嘛,就看交警們想怎樣折騰了。

  對比文中的解決方法,現在,12個“紅綠燈”對象執行個體已經被縮減為1個“交通管制系統”對象執行個體,與之類似的,12個道路對象執行個體也可以被簡化為一個對象執行個體。最終,隻需要兩個Class,1個簡單的資料結構、兩個起輔助作用的枚舉即可解決這個問題,而且最重要的通行規則被封裝在一個獨立的地方,可擴充性也得到了保證。

  想到法國DGM時期一句名言:正義而正義,多少罪惡假汝之手以行。想說一句:對象啊對象,多少不智假汝之名以行。如果某一天,面向對象真的死了,像這樣濫用對象的人們,該不該去教堂忏悔一下自己的罪行呢?