目錄:

  一、常用的方法:找名詞
  二、對應到真實世界:最好用也是最難拿捏的準則
  三、篩選與簡化:剛好夠用就好
  四、考慮擴充性:比剛好夠用要多一些
  五、介面與責任:將注意力灌注在正確的事情上


序:

  這是系列文章的第一篇,有必要對這系列文章做個簡介。首先要說明的是,這系列文章設定的目標讀者群為初學者,所以呢,如果你屬於以下的族群,就沒有必要繼續閱讀下去了:

    1. 身經百戰的物件導向老手:本系列文章對您而言太過於膚淺,衷心的建議您千萬不要往下看下去,不但浪費您寶貴的時間,還會加深您近視的度數。
    2. 尚未學習過任何物件導向課程的局外人:本系列文章中有過多拗口饒舌的專業術語,此外筆者擅於使用牽強怪異到令人摸不著頭緒的比喻,並視之為珍寶。這裡不是你熟悉的家園,趕快回地球吧!
    3. 已經完成了兩三支物件導向程式,並對物件導向技術操控自如的初學者:您是萬中選一的天才型工程師,未來的發展無可限量。本系列文章過於瑣碎囉唆,甚至部份內容還有誤導之嫌,您不必委屈自己閱讀這些沒營養的隻字片語,這麼做的後果只會降低您的智商。

  如果您正在寫(或才剛寫完)第一支物件導向程式,並開始對物件導向技術心灰意冷的一般初學者:很好!本系列文章就是為您量身訂製的,請準備好爆米花與可樂,好戲就要上演了!

  剛開始學習物件導向初學者,在接受了一系列理論課程如傳教般的洗腦與開導之後,帶著初入桃花源般的興奮心情開始寫這輩子的第一支物件導向程式。愉悅的心情持續不了多久,甚至連第一支程式都還沒寫完,竟驚覺自己再也找不到桃花源的入口了!頓時信心全失,開始懷疑老師是否過於誇大唬濫。

  其實您並沒有迷路,這是上高速公路前的閘道儀控管制措施,短暫的等待是為了享受上路後的超速快感。然而眾多粉絲一窩蜂的湧入物件導向高速公路之時,難免會碰巧遇上了農曆年上高速公路時,人人都會在閘道口遇到的那顆紅燈,只能說:一切並不意外!

  而本系列文章自詡成為閘道口的綠燈,盡心盡力的為您指引方向,讓您重拾對物件導向技術的信心,協助您重新回到物件導向高速公路,引擎全開盡情狂飆,享受開發程式的樂趣。


一、常用的方法:找名詞

  開始寫作物件導向程式的第一步,就是要找出物件!物件導向的不同流派,各有其獨到的方法來找出物件。其中最簡易的方法為:找名詞,不管是從需求文件、與客戶的對話,或是從自己的領域知識中,都可以找到為數不少的名詞,這些名詞可能就是需要實作出來的物件。

  若僅僅只是要找出物件,這並沒有任何困難之處,真正困難的地方在於,釐清物件與物件之間的關係,以及了解它們之間的互動模式,最後還要對這些物件進行分類。其困難的程度與做好垃圾分類與資源回收有得拼!

  本篇文章將分析物件導向初學者如何栽在找出物件這檔事上,並為讀者提供在實務上有用的建議。


二、對應到真實世界:最好用也是最難拿捏的準則

  關於如何做好垃圾分類,呃!是如何做好物件分類,我隱約記得物件導向的傳教者,總是耳提面命不斷的灌輸:所設計的物件要與真實世界裡的物件對應!為何要這麼做的理由,我已經把它還給老師記不起來了,有誰知道的,麻煩出個聲!我猜理由或許是以下兩者吧:

    1. 對應到真實世界之後,別人會比較容易理解與認同你的設計,程式就會比較容易維護與reuse了!
    2. 真實世界的物件是有封裝性的,若程式的設計與之對應,無形中你的設計就有封裝性了!

  如果你真的用這種方式來做物件分類,我猜想你一定是痛苦萬分的邊做邊流淚吧!真實世界的物件太多,如果你執意要真真切切的模擬真實世界,物件會多到怎麼寫都寫不完,保證會讓專案的交期一延再延,天天飽受上司的疲勞轟炸。但若你非常幸運的把程式寫完了,完全弄懂了真實世界的運作原理,並將之模擬出來,那麼你不但會是虛擬世界中的真神,還會是真實世界中最博學多聞的學者。

  真實世界的物件不僅數量龐大,而且物件與物件之間的關係亦十分複雜,其間有太多模稜兩可的模糊地帶:繼承、組合、聚合、使用,每個人對物件的認知多少會有些差異,對於特定較有爭議的物件,爭執不下的情況屢見不鮮。這時公說公有理,婆說婆有理,端視個人的生活體驗與程式功力,沒有絕對的對與錯!

  反觀電腦技術領域,則不若真實世界那般的複雜與模稜兩可。電腦的記憶體有限,暫存器的數量有限,暫存器的大小也不過僅32或64 bits,連向來電腦業界引以為傲的摩爾定律(每18個月電腦技術進步一倍)都已經被打破了,電腦技術不可能無限制的進步下去。

  有限是敵不過無限的,千萬不要妄想以能力如此有限的電腦與個人有限且寶貴的生命,來模擬複雜無比的真實世界!要技巧性的對真實世界的物件進行簡化與篩選,並務實的僅選擇實作物件中和解決專案問題有關的部分就好,不要天真的自以為能夠完全的將真實世界模擬出來!


