Re: [請益] 很多層迴圈和if 怎麼寫比較好整理

看板Soft_Job (軟體人)作者 (遙遠的旅人)時間14年前 (2011/07/13 12:08), 編輯推噓10(10017)
留言27則, 11人參與, 最新討論串1/16 (看更多)
※ 引述《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

07/13 12:15, , 1F
我之所以用多維陣列是因影像有波段,x,y 而且好幾張
07/13 12:15, 1F

07/13 12:20, , 2F
推~~~重新整理出骨幹後並封裝其它雜訊
07/13 12:20, 2F

07/13 13:25, , 3F
影像的話,對一個波段除了網格資料外,你應該會需要存
07/13 13:25, 3F

07/13 13:25, , 4F
額外的處理資訊吧?你用陣列就會不好存。
07/13 13:25, 4F

07/13 13:26, , 5F
但陣列的好處就是快,這就要看你的取捨了。
07/13 13:26, 5F

07/13 13:29, , 6F
額外資訊我可以想到的有:解析度、成像波段、SN比
07/13 13:29, 6F

07/13 13:29, , 7F
如果是不同的儀器對同樣的物體取得影像,那可能還有
07/13 13:29, 7F

07/13 13:30, , 8F
比例尺、方位角、焦距、成像誤差之類的訊息需要儲存。
07/13 13:30, 8F

07/13 13:41, , 9F
我的確需要執行速度快
07/13 13:41, 9F

07/13 15:23, , 10F
我覺得... 真的要進步的話, 就出錢請高手吧. 原原PO你把
07/13 15:23, 10F

07/13 15:24, , 11F
你的想法與大概還記得的處理流程跟他講. 他再把原本要改
07/13 15:24, 11F

07/13 15:24, , 12F
的地方翻新.
07/13 15:24, 12F

07/13 15:31, , 13F
偶男友也開外包公司 他說他沒空 T.T 嗚嗚嗚
07/13 15:31, 13F

07/13 15:34, , 14F
關鍵字:Tree 遞迴
07/13 15:34, 14F

07/13 17:26, , 15F
偶男友 XDDD
07/13 17:26, 15F

07/13 17:40, , 16F
嗯....這麼親切嗎?
07/13 17:40, 16F

07/13 17:45, , 17F
某代言:重構有益於大腦活動 避免阿茲海默症 勝過摸三圈
07/13 17:45, 17F

07/13 19:13, , 18F
原po程式不曉得有沒有單元測試,沒有的話先補上再重構
07/13 19:13, 18F

07/13 21:20, , 19F
關鍵字:偶男友
07/13 21:20, 19F

07/13 21:30, , 20F
避免營造太嬌滴滴的型像用的
07/13 21:30, 20F

07/14 00:12, , 21F
推這篇
07/14 00:12, 21F

07/14 00:22, , 22F
真的嗎=_=|| code level的重構我都無意識的在做的說
07/14 00:22, 22F

07/14 09:04, , 23F
我想接是時候找奇男友了...(咦)
07/14 09:04, 23F

07/14 09:04, , 24F
我覺得重構有分破壞性跟非破壞性,工具能幫忙的重構我都還好
07/14 09:04, 24F

07/14 09:05, , 25F
破壞性/也就是能會引來issue的,我會覺得需要謹慎規劃。
07/14 09:05, 25F

07/14 09:05, , 26F
不太適合是無意識的行為 :D:D
07/14 09:05, 26F

07/14 13:36, , 27F
我還是自己改...昨天發現pi位數不夠
07/14 13:36, 27F
文章代碼(AID): #1E7HegiU (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1E7HegiU (Soft_Job)