首頁 > 頭條 > 主體

程式設計最重要的能力--思想

小云云
發布: 2017-11-06 17:06:25
原創
2451 人瀏覽過

能寫出琳瑯滿目的程式碼就能顯示出你是真正的高手?錯,真正的高手是擁有最重要的程式設計思想技術的,即使他現在所會的技術全部過時,他依舊可以迅速掌握新的技術,寫出高品質的程式。

如今的框架和流行語言封裝了大量實用的資料結構,甚至還有一些經典的演算法,帶給我們很大的便利,使用.NET簡單拖曳出一個網站,雖然後台操作資料庫綁定,處理數據,更新數據會有些重複無聊,後來接觸了Linq,和thinkPHP(php的MVC)可以大大減少這些沒太有技術含量的程式碼,寫多了依舊覺得沒太有意思,遠沒有自己寫個小程式或小遊戲來的痛快。
記得我們資料結構老師曾經說:「演算法是一種藝術。」然後,我們幾乎全班報以不屑的表情,而我當時也曾是其光榮的一員。因此資料結構學的很爛,也很後悔。
演算法書上提到掃雷,掃雷這個經典遊戲,其中有個核心演算法就是計算每個格子周圍有多少個地雷。
我想玩過兩年程式設計的人會迅速想到這樣一個演算法:用二維數組儲存每個格子的信息,(當然地雷已經隨即分配好了),然後遍歷這個數組,遍歷到一個就統計其周邊八個方向的地雷數,將結果儲存到目前遍歷的陣列項目中。當然可以把統計的過程寫成函數呼叫下。這個是最容易想到的演算法。
後來我覺得這個還是有點浪費了,因為很多周圍沒有地雷的格子也都要掃描八個方向是否有雷,我開始轉念去想,我要統計的是每個格子周圍的地雷數,那麼決定他地雷數的是什麼呢,當然是地雷了,所以開始想到第二個演算法,依舊遍歷那個二維數組,只是僅當遍歷到地雷時,將地雷週邊八個方向的格子裡的數值+1 ,這樣大大縮小了統計的次數。這個應該屬於逆向思考吧。
同理想做個象棋程式時會遇到「將軍」的演算法,判斷自己的將軍或元帥是否處在下一步被吃掉的情況下(象棋術語叫將軍)。當然很簡單的演算法就是遍歷對方目前存在且有攻擊力的棋子,下一步是否有可能殺掉他的將。但我們也可以去反過來去想,既然是判斷將是否處於被殺狀態,那直接從他入手,判斷其直線範圍內是否有對方,“卒”“車”或“炮”,再判斷自己周圍的日字格內有沒有對方「馬」的存在等等去逆向想問題。
 
程式設計的感受

程式設計最重要的是一種思想,程式設計的真正快樂是設計一個演算法賦予程序,每個程式都是有生命力的,而演算法是他們的魂魄,創造一個有生命力的程式當然是件快樂的事情,如果感到不快樂或程式設計枯燥是因為在練習一些所謂的技術,所謂的方法和模式,而非為了程式設計而程式設計。
程式離不開技術,如同練武離不開招式一般。
境界高的武者常說,功夫的最高境界是心中無招。而這種無招並非什麼都不會,而是集了百家之長,融了千招萬招之後,思想,招式,身體高度統一,隨心所欲地見招拆招。也並非學遍所有招式便達到這種境界,要真正懂得思考招式之間內在的聯繫,慢慢融入成自己的思想,才有可能達到。


有些老程式設計師常常教育我們,程式設計最忌諱多而不精。
會的多不代表是高手,會的少也不代表是菜鳥,程式設計重在思想,這種思想決定了你在這門技術裡走的深度。
思想是什麼,是解決問題的思路,是規劃能力,分析能力,是迅速將解決問題的思路條理化。可以是演算法,模式或是框架。
這些思想需要幾年十幾年的經驗沉澱。
 
現在流行物件導向思想,簡單地說一下從.NET以來對這個思想膚淺的認識,從之前C的大量函數庫到現在的大量的類別庫(或java裡的套件)似乎有了類,就物件導向了,這個說法有些牽強,無論學習Java或C++,最重要的是要用C++,Java去想問題,用物件導向去思考問題,將物件當作處理問題的基元。
上次去面試,面試官要我講述物件導向的繼承,多型,和封裝的特性。
我給他講了一個我寫過的簡單坦克大戰程式分析這三個特性。
繼承:這個概念十分好理解,子類繼承了父類的所有共有成員,比如一個坦克的基類,實現基本坦克特性和方法,如大小,生命值,移動,判斷碰撞等,以後要設計一個獨特的坦克,如幻影坦克(紅警了),只需要繼承下父類,再加一個幻影的方法就可以解決了。繼承的優點也是顯而易見的,對於絕大部分坦克共有的特性和方法寫到基類,以後要設計新類型的坦克只要繼承一下,省去了大部分代碼。所以繼承是最簡單,也是最實用的。
多態:可以狹隘地理解為父類別方法的重載,使得同一個方法擁有不同的參數列表。我覺得多態才是物件導向的精髓,在我的坦克程式中,有個控制規則的類,這類裡面有一個方法需要一個參數,這個參數可能是坦克類,也可能是子彈類,不確定,需要呼叫它們的move()方法,當然可以用強大的重載功能去重載這個方法如:someFun(tank mObj){….};重載一下someFun(zidan  mObj){….};貌似除了把mObj這參數的型別換了下,其他都沒動。但確實解決了這問題。如果這個變態的方法實作是10000行,一重載2萬行了。如果以後出現飛機這個類別也有move方法,那還要再重載一次。使用繼承+介面就簡單的多了,只需要寫一個叫做ImoveObj的介面裡面定義一個move方法,這個介面被坦克,子彈,飛機類別繼承下,把方法寫成someFun(ImoveObj mObj){….};以後無論增加多少可以充當mObj這個參數的類,只需要繼承下ImoveObj介面便可。 (用過工廠模式的,覺得這個太司空見慣了。確實,不過這也是多態的基礎理解。)
封裝:這個也好理解,使用一個類別只需要知道這個類別的方法怎麼用即可,不需要知道這個方法的具體實作。介面是開發者的設計說明書,開發者去實作介面裡面的東西。介面也是使用者的說明書,告訴類別的使用者此類實作了什麼方法,只要會用即可無需了解其實作。
雖然都是些簡單的基礎,但只有完全理解了這些東西再去研究注入,反轉,映射等等不會那麼吃力了。
除了物件導向還有面向接口,面向方面(切面)等,無論用什麼想法去程式設計最核心的還是演算法,小到一個函數,都離不開演算法。
程式設計最重要的是思想,技術決定能力,而思想決定能力的深度。


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板