第2篇:不要盲目迷信NB的設(shè)計(jì)模式
前言
2006年,我進(jìn)入游戲行業(yè),彼時(shí)流行面向?qū)ο?/strong>的程序設(shè)計(jì):上手代碼前,先設(shè)計(jì)一個(gè)類,把接口寫(xiě)好。
如果當(dāng)時(shí)你還在用面向過(guò)程的方式編程,會(huì)被別人看不起,還會(huì)被諷刺:“你面向?qū)ο蟮乃季S方式還不成熟?!?/p>
2012年,隨著Unity的興起,組件化開(kāi)發(fā)在游戲行業(yè)迅速火爆,一切皆組件!
“你寫(xiě)個(gè)組件就完事了”;“你這個(gè)沒(méi)有用組件的思想”,熟悉的諷刺又來(lái)了。
2018年,又興起了ECS架構(gòu)、Entity、Component Data、System、Entity 實(shí)例,其中包含各種Component Data,Component Data,組件的數(shù)據(jù),不含方法, System 完成特定功能的算法,數(shù)據(jù)來(lái)自Entity中的 Component Data。好高級(jí)啊,這個(gè)666。
但是大家有沒(méi)有發(fā)現(xiàn):ECS又回到了C的面向過(guò)程的模式,算法處理純數(shù)據(jù)結(jié)構(gòu)。
system 函數(shù)方法,Entity 純數(shù)據(jù)實(shí)體,不就是C語(yǔ)言的函數(shù)+結(jié)構(gòu)體么?!之前不是說(shuō)面向過(guò)程不好么?怎么ECS又回歸了呢?

“組件化開(kāi)發(fā)過(guò)時(shí)了,你要用ECS?!?/p>
扯淡!我用C語(yǔ)言開(kāi)發(fā)的時(shí)候,你還在讀初中... ...
不要盲目迷信某種架構(gòu)模式
當(dāng)出現(xiàn)新的架構(gòu)與設(shè)計(jì)思想時(shí),我們首先要詳細(xì)地了解它是什么,解決哪些問(wèn)題,優(yōu)勢(shì)是什么,缺點(diǎn)是什么,本質(zhì)是什么?
沒(méi)有過(guò)時(shí)的架構(gòu)思想,只有合適的。能簡(jiǎn)單解決問(wèn)題的就是好方法。
例如,你的游戲用組件化開(kāi)發(fā)很快能完成,穩(wěn)定,沒(méi)有bug,又滿足要求, 為什么要改成ECS呢?
Linux一切皆文件的設(shè)計(jì)思想和模式,一直沒(méi)有變過(guò)。
C語(yǔ)言面向過(guò)程的設(shè)計(jì)方式,締造了一個(gè)又一個(gè)經(jīng)典框架和工具。GCC、Git、Linux、FFMPEG、Redis、Nginx等。
扎實(shí)的代碼基礎(chǔ),扎實(shí)的OS底層基礎(chǔ),完整的知識(shí)體系結(jié)構(gòu), 才能讓你駕馭這些設(shè)計(jì)模式。從解決問(wèn)題出發(fā),框架設(shè)計(jì)來(lái)源于解決問(wèn)題,又回到問(wèn)題中更好的解決問(wèn)題。
任何設(shè)計(jì)模式思想,都要回歸問(wèn)題的本身。解決怎樣的問(wèn)題,優(yōu)勢(shì)是什么? 在實(shí)踐中總結(jié)設(shè)計(jì)模式,然后用于實(shí)踐中解決問(wèn)題,而不是給自己思想上造成困擾,要達(dá)到無(wú)招勝有招的境界。

如何成長(zhǎng)為架構(gòu)師

