道法自然《三》:框架設(shè)計(jì)要提供機(jī)制
前言
**什么叫提供機(jī)制 **
《Unix編程藝術(shù)》里有一句框架設(shè)計(jì)的名言“提供機(jī)制,而不提供策略”。
要弄清楚這句話,首先要了解什么是機(jī)制,什么是策略?接下來我拿游戲開發(fā)來說明。

游戲客戶端引擎unity、cocos、Laya、ue4等提供了機(jī)制。如:組織游戲邏輯,提供場(chǎng)景 +節(jié)點(diǎn) +組件模式。基于這樣的機(jī)制來開發(fā)業(yè)務(wù)邏輯。至于怎么開發(fā),如何組織項(xiàng)目,這屬于開發(fā)人員的事情。
事件訂閱與發(fā)布。提供事件訂閱機(jī)制,要接入哪個(gè)事件,你就監(jiān)聽。
渲染效果定制。提供Shader開發(fā)機(jī)制,材質(zhì)作為配置文件與數(shù)據(jù)傳送,Shader作為算法,開發(fā)人員只要自己開發(fā)Shader,結(jié)合材質(zhì)的機(jī)制,就能實(shí)現(xiàn)游戲渲染效果定制。
資源管理。提供普通的資源管理加載與卸載的機(jī)制,不做過多的功能。AssetsBundle 提供資源更新的機(jī)制,不做過多的功能。這就回答了很多程序員心中的疑問:為什么不做一個(gè)MMORPG里面的四叉樹的場(chǎng)景管理,為什么不做一個(gè)服務(wù)器通訊的完成模塊啊,為什么不完整的做好熱更新?因?yàn)檫@些大多屬于策略類的東西,和具體項(xiàng)目有關(guān)系。所以一般框架設(shè)計(jì),與具體的項(xiàng)目需求有關(guān)的,都不提供實(shí)現(xiàn),或推到上一層。
所以我們基于游戲引擎做的框架,大部分是基于策略做的一些完成公司特定項(xiàng)目的功能和框架,和游戲引擎的設(shè)計(jì)不屬于同一維度,比如UI框架,背包系統(tǒng)等,均屬于策略類的范圍。

如何判斷是框架還是策略?
明白了什么是機(jī)制,設(shè)計(jì)者如何判斷屬于機(jī)制還是策略,這個(gè)就變得很重要。
一般怎么判斷呢?大部分的設(shè)計(jì)師會(huì)有”感覺”。
這個(gè)感覺,來自于平常的學(xué)習(xí)與積累,閱讀別人的框架,組織管理項(xiàng)目開發(fā)經(jīng)驗(yàn)。
那么平常如何練習(xí)這樣一種”感覺”呢?當(dāng)你設(shè)計(jì)決策有困惑的時(shí)候,你可以按照下面的方法試試。

我做這個(gè)框架的愿景是什么?
馬云說做企業(yè)要有愿景,如果你沒有愿景就會(huì)迷茫,寫程序做框架設(shè)計(jì)亦是如此。
SpringClound 就是提供微服務(wù)的框架;Skynet就是提供Actor模式的服務(wù)調(diào)度框架,;Netty基于NIO的高性能的網(wǎng)絡(luò)框架;protobuf 跨平臺(tái)跨語(yǔ)言的序列化與反序列化工具庫(kù)。
在github上,你去看,好的框架在設(shè)計(jì)的時(shí)候就有它的愿景。
xLua的愿景:
XLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc。
做游戲引擎是為開發(fā)各種類型的游戲提供基礎(chǔ)服務(wù)。做一個(gè)Moba類的游戲框架,基于游戲引擎,結(jié)合項(xiàng)目需求,制定一個(gè)快速開發(fā)Moba類游戲的框架與技術(shù)工具。明確了這個(gè)立場(chǎng)以后,凡是符合這個(gè)立場(chǎng)的,你就可以加入,不符合的你就不做。做設(shè)計(jì)的時(shí)候,想好愿景,很多問題就豁然開朗了。

做框架設(shè)計(jì),要經(jīng)常思考如何做減法
明白了框架愿景以后,判斷要怎么設(shè)計(jì),要不要做?
我們可以嘗試做減法,而不是一味的做加法!
這個(gè)功能我推給使用我的上層做可不可以?上層做這個(gè)功能用我提供的機(jī)制,是否能簡(jiǎn)單做到?如果能,那就到此為止,讓上層處理。
話說多了容易錯(cuò),框架功能做多了容易被人說不靈活。所以做減法是必要的。

Lua編程語(yǔ)言就很懂得做減法:它不提供任何其他的API,它完成的功能就是嵌入式的輕量級(jí)腳本,所以游戲框架經(jīng)常用Lua做腳本。
做產(chǎn)品的三層結(jié)構(gòu)
經(jīng)過一些總結(jié)分析,我們發(fā)現(xiàn)做一個(gè)游戲出來大致分為三層。從下往上:
客戶端
第1層基礎(chǔ)框架層:提供基礎(chǔ)功能服務(wù),比如客戶端游戲引擎,protobuf、Socket等基礎(chǔ)庫(kù)。
第2層產(chǎn)品框架層:提供完成游戲研發(fā)、發(fā)布、調(diào)試等基礎(chǔ)服務(wù)性框架,比如MMORPG游戲框架、地圖編輯與尋路導(dǎo)航、AOI、 粒子特效、UI框架、版本管理與資源熱更新等。
第3層業(yè)務(wù)邏輯代碼:完成特定項(xiàng)目業(yè)務(wù)邏輯的實(shí)現(xiàn)。
在開發(fā)代碼的時(shí)候,要清楚地知道自己是哪一層。
服務(wù)端
第1層基礎(chǔ)框架:提供基礎(chǔ)功能服務(wù)并組合起來,網(wǎng)絡(luò),協(xié)議,數(shù)據(jù)庫(kù),業(yè)務(wù)邏輯開發(fā)機(jī)制。
第2層產(chǎn)品框架:棋牌,MMO, Moba, 基于基礎(chǔ)框架,搭建分布式服務(wù)器集群,維護(hù)工具,更新停服檢修等。
第3層服務(wù)器業(yè)務(wù)邏輯的實(shí)現(xiàn)。
現(xiàn)在行業(yè)都很發(fā)達(dá),第1層基本上都有成熟開源的框架為我們做好了。第2層是目前我們架構(gòu)師主流的架構(gòu)任務(wù)。第3層可以放一些基礎(chǔ)的程序崗位來實(shí)現(xiàn)。
清楚了這些結(jié)構(gòu)以后,你會(huì)發(fā)現(xiàn)提升自己的路徑也就出來了。

做業(yè)務(wù)邏輯的同時(shí),搜集開發(fā)特定產(chǎn)品的需求,思考如何做特定產(chǎn)品框架能滿足這些需求,特定產(chǎn)品框架的基礎(chǔ)支持,可以熟悉常用開源的第三方方案。
熟悉常用的第三方特定功能的庫(kù),就能把產(chǎn)品變成需求,把需求變成架構(gòu),使用基礎(chǔ)服務(wù)來支撐架構(gòu)。
END
今天的《設(shè)計(jì)之道》就分享到這里,如果你覺得本篇文章不錯(cuò),歡迎轉(zhuǎn)發(fā),吸引更多的同行,在留言區(qū)一起討論,在討論中越辯越明。謝謝大家!