最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

第五篇:不要在抽象的路上越走越遠(yuǎn)

2020-08-24 17:04 作者:博毅創(chuàng)為  | 我要投稿

引言

遙想當(dāng)年,剛學(xué)設(shè)計(jì)模式的時(shí)候,我們做的最多的就是抽象成一個(gè)對(duì)象, 設(shè)計(jì)出漂亮的面向?qū)ο蟮睦^承體系。

虛函數(shù),重寫,重載,各種手段。恨不得把里面的每個(gè)概念,都封裝一下,抽象一下。恨不得每個(gè)概念都要高度的可重用,就會(huì)把一個(gè)概念抽象成幾個(gè)層次。

1: 從代碼維護(hù)的角度來說,過多的抽象增加代碼維護(hù)難度。
比如我們游戲中的子彈,有各種類型的子彈,有各種威力的子彈, 很多我們往往設(shè)計(jì)的時(shí)候, 先抽象子彈基類,然后各種子彈再繼承這個(gè)基類, 子彈---》炸彈---》超級(jí)炸彈, 你會(huì)發(fā)現(xiàn)體系越來越復(fù)雜。

過多的抽象,會(huì)導(dǎo)致每個(gè)概念分成了好幾個(gè)層次,出來龐大的繼承體系,我相信沒有一個(gè)人喜歡龐大的繼承體系,維護(hù)代碼的時(shí)候,一個(gè)類,繼承了幾層,你維護(hù)的時(shí)候要跳轉(zhuǎn)好多次,這個(gè)給維護(hù)帶來很多難度,同時(shí),如果以前的抽象不那么漂亮的時(shí)候,你所有的代碼都圍繞這樣的數(shù)據(jù)對(duì)象,漂亮的展開,你要修改,也會(huì)帶來很多的煩惱,要重寫所有的相關(guān)代碼才可以。

我們抽象一個(gè)體系出來的目的是為了什么?先要想清楚這個(gè)問題??赡懿煌娜藭?huì)有不同的答案,比如我抽象出來,可以減少代碼的重復(fù)編寫,提升可重用性。比如,男人,女人,我先抽象一個(gè)人的對(duì)象,然后在繼承男人,女人。這樣,人的代碼我抽象出來,男人可以共用人的,女人可以共用人的。

看上去很正確,對(duì)吧?

但是如果換一個(gè)角度,我就寫一個(gè)人的代碼,然后加一個(gè)數(shù)據(jù)成員sex, 來決定這個(gè)人是男人還是女人。

這樣也可以哈,我就只有人這個(gè)概念,同時(shí)sex,來表示不同實(shí)例的數(shù)據(jù),到底用哪個(gè)呢?
也就是說我們抽象的目的是什么?

我們抽象的目的,是為了完成既定的任務(wù)與功能,達(dá)到項(xiàng)目的需求, 讓,讓開發(fā)協(xié)作變簡(jiǎn)單,而不是構(gòu)建一個(gè)漂亮的體系。完成對(duì)應(yīng)的功能,概念造的越少越好, 越簡(jiǎn)單越好。

比如,我們剛才說的子彈,我們還可以這樣設(shè)計(jì),子彈動(dòng)畫,子彈數(shù)據(jù)屬性,都可以通過數(shù)據(jù)配置。子彈的控制邏輯是一個(gè)類型Bullet,初始化的時(shí)候,吃入 動(dòng)畫數(shù)據(jù)+游戲數(shù)值數(shù)據(jù)(攻擊力等), 即使你不抽象也能很真實(shí)的解決好對(duì)應(yīng)的問題,而不用維護(hù)抽象出來的龐大的繼承體系和關(guān)系。

當(dāng)我們每次動(dòng)筆,要開始抽象的時(shí)候,我們要問自己,這么做到底的原因是什么?有沒有不抽象更簡(jiǎn)單的做法,更真實(shí)的做法。
真實(shí)性很重要,因?yàn)檎鎸?shí)性,直接的解決問題,大家維護(hù)起來會(huì)更方便。

同時(shí)抽象層次不宜過多, 還是那句,linux內(nèi)核驅(qū)動(dòng),那么多設(shè)備,一個(gè)文件機(jī)制就搞定了。真正的可擴(kuò)展性其實(shí)就是源于簡(jiǎn)單,只有簡(jiǎn)單才可以推廣,相反復(fù)雜的繼承體系,可擴(kuò)展性未必就好。

所以我們做設(shè)計(jì),本質(zhì)就從問題出發(fā),從解決問題自然而衍生對(duì)應(yīng)的設(shè)計(jì),而不是從漂亮的抽象開始。

2: 從程序性能成面上來說,過多的抽象,其實(shí)是不好的。

舉個(gè)例子, 你編寫了人類(數(shù)據(jù)成員+方法), 男人(數(shù)據(jù)成員+方法), 你很難清晰的知道男人這個(gè)數(shù)據(jù)結(jié)構(gòu)到底占了多少內(nèi)存(虛函數(shù)表等看不見的內(nèi)存開銷),在內(nèi)存數(shù)據(jù)里面如何布局的(內(nèi)存是否對(duì)齊)。

這些是編寫高性能代碼的關(guān)鍵,所以你發(fā)現(xiàn),ECS這種高性能出發(fā)的設(shè)計(jì),就把數(shù)據(jù)都放一塊。這樣方便控制CPU的內(nèi)存cache, 地址對(duì)齊, 分配釋放等。大量的數(shù)據(jù)對(duì)象,如果你過多的抽象,越來越看不清楚數(shù)據(jù)的布局和結(jié)構(gòu),極不利于編寫高性能的代碼。

3: 過多的抽象層次,容易造成內(nèi)存泄露。

過多的抽象,就會(huì)導(dǎo)致,抽象體系內(nèi)各個(gè)類的構(gòu)造函數(shù)被調(diào)用,釋放對(duì)象的時(shí)候,會(huì)導(dǎo)致各個(gè)層次抽象類析構(gòu)函數(shù)被調(diào)用,由于層次過多,每個(gè)層次維護(hù)自己的釋放,給維護(hù)對(duì)象的數(shù)據(jù)內(nèi)存帶來很搞的復(fù)雜度,這個(gè)就是為什么很多程序員寫代碼容易內(nèi)存泄露,也許在一開始開發(fā)機(jī)制就給你埋下了一顆雷。想反的,直接數(shù)據(jù)對(duì)象和結(jié)構(gòu),能跟清楚的維護(hù)內(nèi)存的分配與釋放。

比如ECS里面,釋放掉Entity就可以了。因?yàn)閿?shù)據(jù)都很清晰的排列在每個(gè)entity里面。

最后

總之, 盡量避免過度的抽象和減少抽象的層次,盡量做到數(shù)據(jù)+方法來處理對(duì)應(yīng)的問題,真實(shí)的解決項(xiàng)目問題,將簡(jiǎn)單勝于花哨。


第五篇:不要在抽象的路上越走越遠(yuǎn)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
扎赉特旗| 昭平县| 桦川县| 朝阳区| 康保县| 白城市| 交口县| 屏边| 安国市| 时尚| 德钦县| 涿鹿县| 朝阳区| 东明县| 微博| 中江县| 黑河市| 通江县| 吴江市| 山西省| 寿光市| 新河县| 永福县| 铁岭市| 弥勒县| 泸水县| 宁蒗| 茶陵县| 唐海县| 公安县| 卢龙县| 余姚市| 渭源县| 铜陵市| 革吉县| 若羌县| 明水县| 新邵县| 达尔| 嘉兴市| 铅山县|