分享下一些架構設計方面的經驗:
1. 什麼是架構?
蓋乙個小樓,其架構簡單的說是計算梁和柱子的長度,面積,體積,力度,最大荷載和數量等,那麼程式的架構是不是也可以理解成介面,類,各種資料型別,演算法之間的倉庫呢? 以這個概念為引子,下面詳細的說明程式的架構是怎麼做起來的.
2.設計架構之前,架構師一定是要先了解需求的。
3.從需求分析中,就會設計出第乙個藍圖-----該架構該如何分層.
有人會問,我們不都是採用流行的3層架構或3層半架構嘛? 表現層,業務邏輯層,資料層,web service這樣的架構是應用於web開發,一些rich client程式和form程式由於業務需求不同,完全不需要什麼表現層或是web service. 有些架構的分層中還涉及到對產品抽象層,啟動層,甚至我覺得可以為做**做一層,為monitor(監視)做一層。總之,沒有絕對的框架,都是隨著需求的深入而不斷改進的。
4.分層後,各層之間是有依賴順序的。
避免層之間互相引用過多。多引用一層,就意味著引用層可能會引來不必要在此層實現的職責,替被引用層完成本該由它來做的事。之所以分層,就是為了職責明確,各層做各層的事。所以在新增引用的時候,要小心是否真的需要引用這個命名空間。
5.需求裡面肯定有乙個需要反覆操作的物件,那麼架構裡面,同樣也會有乙個抽象的物件來對應。對於這種物件,在架構上一般是要多關照的。我一般會參與這種方式: 定乙個介面,然後再定義乙個抽象類,抽象類來實現這個介面,然後可以用有抽象層次子類來繼承這個抽象類。這樣做除了一般的面象物件的好處外,可以很大限度的封裝變化並減少**冗餘,很容易擴充套件。這當然根據需求的要求,對於複雜的物件,可以採用這種方式來封裝抽象。
解釋下為什麼對大限度的封裝變化:主要歸功於使用了介面,並把介面做為最base的那一層。定義乙個物件的行為和屬性,目前最勝任的就是介面了;如果用抽象類,那麼接下來實現其的子類就只能單繼承,這樣就受限制了。往往,**改的對大的地方,通常都牽涉到業務的核心物件,所以把變化封裝起來。
解釋下為什麼減少**冗餘:因為有抽象類來實現這個介面,所以該抽象類的子類和孫子類們可以不用實現介面裡的全部方法。
解釋下為什麼容易擴充套件:由於又有介面又有抽象類和孫子們,無論是給介面賦予特性還是給介面再新增介面成員,都容易實現,而且還有很多層抽象層次,想在哪層新增什麼行為,應用何種設計模式,基本上都能滿足。
6.接下來,在設計中,該考慮各種物件的相互關係和方法的引數,返回型別的定義。
如果這些都能 定義好,那麼在修改設計時就能輕鬆愉快了;如果不那麼理想,就需要這些方法能夠過載。
7.選擇合適的資料型別是衡量乙個架構的標準之一。一般這些資料型別就夠用:list, array, queue, stack, 鍵值對. 再複雜點,就是這些資料型別組織在一起,比如把string, queue, class的例項放到陣列或鍵值對里。如果對於一些複雜的業務,比如有n層結構的資料,而且有從屬關係, 那麼用xml來表達更合適。因為這樣可以方便準確易懂,而且能適應未來的變化. 這是用hashtable, list等等不容易做到的。
8.演算法。按照程式邏輯的步驟而寫的演算法也是演算法,對程式邏輯抽象後的演算法也是演算法,當然第二種更好點。對於該怎樣寫出個好演算法有3個好建議, 1是應用物件導向的思想,2是透過現象看本質,3是參考和借鑑別人的,因為畢竟乙個人的思想難免會有侷限性,所以為什麼要有頭腦風暴呢。
9.在架構設計裡面,容易發生變化的地方是原來用乙個變數來表達,後來需求改變,需要用乙個陣列或佇列或其他什麼資料結構來表達了,
這樣在流程上,影響上就不小,可能會改動很多的**。 這是我深刻體會到的。原來想象不到 這裡居然會改變,所以開始設計的時候就簡單的用個變數來表達。
10.最後的一點感受是需要不斷的重構,思考,來完善架構。
peace!
讓NAS走下神壇
前一陣子,家裡機器硬碟終於滿了,逼於無奈要擴容,乙個家庭私有雲儲存的想法開始萌發 乙個私有的資料中心,資料可共享iphone,ipad,家裡其他電腦 筆記本,甚至電視.同時也給讓外網有選擇性地訪問。在網上搜尋相關概念,發現nas正是我所要的。了解nas前,先了解下網路儲存技術,現在的網路儲存技術大概...
salesforce 架構設計 從架構設計到架構師
因為碎片化的時間多了,所以開始刷起某乎了,關注了架構相關的板塊,也順手回答了一些問題。發現有很多同道中人正在經歷著我前兩年經歷的階段,對於做架構沒有相對具象的一些理解,更沒有系統化的認識。所以把最近回答的一些內容整理一下,權當記錄,留給3年後的自己 按慣例,容許我裝x開頭 一 架構的定義 在軟體開發...
mysql架構設計 初識mysql架構設計
一 應用系統如何與mysql進行一次互動?最開始接觸jdbc的時候,我們系統如何完成一次sql操作呢?第一步,建立資料庫連線 第二步,操作sql 第三步,釋放連線。但是每次建立與資料庫的連線非常耗時和資源,所以我們加入了連線池的概念。第一步的獲取連線是從連線池中獲取乙個可用的連線,第三步的釋放連線不...