前言:w3cschool的程式設計師A君告訴小編,當他還是新鳥的時候,偶然得知一個5分鐘就能學會並且運用的思維習慣,據說是一位IBM老鳥對新手的親言傳授,而這個習慣持續了多年,一直成為他日常編碼習慣中的一部分。
這種思維習慣是根據其個人經驗檢驗而得,它有一個非常清晰的宗旨就是:編碼的時候只思考同一個思維層次的邏輯,在這層完成之後再思考下一層。
事實上,我們每個人智力都是有限的,就算是天才,同一個時間內也只能思考有限內容的東西,這個事實的存在說明了程序bug的存在。因此,作為新手程式設計師,編碼的時候不要跨抽象層級思考,要先在同一個抽象層級里思考,保證我們有限的智力裡面當前層級的邏輯正確,再思考下一個。
這裡涉及到兩個概念,跨抽象層級思考和同一個抽象層級的思考。我們不妨通過一個例子來解釋:假設現在我要編寫程序打車去上班。
按照日常生活的一般規律,首先是穿戴衣物,然後上廁所、刷牙、洗臉,最後出門打車。
上面的描述,是把「打車上班」這件事情分成了幾個符合順序和操作邏輯的模塊跟動作,屬於同一個思維層級,我的大腦能夠承載這些邏輯,通過這套邏輯就能夠把這件事情完成。接著我把它寫下來:
function goWorkByCar () {
這個抽象層次的東西已經完成,我甚至不用注釋,通過這個函數就能知道其操作的順序和邏輯。而其中我們沒有完成的四個函數,其具體實現就是下一個抽象層次的東西。現在我們已經完成同一個層級的事情,我的注意力可以從打車上班轉移到下一層級:dressUp(怎麼穿衣服這件事情上):
從柜子里把衣服拿出來,先穿上半身,再穿下半身。
符合正常的操作:
function dressUp () {
我們看看洗漱怎麼做:
上廁所,刷牙,洗臉
function wash () {
出門下樓呢?
我要先出門,然後鎖門,然後坐電梯。
function goDownstairs () {
打車呢?
用手機打車,然後坐車走人
function goByCar () {
然後再用這種方式實現像 `brushTeeth` 和 `washFace` 具體的實現,想想它們需要什麼操作。你會發現我們不停地在填函數,函數裡面又不停地出現新的函數需要我們去完成。每個函數體裡面的操作都和這個函數所要完成的目的相關,在一個函數裡面,我們只關心這個函數需要完成的目標所需要的操作。例如「打車上班」這個任務所依託的 goWorkByCar,我們在這裡並不關心怎麼刷牙,因為它是下一層的東西,我們只關注完成「打車上班」這個目標需要哪幾步。
很多人覺得編程很難,因為你接到一個「打車上班」的任務以後就開始往腦子裡面填滿了刷牙打車穿衣服這種不成邏輯和順序的任務,並且都把它寫到一個函數裡面去。如果我們刷牙、開門這些操作都放在這個函數裡面,那麼一開始就會陷入無限的細節當中而失去了主要目的的關注,而且大腦也無法承載如此複雜多端的細節,處理不好就很容易出現 bug。
而這種思維方式可以讓我們不停地把一個大的任務在同一個層級做分解,保證這一層的步驟和邏輯正確以後,再進行下一層的分解,最後其實是一個樹狀的結構,樹的葉子結點才是具體的代碼算法實現。這樣的代碼寫出來不僅可以邏輯清晰、bug減少而且還很輕鬆,因為你每一層思考的東西其實都很簡單,不知不覺就把代碼寫完了。
文章來源: https://www.twgreatdaily.com/cat90/node1544051轉載請註明來源:今天頭條