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