我對架構師的理解(如何成為一個合格的架構師)


引子:
        在討論架構之前,我們先上道菜,青椒土豆肉絲,這道小菜味道還是不錯的,自私點了,不考慮您是否喜歡,今天就上它了。
准備原材料:食用油、青椒、土豆、肉絲、大蔥、香醋、雞精和食鹽。當然根據需要您可以再加入其他輔料。把青椒、土豆、肉片都切成絲,大蔥切好,OK,一切准備就緒,開火,往鍋里加油,等油熱后,放切好的蔥片,聞到蔥香,放肉絲,稍微加些醬油,爆炒,接着放土豆絲和青椒絲,等八成熟,撒些雞精和食用鹽,出鍋。
        細心的讀者可能發現,剛開始的時候我好像並沒有准備醬油,是的,我確實沒准備醬油,坦白的講,有時候當鍋里的油熱的時候,我突然發現蔥忘記洗了,更談不上切成蔥片了,此時我會匆匆忙忙的去洗,去切,甚至有時候慌里慌張的把手給切破。
通過我們做上面的一道菜,我們總結了以下幾點:
總結1:巧婦難為無米之炊,我們要想做好這道菜,需要原材料;
總結2:這些原材料以時間為軸心他們彼此之間是有順序關系的;
總結3:可能在某一步驟里,我們突然想添加些事先並沒准備好的原材料;
總結4:一旦形成熱油鍋,似乎你要在這么短的時間內完成這些動作,做過飯的朋友更能體會到這句話。

言歸正傳,以軟件的思想去考慮上面的業務(事情),原材料,你可以理解為類庫;順序關系,你可以通過事件來描述;事先並沒准備好的原材料,你可以通過接口(抽象類、虛函數等),讓用戶重載去實現;到這里你會發現,一旦打開“煤氣”,去“引爆”預先設計的事件、接口,就好比多米諾骨牌一樣一個接一個的傳遞下去,在某一時刻,它會檢查是否放了“蔥片”、是否放了“肉絲”,不好,“食用油”你就沒放,還炒什么菜,扔出異常……
是的,上面就是框架,要想設計一個好的框架,看來我們首先要知道“青椒土豆絲”的做法,它大概需要哪些“原材料”,以及這些“順序關系”該如何通過具體的語言去實現;當然了,要炒出“不同的菜”,具體的原材料和順序關系又是不同的。下面通過分析幾個大家比較熟悉的框架來更詳細的說明。
       MFC框架:
MFC中的框架思想采用了MVC的思想,其中CWinApp是全局型的,整個程序的引爆也是其在“搞鬼”,在其內部有指向文檔模版的指針,而模板又攘括了視圖、視圖的管理者(就是那個frame)和文檔類,順序關系是靠消息泵來推動。通過下面的調用關系可以看到各個類的“相互依存”(說明:下面的表摘自網絡)

從該對象 如何訪問其他對象
全局函數 調用全局函數AfxGetApp可以得到CWinApp應用類指針
應用 AfxGetApp()->m_pMainWnd為框架窗口指針;用CWinApp::GetFirstDocTemplatePostion、CWinApp::GetNextDocTemplate來遍歷所有文檔模板
文檔模板 調用CDocTemplate::GetFirstDocPosition、CDocTemplate::GetNextDoc來遍歷所有對應文檔
文檔 調用CDocument::GetFirstViewPosition,CDocument::GetNextView來遍歷所有和文檔關聯的視圖;調用CDocument:: GetDocTemplate 獲取文檔模板指針
視圖 調用CView::GetDocument 得到對應的文檔指針; 調用CView::GetParentFrame 獲取框架窗口
文檔框架窗口 調用CFrameWnd::GetActiveView 獲取當前得到當前活動視圖指針; 調用CFrameWnd::GetActiveDocument 獲取附加到當前視圖的文檔指針
MDI 框架窗口 調用CMDIFrameWnd::MDIGetActive 獲取當前活動的MDI子窗口(CMDIChildWnd)

您可以試着聯想“炒菜”的過程去思考上面的這張表,如果您真的理解了,我相信您會覺得他們之間沒有什么區別(不過坦白來講真的理解並沒有那么容易),好吧,你可能又發出疑問?如果去做“填空題”?在MFC里是通過處理消息來實現。那么為什么沒有采用虛函數及多態來實現?這個問題問的很好,不過我沒打算在這里進行說明,你可以在侯傑的《深入淺出MFC》里找到答案。(我不是有意來推這本書,實在沒看到其他更好的)。可能你從來沒接觸過MFC,那就不要去思考了,下面舉另外一個例子。
asp.net:
asp.net的webForm以其容易上手而著稱,如果你深入的理解了其頁面生命周期后,你會發現這好像又是在“炒菜”,而我們要做的只是在不同的“炒菜步驟”內去定制我們的一些小創意,可能在Page_PreInit里、在Page_Init里、在Page_Load里或其它事件里,無論如何,您逃不過如來佛的手掌心,你要做的工作,就是在這些事件里去定制,換句話說,你搞不出來“宮保雞丁”,想搞個“宮保雞丁”該怎么辦?asp.net MVC 粉墨登場……自己可以分析下,這里就偷懶省略了。

從炒菜到實例分析,現在我們基本上對軟件架構有了一個大概的認識:
認識1:框架架構是有邊界的,不光如此,你必須有全局的概念才能去設計框架。所謂邊界是針對不同的業務,比如MFC是針對傳統的桌面程序,當遇到WEB時,似乎就不怎么靈光了,不然微軟不會花費那么多功夫去推.NET。
認識2:框架的實現是組件的相互關聯(通過接口,事件等),如果你手里有些基本的類庫,不要告訴我是框架。
認識3:設計框架不是為了好玩(其實它本身並不好玩),因為你要為“兩個人”負責:業務和使用框架的人。建立在你框架上的應用必須能解決你實際的業務問題,同時要考慮怎么樣讓開發人員能“懶惰”下來,比如就是做做填空題。
認識4:設計框架要有一個好的框架思想,和具體語言無關,但你必須明白,不同的語言,甚至相同的語言去實現的方式又不相同,比如MFC采用了宏來實現消息機制,而asp.net內采用虛函數等來實現多態。
認識5:你要時刻明白,接下來可能炒的菜就是“宮保雞丁”,也就是說你要知道自己在干什么,要熟悉自己的“業務”,比如當你設計MFC框架時,你要考慮一個傳統的桌面程序要解決的大部分問題會是什么?比如打印,比如進程通信,比如文件操作,比如音視頻,數據庫操作,ole,等等。同樣的,當你來設計ASP.NET時,因為這道菜是針對HTTP的,這個時候你如果連HTTP是什么都不知道,我想你炒不好這道菜。
OK,我想這篇文章該結束了,因為我們的“菜已炒好”,如果你認真仔細的看到這里,估計已經浪費了你近五分鍾的時間,希望能給你帶來點思考,比如:架構師就是來“炒菜”,可能吧,也可能我的觀點並不完全正確。不過我歡迎聆聽每個朋友對架構的理解。謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM