明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

庖丁解羊--閑談編程思想(轉(zhuǎn))

[摘要]庖丁解羊----閑談編程思想作者:HolyFire經(jīng)過多年的編程,我發(fā)現(xiàn)編程的思想對(duì)一個(gè)程序員是至關(guān)重要的,以前拿到一個(gè)問題,馬上就開始考慮如何來一點(diǎn)一點(diǎn)把他用代碼來實(shí)現(xiàn),于是啃啊啃啊于愁眉籠罩千辛...
庖丁解羊

----閑談編程思想

作者:HolyFire

經(jīng)過多年的編程,我發(fā)現(xiàn)編程的思想對(duì)一個(gè)程序員是至關(guān)重要的,以前拿到一個(gè)問題,馬上就開始考慮如何來一點(diǎn)一點(diǎn)把他用代碼來實(shí)現(xiàn),于是啃啊啃啊于愁眉籠罩千辛萬苦下每完成了一點(diǎn)就欣喜若狂。編著編著發(fā)現(xiàn)這里不足,那里沒考慮到于是東補(bǔ)補(bǔ)西湊湊,異常蹩腳的完成了一個(gè)小程序,當(dāng)時(shí)的感覺就像我完成了全世界,或許那個(gè)時(shí)代是我最開心的。

完成了四五個(gè)程序的我,開始發(fā)現(xiàn)我做了很多重復(fù)的勞動(dòng),于是乎開始做我的程序庫,編寫功能型模塊。想到了這些模塊只要寫一遍就可以受用無窮不禁得意洋洋,或許那個(gè)時(shí)代我是聰明。

當(dāng)我寫了五六千行代碼的時(shí)候,我發(fā)現(xiàn)我寫的功能模塊已經(jīng)記不清什么是干什么的了,而我已經(jīng)習(xí)慣使用別人寫的比我好的模塊時(shí),我開始迷茫,我做的一切究竟是為了什么。這時(shí)我開始研究別人的代碼,開始懂得什么是優(yōu)化,什么是數(shù)據(jù)結(jié)構(gòu),什么是數(shù)學(xué)建模,我開始研究應(yīng)用數(shù)學(xué)和軟件工程。這時(shí)我開始使用C++用類來寫程序,或許那個(gè)年代我是明智的。

當(dāng)我寫了四五十個(gè)*.h和*.cpp后,開始發(fā)現(xiàn)我寫的類一點(diǎn)都不通用,無法再利用。我開始深入學(xué)習(xí)類以及面向?qū)ο,明白了繼承和封裝,這時(shí)的我才開始深深思考什么是重要的,于是我開始分析問題而不是一上手就開始編代碼;蛟S以前的我是個(gè)傻瓜^_^。

我足足花了三年多的時(shí)間來浪費(fèi)我的青春做了別人僅需一年的事情(當(dāng)然著三年中我積累的經(jīng)驗(yàn)不可能是一年能做到的,但是對(duì)于編程上的修養(yǎng),我浪費(fèi)的時(shí)間已太多),如果你們沒有意識(shí)到這點(diǎn),或許也會(huì)浪費(fèi)很多時(shí)間。

分析能力對(duì)一個(gè)程序員來說是一個(gè)重要的屬性,它直接關(guān)系到你對(duì)事物的理解能力和組織能力,程序員做的工作就是將一個(gè)事物分解成數(shù)學(xué)元素然后重新組織在計(jì)算機(jī)里重現(xiàn),所以如何處理事物是個(gè)要點(diǎn)。

我們了解一個(gè)事物并進(jìn)行描述的時(shí)候,往往是先處理它的一部分,接著處理另一部分,然后等所有的部分都處理完的時(shí)候,具體的事物就重現(xiàn)了。比如給一個(gè)不知道山羊的人介紹山羊,如果你對(duì)他說山羊就是山羊,他是無論如何都不會(huì)明白的。如果你說山羊是一種有四只腳的腦袋上有兩只角,還有短短的尾巴,那他模模糊糊會(huì)有些形象在腦海里了,如果加上有絨絨的毛,可笑的胡子,咩咩的叫的食草動(dòng)物,至少他不會(huì)和;煜饋,如果你能描述的更詳細(xì)更好,那他有九成知道山羊是什么樣子了,當(dāng)他看見山羊的時(shí)候就會(huì)立刻明白。對(duì)于什么都不懂得計(jì)算機(jī)你不用說明什么,但是要是別人或者幾年以后的你自己能看明白你的文檔,詳細(xì)的說明是必須的。而從上面的過程看來,將事物分成小塊來處理是個(gè)好辦法,我們把這個(gè)過程叫做劃分。當(dāng)然劃分是可以繼續(xù)下去,將劃分的小塊繼續(xù)劃分直到不能劃分為止。當(dāng)然要對(duì)一只山羊劃分需要一個(gè)對(duì)山羊有著全面了解的人,所以劃分你的問題的時(shí)候要對(duì)問題有全面的了解?瓷先ミ@對(duì)一個(gè)還沒有了解這個(gè)問題的人是一個(gè)矛盾,劃分一個(gè)事物有助于了解這個(gè)事物而要很好的劃分卻需要對(duì)事物充分的了解。于是我們要有所改變,要改變的是我們的做法。我們先粗略的了解問題,然后粗略的劃分一下,將劃分的模塊再粗略的了解一下,然后將它粗略的劃分,等到都成為不可劃分的小塊時(shí),我們?cè)賮斫M織它。而且這個(gè)時(shí)候,我們對(duì)問題已經(jīng)有全面的了解了,這時(shí)候我們將小塊的重復(fù)部分扔掉(一般一定會(huì)有重復(fù)的部分),然后將這些小塊重新將問題組合起來,想一下將一只大卸八塊的山羊組合起來,哈哈,一定是活不過來了,不過有羊肉吃也不錯(cuò)。如果你很順利的組合起來了,表示你很好的劃分了這個(gè)問題而且了解的很透徹,以后的事將會(huì)一帆風(fēng)順,你這時(shí)腦袋里一定充滿了解決這個(gè)問題的方案,已經(jīng)躍躍欲試了。不要急,聰明的人會(huì)仔細(xì)的將劃分的過程多看幾遍,重組的方法多試幾種,這不但對(duì)以后和編程有好處,也是更好解決方案的起點(diǎn)。

