看板 Soft_Job 關於我們 聯絡資訊
※ 引述《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