這里講的不是一個(gè)一步一步的做麻將游戲執(zhí)行教程,而是“設(shè)計(jì)”本身——探索,思考,執(zhí)行,修改的過程,一步步地執(zhí)行設(shè)計(jì)其實(shí)是最簡(jiǎn)單的那一部分,執(zhí)行設(shè)計(jì)不叫設(shè)計(jì),最多算個(gè)熟練工。
首先我們拿到一副麻將。第一步應(yīng)該是分解“設(shè)計(jì)”這件事情本身,(注意,這里不是把麻將分成幾類),分解出數(shù)據(jù)結(jié)構(gòu)的那一層次設(shè)計(jì)。通常我們拿到一份這樣的設(shè)計(jì),直接開始選擇數(shù)據(jù)結(jié)構(gòu)——麻將是背包、堆棧、隊(duì)列、紅黑樹?特別喜歡照本宣科,善于模仿的同學(xué)。而做過項(xiàng)目的同學(xué),通常首先開始弄一個(gè)麻將接口、麻將類,然后增加打麻將方法。而我認(rèn)為這都不是好的設(shè)計(jì)步驟。
傳統(tǒng)開發(fā)人員對(duì)軟件的理解是數(shù)據(jù)結(jié)構(gòu)+算法,現(xiàn)代面向?qū)ο蟮拈_發(fā)人員的理解是抽象對(duì)象(繼承/多態(tài)/泛型)出具體對(duì)象。它們的共同特點(diǎn)都是將現(xiàn)實(shí)世界直接抽象為程序設(shè)計(jì),而每種開發(fā)人員所掌握的設(shè)計(jì)范式或習(xí)慣均有差異,為了團(tuán)隊(duì)不得不用框架及最佳實(shí)踐來約束差異,減少理解和修改的成本。
但是,將現(xiàn)實(shí)世界直接抽象為程序設(shè)計(jì)到底是不是正確的思路呢?這個(gè)思路對(duì)開發(fā)人員無疑是最直觀的,但長(zhǎng)久在團(tuán)隊(duì)的約束下,久而久之就變成了對(duì)“最佳實(shí)踐”的執(zhí)行——而非設(shè)計(jì),而執(zhí)行則是最簡(jiǎn)單的那一部分,只會(huì)執(zhí)行的程序員通常被戲稱為碼農(nóng)。
那么麻將是背包、堆棧、隊(duì)列還是紅黑樹呢?都不是,你會(huì)發(fā)現(xiàn)你學(xué)會(huì)了這么多數(shù)據(jù)結(jié)構(gòu),一點(diǎn)用處也沒有,(傳統(tǒng)的面向?qū)ο笤O(shè)計(jì)無疑能夠解決這類問題,面向?qū)ο?比如;" />
為什么這么多數(shù)據(jù)結(jié)構(gòu),都處理不了麻將?抑或說處理地非常別扭,不夠完備。因?yàn)槲覀冎皇潜痴b了那些數(shù)據(jù)結(jié)構(gòu),就像背誦乘法口訣表,1乘以1到9乘以9,那么19乘以1234呢?沒有人教你乘法過程——沒有人教你對(duì)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)。因?yàn)槌鯇W(xué)者在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí)是與算法相對(duì)的,會(huì)被理解為一個(gè)靜態(tài)的結(jié)構(gòu)。但是數(shù)據(jù)結(jié)構(gòu)不是一個(gè)靜態(tài)結(jié)構(gòu),不是像房型建筑就是那個(gè)樣子。數(shù)據(jù)結(jié)構(gòu)就包含了算法,我們應(yīng)該將數(shù)據(jù)結(jié)構(gòu)分解為集合與算法——數(shù)據(jù)結(jié)構(gòu)的本質(zhì)不是結(jié)構(gòu),而是集合與算法,這看起來很像面向?qū)ο笾械膶?duì)象——狀態(tài)與方法。但它們之間還是有一定的差別。
為什么說數(shù)據(jù)結(jié)構(gòu)的本質(zhì)是集合與算法?回到麻將游戲上,不能用其它數(shù)據(jù)結(jié)構(gòu),不如我們?cè)O(shè)計(jì)一個(gè)麻將結(jié)構(gòu)——麻將本身是一個(gè)集合,這個(gè)集合分為兩大類。1)桌面上的麻將,2)人手上拿的13張麻將。
1)桌面上的麻將——它的最大值是恒定的,只能被隨機(jī)delete不能被add,為空后游戲結(jié)束。(這就是3個(gè)算法)
2)人們手上的麻將——它的值始終是恒定的,隨機(jī)add,選定delete,每delete一次,同時(shí)被從桌面麻將上add一個(gè)進(jìn)來。(這是4個(gè)算法)
你說這是什么數(shù)據(jù)結(jié)構(gòu)?第2個(gè)看起來有點(diǎn)像哈希表,因?yàn)橐x定delete,要有索引,有索引就用哈希?No,這不是任何數(shù)據(jù)結(jié)構(gòu),這只是集合,以及對(duì)集合的操作。不是棧也不是樹,不要讓數(shù)據(jù)結(jié)構(gòu)將你的思維限定住了
不應(yīng)該將現(xiàn)實(shí)世界直接轉(zhuǎn)化為計(jì)算機(jī)語(yǔ)言,而應(yīng)該先抽象為數(shù)學(xué)語(yǔ)言(或者說數(shù)學(xué)語(yǔ)言的需求分析),然后進(jìn)行技術(shù)選型,再轉(zhuǎn)化為計(jì)算機(jī)語(yǔ)言——函數(shù)式也好,面向?qū)ο笠埠,?dòng)態(tài)語(yǔ)言也好,都是浮云。