以數據結構爲核心的編程方法

這是一種與過程化編程很是不一樣的編程思想,它不須要一個很是清晰的流程圖作爲程序的藍本,也不須要作很是龐大的全局規劃,只須要明確業務規則和結果的表示法。編程

這是一種更接近於數學方法的編程思想,先明確表示法和規則,而後按規則推演公式和定理,再應用到實際數據中。數組

這種方法中的數據結構,並不僅是數組、鏈表、樹和圖這些具體的數據結構,也包括整數,枚舉,複合結構(對象)和徹底抽象表示。數據結構

這種方法中的核心實體數據結構對應的處理結構,通常來講是函數結構,在一些語言中也對象,塊,lambda函數等,甚至具體代碼片段。咱們能夠稱爲段。段這個名字隱含這些處理結構並不徹底,它能夠組合成更大的段。app

讓咱們用一些簡單的例子來講明這個方法如何解決問題。編程語言

一個小型須要一個計算找零的程序,當一個顧客使用大面額的紙幣購買商品,程序須要按商品的價格計算出須要的零錢的總數,以及
每種零錢須要幾張。咱們假定,顧客不會使用超過100元的紙幣,找零隻會使用到50,20,10,5,2,1這5種紙幣,且紙幣的數量無限。ide

從最頂層來看,有這些數據須要處理:顧客提供的紙幣,商品價格,各類找零的紙幣和數量。它們須要知足顧客提供的紙幣面額=商品價格+ 各類(找零 * 數量)的和。函數

這裏能夠發現咱們還須要補充一個找零的總數,規則變化爲
紙幣面額 = 商品價格 + 找零的總數
找零的總數 = 各類(找零 * 數量)的和設計

容易看到咱們彷佛不能進一步分解,這裏的技巧在於,須要有一些代碼段的經驗,能知道把一個總體分解爲多個可選部分時,可使用的幾個段,其中最簡單的一種是分步,它是這樣code

list<...> divide (... whole) {
whole -= part;
result = divide(whole);
result.append(part);
return result;
}對象

... 部分是段的重要特徵,即它是能夠組合的。

從表示法來看,它們是這樣的:

int currency;
int price;
map<change_type,int> changes;  
//用這種表示法暗示了個人C++背景,但不併不影響你換用其它熟悉的等價表示法。

基於這個容易獲得一個函數代碼段:

map<change_type,int> calcChanges(int currency, int price);

從另外一個角度看來,涉及本方法的另外一個重要方法,抽象和具體相互轉換。以currency爲例,它作爲整數是一個抽象實體。

若是把整數當作1 + Rest,它變成了一個列表,經過一個映射函數,就能夠從一個整數獲得另外一個列表。

當列表中有重複值時,能夠經過對值的統計,獲得一個值和計數的map。

對一個複雜系統,進行數據結構設計時,須要把複雜的子系統當作一個抽象的數據,使當前層次上的數據結構簡化爲

常見的數據結構,規避圖的圖,表的表,樹的樹等嵌套數據結構。

對數據結構的處理代碼,所謂段,沒必要與編程語言的語句結構對應,它更像一個個patch。每一個patch爲程序增長一些數據結構的處理。理想的狀況下,每一個處理不一樣數據結構部份的段,能夠以任意順序組合到代碼中。

相關文章
相關標籤/搜索