三、篩選與簡化:剛好夠用就好

  以人體作為比喻:人體內外的各個器官各司其職,各自有其負責的功能與任務,總和起來共同維持人體的正常運作。但若今天的任務是要寫一支程式來模擬打羽毛球運動,那麼我們應該集中主力於模擬以下的器官:

    1. 眼睛:觀看對手的動作與球行徑路線,
    2. 腿、腳:快速移動位置,
    3. 手臂、手腕、手掌:握住球拍並揮擊來球,
    4. 腦、脊椎、神經:判斷、決策、平衡身體、傳達訊息。

  至於心臟、肺葉、血管...等人體的其它器官,並不會因為打羽毛球而罷工停止運轉,雖然其所負責的功能十分重要,甚至直接關係到人們是否還活著,但由於不管是否在打羽毛球,這些器官都會無差別的執行各自的任務,因此在描述打羽毛球這項運動的時候,我們可以刻意將它們忽略掉,不去思考這些器官是如何運作的,而把精神與精力用在模擬和打羽毛球有直接且重大關聯的眼、手、腳...等器官之上。這就是簡化的功夫!

  回到程式開發的議題,專案中的任何一行程式碼都應該有其意義,而且都應該對專案所要解決的問題有直接的助益,若有程式碼對該專案是可有可無的,這些程式碼就好比是專案中的腫瘤,若為惡性腫瘤,它將會危害健康,即使是良性的,也會有礙觀瞻並浪費養分。當腫瘤數量不多的時候,或許還無關緊要,一旦腫瘤數量直線上升,就會爭食專案有限的資源,影響其它正常器官的發展。對應到程式上,若寫出了過多無用的程式碼,就沒時間去開發真正有用的程式了,這會造成專案開發時程的延遲。

  模擬真實世界的立意良好,但必須做些篩選與簡化,對於專案沒有幫助的部分要捨得割愛,留下剛好夠用的部分就好。


四、考慮擴充性:比剛好夠用要多一些

  在前一章人體的比喻中,提到需要對真實世界的物件進行篩選與簡化,僅留下眼、手、腳等和專案有直接相關的物件,才能在有限的時間之內,完成分析、設計、開發的工作。至於心、肺、血管等非直接相關的物件,則可刻意的將之忽略掉。

  然而根據實務經驗,需求總是會不斷的變動,現在看似不需要的功能,未來或許會被加入需求列表中。因此對於心、肺、血管等刻意忽略掉的部分,由於它們是重要的部分,最好能預留未來擴充的可能性。換句話說,除了如前所述進行篩選與簡化留下剛好夠用的部分之外,還要比剛好夠用要多一些東西,這些東西就是擴充性。

  預留擴充性有機會降低維護階段的困難度,不會因為一開始沒有設計胸腔而找不到空間來放置心臟與肺葉。此外,考慮擴充性的因素之後,讓程式碼可以用到更多的場合上,因此而增加了reuse程式碼的可能性。


五、介面與責任:將注意力灌注在正確的事情上

  在分析與設計階段,將注意力全部灌注在個別物件的細節上,這是不正確的!太早專注細節,很容易使得開發工作偏離軌道,寫出太多對專案無用的程式碼。

  那麼應該要怎麼做才對呢?答案是:應該要花些時間在更重要的事情上:

    1. 釐清系統中一共有哪些事情要做,這些事情該由哪個物件來負責?
    2. 訂定物件的公開介面,規劃物件與物件之間要如何進行互動。

  用責任與介面來引導物件的細節設計,讓注意力灌注在如何完成各自的任務上,而不是和解決專案問題無關的其它事情上,自然不會寫出對專案無用的程式碼了。


總結:

  找出名詞,並從真實世界中找線索,運用這兩個方法即可找到可能的候選物件。接著對其進行篩選,留下剛好夠用的物件,同時藉由預想未來可能會發生的改變,為系統保留擴充的可能性,此時即可初步找出需要被實作的物件。最後將注意力灌注在正確的事情上,避免寫出對解決專案問題無關的程式碼。


參考資料:


更多「物件導向」文章:

  繼承是父子關係?才怪! 物件導向初學者應該要知道的事情(四)

  到底誰該去繼承誰? 物件導向初學者應該要知道的事情(三)

  為什麼我找出來的物件都是UI物件? 物件導向初學者應該要知道的事情(二)

  [預告]: 物件導向初學者應該要知道的事情

更多「程式設計」文章:

  [分享] 程式設計寶庫,範例程式搜尋引擎

  最具殺傷力的小BUG

  最尷尬的『不恰當』,程式設計經驗談

  門面佈置的學問-UI開發

  寫程式會從哪邊下手? (問券調查)

  寫程式到底需不需要懂數學?

arrow
arrow

    牛奶 發表在 痞客邦 留言(1) 人氣()