寫程序應(yīng)該盡量的避免使用break和continue
for、while循環(huán)語句里出現(xiàn)return是沒有問題的,但如果你的循環(huán)里出現(xiàn)了break和continue,往往是因為對循環(huán)的邏輯沒有考慮情況,考慮周全了基本不需要break和continue。因為用了break和continue之后會讓循環(huán)的邏輯和終止的條件變得復(fù)雜,難以確保正確的結(jié)果。
情景一:下面一段代碼表示name里含有“bad”這個詞,就跳過后面的循環(huán)代碼。
這是一種“負面”的描述,它不是告訴你什么時候“做”一件事,而是告訴你什么時候“不做”一件事。想要弄清楚它到底要干什么,就必須搞清楚continue會導(dǎo)致哪些語句被跳過了,然后腦袋得有個逆向邏輯,才能知道它到底想做什么。
這就是為什么含有break和continue的循環(huán)很難理解,它們靠“控制流”來描述“不做什么”,而“跳過做什么”,到最后你也沒有搞清楚它到底“要做什么”。
其實上面的代碼其實完全可以摒棄continue:
這種代碼是一種更加“正面”地描述,表示name不含“bad”的時候,就將它加到goodNames的鏈表里。當(dāng)你再次讀到這段代碼時,就能清晰地呈現(xiàn)出它的條理和結(jié)構(gòu)。
情景二:for和while循環(huán)頭部有唯一終止循環(huán)的條件,但在循環(huán)體中加入break,實際增加了一個退出條件。
當(dāng)condition2成立的時候,break就會退出循環(huán)。但往往只需要把這個條件合并到循環(huán)頭部,就可以去掉break,而不需要再進行逆向思維。
情景三:很多break退出循環(huán)后,接下來就是一個return
下面函數(shù)檢查names鏈表里是否存在一個名字,包含“bad”,包含就通過break跳出,并通過return返回結(jié)果。
這種break往往可以直接換成returntrue,而不是對result變量進行賦值,需要通過break出去后,最后才通過return返回。如果循環(huán)結(jié)束了還沒有return,就返回false。改完后同時消除了break語句和result這個變量。
很多的例子通過消除continue和break,無一例外使得代碼變得條理清晰容易理解,也更容易確保正確結(jié)果。如果代碼中出現(xiàn)了continue可以將continue的條件方向,如果代碼中出現(xiàn)了break可以將break的條件合并到循環(huán)頭部的終止條件里去掉break,而剩下的1%特別復(fù)雜的邏輯可以把循環(huán)里復(fù)雜的部分提取出來做成函數(shù)調(diào)用,這樣就徹底地消除了continue和break。
編程不當(dāng)當(dāng)是一門技術(shù),而且是一門藝術(shù)。
編程是一種創(chuàng)造性的工作,并不是說你寫了多少多少萬行代碼了你就很牛逼。如果總是匆匆忙忙寫出了代碼,卻不會回過頭的推敲、修改和提煉,是很難精通這門藝術(shù)的。一個好的程序員刪掉的代碼比留下來的代碼要多得多,如果你看見他寫了很多代碼,卻沒有刪掉多少,那他的代碼中一定有很多的垃圾。
好的代碼不可能一蹴而就,代碼靈感總是零零星星的陸續(xù)到來,所以再厲害的程序員都是通過很長一段時間的沉淀才能寫出簡單而優(yōu)雅的代碼。如果此時你反復(fù)提煉代碼已經(jīng)不再有進展不煩暫時放下過幾個星期或者幾個月再回過頭來看,又會獲得煥然一新的靈感。
以上個人淺見,歡迎批評指正。
認同我的看法,請點個贊再走,感謝!
喜歡我的,請關(guān)注我,再次感謝!