iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

30 天開發 Android App 的流水帳系列 第 20

Day 20:重構的好時機

  • 分享至 

  • twitterImage
  •  

什麼是重構?蠻多的文章跟書籍都在討論,每個流派都有自己的觀點。在 面對 Legacy Code ,該重構還是重寫? 文章中,提到蠻多的關於重構還是要重寫的看法,有些觀點跟我自己的想法蠻接近的。已經完成鐵人賽的三分之二部份,覺得是個很好的時機點進行檢視程式碼,在接下來的計畫是想要寫如何上架,而在這過程中不太適合再進行程式碼異動。

是以這個小專案來說,也自我挑戰第 20 天是個好時機。但工作上呢?通常看到一些程式碼有一些壞味道,或是需要調整的部份,會先把他們紀錄下來,若在 Sprint 需要異動或是 Roadmap 有處理到就會跟需求單位提出,以工程師的身份提出要改善將來維護的成本,及提高開發的效率。

列出這樣的清單,除了可以讓團隊成員了解開發生進行重構的項目有多少之外,也可以讓工程師了解有多少的項目需進行。

這次看的重構重點會是:

  • 單一職則:檢視有沒有不符合此原則的物件或函式。
  • 調整不合適的命名

調整的部份如下

  • ProfileList 重命名成 ProfileListResponse,取得 Film 物件就這樣命名了,所以這邊一併統一命名規則
  • 在比對角色出演電影對照時,一直在考慮這段是不是可以放在 Profile 或是在取物件的時候它們一併整併在同一個邏輯裡面?
val filmIds = profile.filmIds
val builder = StringBuilder()
builder.append("Films below: ")
if (filmIds.isEmpty()) {
    builder.append("No film list.")
} else {
    builder.append("\n")
    // id starts from 1
    filmIds.forEach {
        try {
            val index = it.toInt() - 1
            if (index == -1 || index > filmList.size) {
                return
            }
            builder.append("- ${filmList[index].title}\n")
        } catch (exception: Exception) {
            Log.e(TAG, exception.message ?: "")
        }
    }
}

後來想想也許這段產生文字放在 presenter 處理邏輯就好了,讓 view 直接顯示內容就可以了,所以在 view 就變成了:

presenter?.let {
    showFilmsPopup(
        it.getFilmDisplayString(profile.filmIds)
    )
}

連帶著原本 MVP 實做的取得電影 List 的 interface 需要重新命名,不需要把 list 丟回去給 view 處理了。

大家可以點擊那些 commit 的連結看看程式碼異動的過程,這邊分享自己的經驗,就是程式碼異動範圍很大的時候,建議 commit 能夠拆的細一點。甚至一個動作就一個 commit 會對後續 Code Reviewer 友善很多,若將所有的異動都濃縮在同一個 commit ,對方改了什麼沒有任何脈絡可尋。

重構資料參考


上一篇
Day 19:如何寫一個好的 Pull Request 敘述
下一篇
Day 21:自製 Android App Icon
系列文
30 天開發 Android App 的流水帳32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言