這篇文章實際寫于3年前事扭,當(dāng)時我在做一個棋牌游戲的項目,偶然的機(jī)會接觸到scratch(那時少兒編程還沒那么流行)桶癣,給我寫程序帶來了一些靈感拥褂,于是寫下了下面的文字。原文是這樣的:
引子
我最近在做一個名叫牛牛的棋牌項目牙寞,首期包含六種玩法饺鹃,而且客戶要求交貨的周期比較短,只有不到一個月的時間。由于每種玩法的邏輯和流程并不相同悔详,所以按照常規(guī)的實施方法镊屎,可能需要創(chuàng)建六個代碼工程,每個工程重復(fù)相同的基建伟端,然后分別去實現(xiàn)各自的數(shù)據(jù)和算法杯道。可想而知整個項目的工程總量是比較大的(全部代碼可能有幾萬行责蝠,但實際差異化部分還不到1萬行)党巾,代碼的過度冗余也非常不便于項目后期的維護(hù)。
話又說回來霜医,多個玩法多個工程齿拂,其實業(yè)內(nèi)的外包和中小團(tuán)隊多這么干,因為可以并行開發(fā)肴敛,快速交付署海、收款。我也想這么弄啊医男,無耐團(tuán)隊就我一個后端人員砸狞,我必須在工程量、時間和可維護(hù)性方面綜合做個權(quán)衡镀梭。我花了大半天的時間來思考刀森,最終還是決定將所有玩法融合到一個工程中,這是個富有挑戰(zhàn)性的事情(因為之前有做過四個玩法的牛牛报账,當(dāng)時沒想好研底,是按多工程來完現(xiàn)的)。
scratch積木式編程
為了培養(yǎng)兒子的編程興趣透罢,前不久我從朋友那了解到scratch榜晦,它是麻將理工學(xué)院開發(fā)的一款面向兒童和青少年的簡易編程工具,有興趣的朋友可以百度一下羽圃。
這個軟件的特點是乾胶,學(xué)習(xí)者可以不需要認(rèn)識英文,不需要使用鍵盤朽寞,只需要會用鼠標(biāo)進(jìn)行簡單的電腦操作胚吁,會在電腦上畫圖形搭積木,就能制作出富有趣味的動畫和小游戲愁憔。
麻省的工程師是牛B的腕扶,他們能想到將編程中的各種常用元素,如流程控制吨掌、事件檢測半抱、變量脓恕、鏈表等極度抽象的東西,用圖形化積木塊的方式表達(dá)出來窿侈,真佩服他們的創(chuàng)作能力炼幔。
下面簡單認(rèn)識下scratch的圖形積木:
這些是流程控制的,當(dāng)我第一眼看到時史简,反正我笑了乃秀。
這個是控制事件的,其中的廣播就是程序的同步機(jī)制圆兵。
關(guān)于積木塊的搭法跺讯,認(rèn)清他們的用途之后,組裝起來比較輕松殉农。下圖是我制做的一個簡單的貓貓撞墻(控制貓貓在兩個墻體之間來回奔跑)的小程序刀脏,圖片右邊就是積木塊的組裝效果。
牛牛的積木式設(shè)計
牛牛面臨的問題超凳,就是玩法太多愈污,每個玩法的流程又不大一樣,導(dǎo)致程序非常不易組織轮傍。理論上暂雹,如果可以將每個玩法的代碼解藕,切割成一塊塊的创夜,用搭積木的方式重新組合杭跪,也許可以解決問題。
首先挥下,讓我們來設(shè)計積木塊揍魂,如圖:
每個積木塊具有兩個指針:“下個積木塊”和“兄弟積木塊”桨醋∨镂粒“兄弟積木塊”指的是當(dāng)某個操作執(zhí)行不成功時,可由同級的積木塊執(zhí)行完成喜最,相當(dāng)于并聯(lián)的概念偎蘸,而“下個積木塊”相當(dāng)于串聯(lián)的概念。
多個積木塊如何組裝呢瞬内?舉個例子迷雪,有三個積木塊,塊1和塊2并聯(lián)虫蝶,然后串聯(lián)塊3章咧,預(yù)期的結(jié)果是塊1和塊2任一個執(zhí)行成功后轉(zhuǎn)到塊3,實際有可能塊1不成功能真,轉(zhuǎn)到塊2執(zhí)行后再到塊3赁严,如下圖所示:
牛牛的積木式編程
按照積木塊的設(shè)計方法扰柠,我對牛牛項目主要的玩法和流程分析后畫了個圖,如下:
圖中每一個方塊代碼一個步驟疼约,表示一個積木塊卤档,積木塊之間用線條相聯(lián)。程序設(shè)計時程剥,積木塊之間應(yīng)該解耦劝枣,每個積木塊僅僅實現(xiàn)單純的功能,如果某個積木塊比較復(fù)雜织鲸,牽扯到多個流程舔腾,那么可能就必須切分。
下面我摘取牛牛項目的部分積木塊定義和組裝代碼昙沦,如下:
另外琢唾,考慮到服務(wù)器重啟或者升級維護(hù),牛牛的積木還支持?jǐn)帱c恢復(fù)盾饮,實際運維時采桃,玩家基本感覺不到任何異常。
結(jié)語
搭積木是很簡單的一件事情丘损,是人類的啟蒙教育方式之一普办,而寫程序是很復(fù)雜很枯燥的一件事情,國外的教育專家用搭積木的方法徘钥,引導(dǎo)小學(xué)生自主編程衔蹲,化復(fù)雜為簡單,化枯燥為生動呈础。同樣的舆驶,由淺入深,舉一反三而钞,當(dāng)我們在工作中沙廉、生活中遇到問題的時候,也可以想想積木臼节,這個人類認(rèn)知的起源撬陵,也許會再一次帶給我們靈感。