? ? ? ? 在2016年暑假的時(shí)候,我參加了ThoughtWorks的暑期訓(xùn)練營。當(dāng)時(shí)老師交給我一個(gè)解決問題的好方法,簡單來講是這樣的:當(dāng)你遇到一個(gè)很難的問題的時(shí)候,以至于無法解決時(shí),你應(yīng)該嘗試著去將這個(gè)問題進(jìn)行拆分,直到這個(gè)拆分得到的小問題順利解決。
? ? ? ? 這種思想在某些意義上有些遞歸的意思,但如何去理解和使用這一思想并將這一思想方法轉(zhuǎn)換成自己解決問題的習(xí)慣時(shí)卻是不容易的,而我這個(gè)笨蛋在快一年之后才理解并學(xué)會(huì)了如何去使用這一思想,現(xiàn)做些總結(jié)與感想。
一.什么時(shí)候進(jìn)行拆分
? ? ? ? 最容易遇到這一問題的地方是函數(shù)的實(shí)現(xiàn),函數(shù)可以說是數(shù)據(jù)的生產(chǎn)所或者數(shù)據(jù)的加工廠,當(dāng)你在實(shí)現(xiàn)一個(gè)函數(shù)時(shí),你首先要找出函數(shù)的輸入和輸出,再找出輸入和輸出這兩者之間的關(guān)系,當(dāng)你發(fā)現(xiàn)這兩著的關(guān)系的復(fù)雜度比1+1=2還要難時(shí),那么你就需要問題拆分了。(這樣做雖然很麻煩,但會(huì)使“程序是給人看的,只是偶爾在機(jī)器上跑跑而已”這句話成為現(xiàn)實(shí)。)
二.如何進(jìn)行拆分
? ? ? ? 好,那么如何進(jìn)行拆分呢,我認(rèn)為最直觀和最有效的方法就是將這一問題生成一個(gè)新的函數(shù)(我是函數(shù)狂人),因?yàn)檫@樣可以增加程序的易讀性,最重要的是,這是解決非常難的問題的最關(guān)鍵的一步,讓你算1+1容易,但一旦把加減乘除融入之后,你就會(huì)感到非??謶值模覀冊谧鲰?xiàng)目的時(shí)候,通常遇到的問題就是“加減乘除”的問題呀,你不會(huì)分成1+1你就無法解決大問題呀。這也是我在碰過好多壁之后才明白的道理。所以,如何進(jìn)行拆分的方法就是,將新的問題生成一個(gè)新的函數(shù),直到問題窮盡。
三.拆分的結(jié)果是什么
? ? ? 有了第二步,那么拆分的結(jié)果就顯而易見了呀,結(jié)果就是那一個(gè)個(gè)的小函數(shù)呀。而這些一個(gè)個(gè)函數(shù)互相間的嵌套組成了問題的解。同時(shí)在同一個(gè)項(xiàng)目之中好多問題都具有一定的相似之處,因此其它疑難問題的解有時(shí)往往也就存在于這些小函數(shù)之間。
四.為什么要這么做
? ? ? 1.增加代碼易讀性和復(fù)用率。
? ? ? 2.減少自己對疑難問題的恐慌。
? ? ? 3.增加編程的樂趣。
五.問題遷移
? ? ? 1.數(shù)據(jù)庫問題
? ? ? ?我在做RuPeng的項(xiàng)目時(shí),我發(fā)現(xiàn)隨著項(xiàng)目的復(fù)雜度增加,數(shù)據(jù)庫表之間的操作會(huì)變得非常的麻煩,對于數(shù)據(jù)庫繼承不是很好的我來說顯然此時(shí)不是狠抓數(shù)據(jù)庫的問題,比如在遇到多表之間的操作的時(shí)候就可以運(yùn)用拆分的思想來解決數(shù)據(jù)庫的操作問題,實(shí)例:a表中分別有a1和a2兩個(gè)外鍵,分別對應(yīng)b表和c表的某一字段,而c表的這一字段是d表的主鍵,現(xiàn)在要拿出a表的a1和a2字段。
問題拆分:1.先拿出b表的a1字段。
? ? ? ? ? ? ? ? ? 2.拿出d表的主鍵。
? ? ? ? ? ? ? ? ? 3.拿出c表中與d表主鍵相關(guān)的字段,也就是a2。
? ? ? ? ? ? ? ? ? 4.把第二步和第三步嵌套的結(jié)果和第一步的結(jié)果結(jié)合,問題解決。