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