1、先精通一門語(yǔ)言的核心機(jī)制和運(yùn)行原理再觸類旁通。不要一上來(lái)就討論這個(gè)語(yǔ)言好,哪個(gè)語(yǔ)言差,先把你用的這個(gè)語(yǔ)言搞懂再說(shuō)。比如, 局部變量分配在哪里? new 出來(lái)的對(duì)象內(nèi)存分配在哪里?什么是垃圾回收, 什么是內(nèi)存碎片,怎么引起的等等。
2、養(yǎng)成良好的編碼習(xí)慣,寫(xiě)的代碼能知道代碼的結(jié)果。我們很多同學(xué),寫(xiě)代碼不規(guī)范,總是丟三落四, 自己寫(xiě)完代碼后,說(shuō)不出來(lái)結(jié)果是什么,出了問(wèn)題,全靠調(diào)試器, 完全不知道如何去分析錯(cuò)誤。要讓自己養(yǎng)成每行代碼下去清楚的知道結(jié)果是什么,能說(shuō)出來(lái)這個(gè)實(shí)現(xiàn)的開(kāi)銷,時(shí)間復(fù)雜度,空間復(fù)雜度等, 做到每行代碼心種有數(shù)的習(xí)慣。
3、在數(shù)據(jù)結(jié)構(gòu)與經(jīng)典算法不熟悉之前,不要漫談架構(gòu)。鏈表怎么設(shè)計(jì), 動(dòng)態(tài)數(shù)組怎么設(shè)計(jì), 內(nèi)存池怎么做, Hash表怎么實(shí)現(xiàn), 樹(shù)怎么設(shè)計(jì), 圖怎么設(shè)計(jì), 某個(gè)算法的時(shí)間復(fù)雜度是多少?空間復(fù)雜度是多少?最短路徑,AStar尋路, 排序等等。這些經(jīng)典的算法和數(shù)據(jù)結(jié)構(gòu),必須掌握好,徒手就能實(shí)現(xiàn)。因?yàn)槁涞匾粋€(gè)架構(gòu),最終就靠這些。

image
4、閱讀開(kāi)源代碼, 學(xué)習(xí)優(yōu)秀的架構(gòu)設(shè)計(jì)。搭建完完整的知識(shí)體系以后,熟練了數(shù)據(jù)結(jié)構(gòu),精通了編程語(yǔ)言機(jī)制。這個(gè)時(shí)候可以(或:要)學(xué)習(xí)別人解決問(wèn)題的方法與架構(gòu),可以閱讀一些開(kāi)源的框架與工具,絕不是某個(gè)師兄的NB的項(xiàng)目,而是真正開(kāi)源有名氣的,一直在用的框架,如Redis,nginx,Linux內(nèi)核等相關(guān)行業(yè)真正的明星開(kāi)源框架。
首先分析需求, 這個(gè)框架到底是解決什么問(wèn)題的,先學(xué)習(xí)相關(guān)的理論知識(shí)和基礎(chǔ),了解這個(gè)框架的基本使用。
分析源碼的目錄結(jié)構(gòu),從問(wèn)題出發(fā),看看框架是如何展開(kāi)來(lái)解決問(wèn)題的,如何把問(wèn)題轉(zhuǎn)成架構(gòu),分而治之的。帶著重點(diǎn)的問(wèn)題,閱讀框架是如何解決這些問(wèn)題的,哪些數(shù)據(jù)結(jié)構(gòu)用的巧妙,如何克服一些問(wèn)題,哪些功能它實(shí)現(xiàn)了,哪些功能留個(gè)用戶實(shí)現(xiàn),如何開(kāi)放接口給用戶,這么取舍的理由是什么?隨著不斷積累與思考,你就能明白設(shè)計(jì)的思想和技巧。
最后, 當(dāng)你能夠駕馭數(shù)據(jù)結(jié)構(gòu)與代碼,有了完整的知識(shí)體系,能夠從實(shí)際解決問(wèn)題出發(fā),選取最佳解決問(wèn)題的方法時(shí),你就能形成一個(gè)自己的設(shè)計(jì)與框架,并能組織好公司的團(tuán)隊(duì),完成對(duì)應(yīng)的項(xiàng)目功能和需求。至于什么模式,并不重要。

結(jié)語(yǔ)
黃貓黑貓,捉到老鼠就是好貓。
在設(shè)計(jì)上,能簡(jiǎn)便快捷地解決問(wèn)題的方法,就是好方法,就是好模式。

關(guān)于學(xué)習(xí)的任何問(wèn)題,都可在評(píng)論區(qū)提問(wèn)。后續(xù)有時(shí)間會(huì)一一給大家回復(fù)。