搜尋
首頁頭條程式設計最重要的能力--思想

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

Nov 06, 2017 pm 05:06 PM
思想程式設計能力

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

如今的框架和流行語言封裝了大量實用的資料結構,甚至還有一些經典的演算法,帶給我們很大的便利,使用.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介面便可。 (用過工廠模式的,覺得這個太司空見慣了。確實,不過這也是多態的基礎理解。)
封裝:這個也好理解,使用一個類別只需要知道這個類別的方法怎麼用即可,不需要知道這個方法的具體實作。介面是開發者的設計說明書,開發者去實作介面裡面的東西。介面也是使用者的說明書,告訴類別的使用者此類實作了什麼方法,只要會用即可無需了解其實作。
雖然都是些簡單的基礎,但只有完全理解了這些東西再去研究注入,反轉,映射等等不會那麼吃力了。
除了物件導向還有面向接口,面向方面(切面)等,無論用什麼想法去程式設計最核心的還是演算法,小到一個函數,都離不開演算法。
程式設計最重要的是思想,技術決定能力,而思想決定能力的深度。


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具