熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

分析和設計

2022-06-13   來源: Java核心技術 

  面向對象的范式是思考程序設計時一種新的而且全然不同的方式許多人最開始都會在如何構造一個項目上皺起了眉頭事實上我們可以作出一個的設計它能充分利用OOP提供的所有優點
  有關OOP分析與設計的書籍大多數都不盡如人意其中的大多數書都充斥著莫名其妙的話語笨拙的筆調以及許多聽起來似乎很重要的聲明(見注釋)我認為這種書最好壓縮到一章左右的空間至多寫成一本非常薄的書具有諷剌意味的是那些特別專注於復雜事物管理的人往往在寫一些淺顯明白的書上面大費周章!如果不能說得簡單和直接一定沒多少人喜歡看這方面的內容畢竟OOP的全部宗旨就是讓軟件開發的過程變得更加容易盡管這可能影響了那些喜歡解決復雜問題的人的生計但為什麼不從一開始就把事情弄得簡單些呢?因此希望我能從開始就為大家打下一個良好的基礎盡可能用幾個段落來說清楚分析與設計的問題
  [注釋]最好的入門書仍然是Grady Booch的《ObjectOriented Design withApplications版本》Wiely & Sons於年出版這本書講得很有深度而且通俗易懂盡管他的記號方法對大多數設計來說都顯得不必要地復雜
   不要迷失
  在整個開發過程中最重要的事情就是不要將自己迷失!但事實上這種事情很容易發生大多數方法都設計用來解決最大范圍內的問題當然也存在一些特別困難的項目需要作者付出更為艱辛的努力或者付出更大的代價但是大多數項目都是比較常規所以一般都能作出成功的分析與設計而且只需用到推薦的一小部分方法但無論多麼有限某些形式的處理總是有益的這可使整個項目的開發更加容易總比直接了當開始編碼好!
  也就是說假如你正在考察一種特殊的方法其中包含了大量細節並推薦了許多步驟和文檔那麼仍然很難正確判斷自己該在何時停止時刻提醒自己注意以下幾個問題
  () 對象是什麼?(怎樣將自己的項目分割成一系列單獨的組件?)
  () 它們的接口是什麼?(需要將什麼消息發給每一個對象?)
  在確定了對象和它們的接口後便可著手編寫一個程序出於對多方面原因的考慮可能還需要比這更多的說明及文檔但要求掌握的資料絕對不能比這還少
  整個過程可劃分為四個階段階段剛剛開始采用某些形式的結構
   階段擬出一個計劃
  第一步是決定在後面的過程中采取哪些步驟這聽起來似乎很簡單(事實上我們這兒說的一切都似乎很簡單)但很常見的一種情況是有些人甚至沒有進入階段便忙忙慌慌地開始編寫代碼如果你的計劃本來就是直接開始開始編碼那樣做當然也無可非議(若對自己要解決的問題已有很透徹的理解便可考慮那樣做)但最低程度也應同意自己該有個計劃
  在這個階段可能要決定一些必要的附加處理結構但非常不幸有些程序員寫程序時喜歡隨心所欲他們認為該完成的時候自然會完成這樣做剛開始可能不會有什麼問題但我覺得假如能在整個過程中設置幾個標志或者路標將更有益於你集中注意力這恐怕比單純地為了完成工作而工作好得多至少在達到了一個又一個的目標經過了一個接一個的路標以後可對自己的進度有清晰的把握干勁也會相應地提高不會產生路遙漫漫無期的感覺
  座我剛開始學習故事結構起(我想有一天能寫本小說出來)就一直堅持這種做法感覺就象簡單地讓文字到紙上在我寫與計算機有關的東西時發現結構要比小說簡單得多所以不需要考慮太多這方面的問題但我仍然制訂了整個寫作的結構使自己對要寫什麼做到心中有數因此即使你的計劃就是直接開始寫程序仍然需要經歷以下的階段同時向自己提出一些特定的問題
   階段要制作什麼?
  在上一代程序設計中(即過程化或程序化設計這個階段稱為建立需求分析和系統規格當然那些操作今天已經不再需要了或者至少改換了形式大量令人頭痛的文檔資料已成為歷史但當時的初衷是好的需求分析的意思是建立一系列規則根據它判斷任務什麼時候完成以及客戶怎樣才能滿意系統規格則表示這裡是一些具體的說明讓你知道程序需要做什麼(而不是怎樣做)才能滿足要求需求分析實際就是你和客戶之間的一份合約(即使客戶就在本公司內部工作或者是其他對象及系統)系統規格是對所面臨問題的最高級別的一種揭示我們依據它判斷任務是否完成以及需要花多長的時間由於這些都需要取得參與者的一致同意所以我建議盡可能地簡化它們——最好采用列表和基本圖表的形式——以節省時間可能還會面臨另一些限制需要把它們擴充成為更大的文檔
  我們特別要注意將重點放在這一階段的核心問題上不要糾纏於細枝末節這個核心問題就是決定采用什麼系統對這個問題最有價值的工具就是一個名為使用條件的集合對那些采用假如……系統該怎樣做?形式的問題這便是最有說服力的回答例如假如客戶需要提取一張現金支票但當時又沒有這麼多的現金儲備那麼自動取款機該怎樣反應?對這個問題使用條件可以指示自動取款機在那種條件下的正確操作
  應盡可能總結出自己系統的一套完整的使用條件或者應用場合一旦完成這個工作就相當於摸清了想讓系統完成的核心任務由於將重點放在使用條件一個很好的效果就是它們總能讓你放精力放在最關鍵的東西上並防止自己分心於對完成任務關系不大的其他事情上面也就是說只要掌握了一套完整的使用條件就可以對自己的系統作出清晰的描述並轉移到下一個階段在這一階段也有可能無法完全掌握系統日後的各種應用場合但這也沒有關系只要肯花時間所有問題都會自然而然暴露出來不要過份在意系統規格的完美否則也容易產生挫敗感和焦燥情緒
  在這一階段最好用幾個簡單的段落對自己的系統作出描述然後圍繞它們再進行擴充添加一些名詞動詞名詞自然成為對象動詞自然成為要整合到對象接口中的方法只要親自試著做一做就會發現這是多麼有用的一個工具有些時候它能幫助你完成絕大多數的工作
  盡管仍處在初級階段但這時的一些日程安排也可能會非常管用我們現在對自己要構建的東西應該有了一個較全面的認識所以可能已經感覺到了它大概會花多長的時間來完成此時要考慮多方面的因素如果估計出一個較長的日程那麼公司也許決定不再繼續下去或者一名主管已經估算出了這個項目要花多長的時間並會試著影響你的估計但無論如何最好從一開始就草擬出一份誠實的時間表以後再進行一些暫時難以作出的決策目前有許多技術可幫助我們計算出准確的日程安排(就象那些預測股票市場起落的技術)但通常最好的方法還是依賴自己的經驗和直覺(不要忘記直覺也要建立在經驗上)感覺一下大概需要花多長的時間然後將這個時間加倍再加上你的感覺可能是正確的也許能在那個時間裡完成加倍使那個時間更加充裕的時間則用於進行最後的推敲和深化但同時也要對此向上級主管作出適當的解釋無論對方有什麼抱怨和修改只要明確地告訴他們這樣的一個日程安排只是我的一個估計!
   階段如何構建?
  在這一階段必須拿出一套設計方案並解釋其中包含的各類對象在外觀上是什麼樣子以及相互間是如何溝通的此時可考慮采用一種特殊的圖表工具統一建模語言(UML)請到去下載一份UML規格書作為第階段中的描述工具UML也是很有幫助的此外還可用它在第階段中處理一些圖表(如流程圖)當然並非一定要使用UML但它對你會很有幫助特別是在希望描繪一張詳盡的圖表讓許多人在一起研究的時候除UML外還可選擇對對象以及它們的接口進行文字化描述(就象我在《Thinking in C++》裡說的那樣但這種方法非常原始發揮的作用亦較有限
  我曾有一次非常成功的咨詢經歷那時涉及到一小組人的初始設計他們以前還沒有構建過OOP(面向對象程序設計)項目將對象畫在白板上面我們談到各對象相互間該如何溝通(通信)並刪除了其中的一部分以及替換了另一部分對象這個小組(他們知道這個項目的目的是什麼)實際上已經制訂出了設計方案他們自己擁有了設計而不是讓設計自然而然地顯露出來我在那裡做的事情就是對設計進行指導提出一些適當的問題嘗試作出一些假設並從小組中得到反饋以便修改那些假設這個過程中最美妙的事情就是整個小組並不是通過學習一些抽象的例子來進行面向對象的設計而是通過實踐一個真正的設計來掌握OOP的竅門而那個設計正是他們當時手上的工作!
  作出了對對象以及它們的接口的說明後就完成了第階段的工作當然這些工作可能並不完全有些工作可能要等到進入階段才能得知但這已經足夠了我們真正需要關心的是最終找出所有的對象能早些發現當然好但OOP提供了足夠完美的結構以後再找出它們也不遲
   階段開始創建
  你可能是程序員現在進入的正是你可能最感興趣的階段由於手頭上有一個計劃——無論它有多麼簡要而且在正式編碼前掌握了正確的設計結構所以會發現接下去的工作比一開始就埋頭寫程序要簡單得多而這正是我們想達到的目的讓代碼做到我們想做的事情這是所有程序項目最終的目標但切不要急功冒進否則只有得不償失根據我的經驗最後先拿出一套較為全面的方案使其盡可能設想周全能滿足盡可能多的要求給我的感覺編程更象一門藝術不能只是作為技術活來看待所有付出最終都會得到回報作為真正的程序員這並非可有可無的一種素質全面的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25517.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.