現(xiàn)在我們來解剖一只山羊,如果你愿意還可以細(xì)分,動(dòng)物愛好者請(qǐng)回避。

山羊

-> 腦袋

-> 軀體

-> 四肢

-> 尾部



腦袋
軀體
四肢
尾部

-> 五官
-> 胸
-> 兩只前肢
-> 尾巴

-> 胡子
-> 腹
-> 兩只后肢
-> 絨毛

-> 絨毛
-> 背

-> 骨架

-> 骨架
-> 內(nèi)臟




-> 絨毛




-> 骨架





五官

-> 耳朵

-> 眼睛

-> 鼻子

-> 嘴巴



內(nèi)臟

-> 心

-> 脾

-> 肝

-> 肺

-> 胃

-> 腸

-> 腎



前肢
后肢

-> 腳
-> 腳

-> 絨毛
-> 絨毛

-> 骨架
-> 骨架



最后我們得到的是:

山羊 腦袋 軀體 四肢 尾部 腦袋 五官 胡子 絨毛 骨架 軀體 胸 腹 背 內(nèi)臟 絨毛 骨架 四肢 兩只前肢 兩只后肢 尾部 尾巴 絨毛 骨架 五官 耳朵 眼睛 鼻子 嘴巴 內(nèi)臟 心 脾 肝 肺 腎 胃 腸 前肢 腳 絨毛 骨架 后肢 腳 絨毛 骨架

去掉重復(fù)的部分:

山羊 腦袋 軀體 四肢 尾部 五官 胡子 絨毛 骨架 胸 腹 背 內(nèi)臟 兩只前肢 兩只后肢 尾巴 耳朵 眼睛 鼻子 嘴巴 心 脾 肝 肺 腎 胃 腸 腳 腳

最終的不可劃分的子模塊:

胡子 絨毛 骨架 胸 腹 背 尾巴 耳朵 眼睛 鼻子 嘴巴 心 脾 肝 肺 胃 腸 腳

現(xiàn)在我們將它重新組合一下,是不是很簡單的就完成了。而且我們需要處理的東西并不多,F(xiàn)在我們來用數(shù)學(xué)元素來描述一下

胡子: 數(shù)量不多的多種形狀的輪廓,有各種顏色

絨毛: 非常多的多種形狀的輪廓,有各種顏色

骨架: 多種形狀的輪廓,有一種顏色

胸: 某形狀的輪廓,有一種顏色

腹: 某形狀的輪廓,有各種顏色

背: 某形狀的輪廓,有各種顏色

尾巴: 某形狀的輪廓,有各種顏色

耳朵: 最多兩個(gè)的某形狀的輪廓,有各種顏色

眼睛: 最多兩個(gè)的某形狀的輪廓,有各種顏色

鼻子: 最多一個(gè)的某形狀的輪廓,有各種顏色

嘴巴: 某形狀的輪廓,有各種顏色

心: 某形狀的輪廓,有一種顏色

脾: 某形狀的輪廓,有一種顏色

肝: 某形狀的輪廓,有一種顏色

肺: 某形狀的輪廓,有一種顏色

胃: 某形狀的輪廓,有一種顏色

腸: 多種形狀的輪廓,有一種顏色

腳: 多種形狀的輪廓,有各種顏色

現(xiàn)在我們又得出了數(shù)量、輪廓和顏色這個(gè)三個(gè)元素,他們是所有元素都有的共性,我們找到了組合山羊的最小劃分,雖然在科學(xué)上這不是正確答案,但粗略地表達(dá)一只山羊這已足夠。好,雖然歷時(shí)不多,我們?cè)谀X海里已經(jīng)解決了這個(gè)問題。