作者zanyking (遙遠的旅人)
看板Soft_Job
標題Re: [請益] 很多層迴圈和if 怎麼寫比較好整理
時間Wed Jul 13 12:08:06 2011
※ 引述《viable (viable)》之銘言:
: 這版上諸多經驗豐富的高手,
: 讓小妹向各位請教一個問題。
: 小妹最近翻出一個程式,
: 其中有一”坨”由好幾個迴圈和if堆疊而成
: {{{{
: {}
: {}
: {}
: {
: {}
: {}
: }
: }}}}
: 夾雜一堆變數和三、四維陣列,弄得小妹頭昏眼花
: 小妹想了解如何改寫會更簡潔明嘹
直接回文好了。
程式會寫成這樣就是當初見招拆招、腦袋一團漿糊開始寫下去的結果。
要改寫得簡潔明瞭,第一步就是把當初沒有去想的東西現在想清楚。
如果你用的是像Java這種物件導向的語言,會有多維陣列就表示應該要存在
一個物件模型可以比較好的描述資料結構,同時把與每個層次的結構相關的方法
予以封裝。
建議你,開始畫圖吧,資料結構樹先拉出來,資料實體間的關係先釐清才會真的
對這段程式碼有感覺。
這段工作不要作太深,其實就只是取名字、劃線連連看表示各個名字間的關係而已。
要用比較好的方法表現這個模型,想一步登天是不可能的,因為已經存在的程式碼
與針對細節的處理已經在那裡了,這些細節會在你讀程式碼的過程中不停的塞入過多
的資訊阻礙你建立架構的骨幹。
所以第二步就是,開始重構。
通常if else 會多的實做,裡面重複的程式碼也會不少,把重複的部份清掉就可以
把雜訊消除。
就算是不重複的程式碼,按執行段落去抽成方法,就能讓主方法的實做內容變成可閱讀
的文句。
如果是物件導向程式語言的話,一個重構流程的簡單要領:
bottom up 與top down 要交替運用
Top Down: 當程式最外圈明顯存在很大塊的if else 內部彼此不相關,就先將這些區塊
整段切出去到新 static method裡,對切割出去的static method取個符合意義的名字。
外層切割完就看內層,遞迴下去。
Bottom up: 從巢狀結構最深的一個 if block 開始著手。
開個static method,把那個區段整個複製貼過去,開始看這段到底需要哪些外部變數
把變數抽成method arguments,然後給這個method取一個符合他的抽象邏輯的名字。
重複這個交替過程,會發現某些變數有團塊聚集一起被使用的現象,會一起被使用的
變數就會存在一個初始化這些變數的地方,宣告一個static inner class: Wrapper
去包裹他們。
然後令底下的實做需要用到這個wrapper 成員變數的地方改從wrapper的method要。
實際多種的重構手法,可以去買書來瞧瞧。
重構的是增進一個開發者設計功力的好練習,它會最大程度的徵用你腦袋可用的維度
,找個沒人打攪你的深夜還是清晨好好玩吧。
--
我所信仰的科學是一種謙卑的理性,承認自身的無知與渺小才能觀察到世界在我們貧
弱的知覺上留下來的痕跡。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 12.208.243.66
推 viable:我之所以用多維陣列是因影像有波段,x,y 而且好幾張 07/13 12:15
推 andymai:推~~~重新整理出骨幹後並封裝其它雜訊 07/13 12:20
→ zanyking:影像的話,對一個波段除了網格資料外,你應該會需要存 07/13 13:25
→ zanyking:額外的處理資訊吧?你用陣列就會不好存。 07/13 13:25
→ zanyking:但陣列的好處就是快,這就要看你的取捨了。 07/13 13:26
→ zanyking:額外資訊我可以想到的有:解析度、成像波段、SN比 07/13 13:29
→ zanyking:如果是不同的儀器對同樣的物體取得影像,那可能還有 07/13 13:29
→ zanyking:比例尺、方位角、焦距、成像誤差之類的訊息需要儲存。 07/13 13:30
推 viable:我的確需要執行速度快 07/13 13:41
推 ericinttu:我覺得... 真的要進步的話, 就出錢請高手吧. 原原PO你把 07/13 15:23
→ ericinttu:你的想法與大概還記得的處理流程跟他講. 他再把原本要改 07/13 15:24
→ ericinttu:的地方翻新. 07/13 15:24
推 viable:偶男友也開外包公司 他說他沒空 T.T 嗚嗚嗚 07/13 15:31
推 fanntone:關鍵字:Tree 遞迴 07/13 15:34
→ ericinttu: 偶男友 XDDD 07/13 17:26
推 viable:嗯....這麼親切嗎? 07/13 17:40
→ karcher:某代言:重構有益於大腦活動 避免阿茲海默症 勝過摸三圈 07/13 17:45
推 lovemage:原po程式不曉得有沒有單元測試,沒有的話先補上再重構 07/13 19:13
→ hanbz:關鍵字:偶男友 07/13 21:20
推 viable:避免營造太嬌滴滴的型像用的 07/13 21:30
推 Davidjcan:推這篇 07/14 00:12
→ newjoy:真的嗎=_=|| code level的重構我都無意識的在做的說 07/14 00:22
→ TonyQ:我想接是時候找奇男友了...(咦) 07/14 09:04
→ TonyQ:我覺得重構有分破壞性跟非破壞性,工具能幫忙的重構我都還好 07/14 09:04
→ TonyQ:破壞性/也就是能會引來issue的,我會覺得需要謹慎規劃。 07/14 09:05
→ TonyQ:不太適合是無意識的行為 :D:D 07/14 09:05
→ viable:我還是自己改...昨天發現pi位數不夠 07/14 13:36