記錄 |探究一次嗅到壞代碼後封裝再封裝

農藥之坑,唯有陷入才知曉。每逢晉級賽,總要被打回原形。

在這裏插入圖片描述

前言

項目經歷了一個又一個,代碼擼了一遍又一遍,來來回回拷貝舊東西,似乎絲毫提不起興趣。

想要手持大刀隨意砍殺,卻發現根基便有問題,扎心不扎心。

與其盲目調整根基,不如從點擊積累,江河入海流,終將匯成汪洋大海!

首先簡單說明下目前項目中遇到的問題吧:

  • 重複性功能較多;
  • 需求不明確造成多次返工,大量時間消耗無腦擼碼微調中;
  • 。。。

可能是項目的特殊性吧。也可能是我整體構思有問題,很直接的爲了趕所謂的進度,讓項目代碼中充斥了不少重複性的東西。

事情的起因源於某次懶得說明緣由,便直接截了部分截圖併發到羣裏,事後才發現這個各種不舒服。

一起先來看一下,之前“封裝”:

下面圍繞着此事例進行逐步分析,衍化。

開搞

當初封裝的原因就是後臺突然返回了一種類型,嗯,是挺突然的,突然的都沒關注這種類型,顯然針對 App 出現了問題。最原始的方案則是在每個地方無腦式 Copy,所謂簡單高(搞)效(笑)的代價,則是白白新增了冗餘代碼,且直接導致後續維護起來很是麻煩。

說實在的,自己看着咋也好說,實際發羣裏,突然感覺這段代碼寫的真 low。果斷諮詢我雞老大有什麼好的優化方案。

雞老大說的倆句話很有意義,在此分享下:

  • 你可以做抽象,而不是抽方法;
  • 抽象的東西不是業務,但是是根據業務形態做的。

Long long ago,曾以爲自己對於面向對象理解已經達到遊刃有餘,雞老大的一番話,讓我不得不再次審視自己,直面自己的漏洞。可惜,目前現有的能力只是停留在抽方法 😅,這裏就不過多說明了,某天可能幡然醒悟吧。

雞老大超級喜歡反問,聽取了我的思路後直接提示你這個寫法還有很大的改進空間,重複代碼太多了,怎麼改。

“仔細” 觀察封裝後的方法,在每種類型中都要實例化一個 Intent 並且傳遞對應的 id,方便後續根據 id 查看詳情。

知道了下刀子的地方,現在對此方法進行一下小手術:

  • 簡單粗暴的使用一個 Intent,通過不同的 Type 實例化對應的 Intent 跳轉實例。

分分鐘改造完成:

美滋滋找雞老大得瑟去~

雞老大不緊不慢的來了句:還有很大的改進空間,你再想想。

經過上面一步,成功將 Intent 實例化精簡到 Only One。仔細觀察,每個 Type 下都對應類似相同的操作:

  • 實例化即將跳轉的 Intent;
  • 傳遞對應的 id 值

那我爲什麼不直接定一個私有化的專門處理 Intent 方法呢?不同的 Type 只需要給我對應的參數值即可。說幹就幹,改造後如下:

可以吧,嗯,我覺得還不錯。找雞老大得瑟去~
在這裏插入圖片描述
雞老大又說了,你這不行啊,還有很大改進空間,class 發給我,我來。

這咋能讓雞老大親自動手呢。😅😅😅 我來,我來。

雞老大又說了幾點:

  • 去掉註釋,不明白你寫的是啥,難以理解;
  • 如果我想單獨調用 when case 中某個方法呢?怎麼辦?
  • 不要私自處理 error,對於可能會造成問題的需要 throws 出去;
  • 一個方法只做一件事,同樣只用到了 id,爲什麼要傳遞 bean?後續有新需求可以拓展重寫方法呀;
  • 首先你要保障別人來讀你代碼,一眼就知道你這個代碼是什麼意思。其次,做需求更多的是面向業務去代碼,可讀性是首要保障,其次纔是優雅性。而且你並不是爲了性能而去考慮去設計的。

最後,雞老大給出一條原則 (不喜勿噴,我老大話我奉爲經典,謝謝!)

安全性 > 可用性 > 可維護性 > 代碼簡潔 > 性能

在這裏插入圖片描述
針對雞老大提出繼續優化:

  • case 中單獨提供對應處理方法,可單獨使用,方法名鑑名其意;
  • 檢查代碼現有業務邏輯只需要一個 id 便可使用,將參數 Bean 替換爲具體參數;
  • 提供方法不再處理 error 情況,而是直接 throws,由實際調用方處理;

針對以上調整後代碼如下:

End - 思考 🤔

從開始以爲的最優,到三番五次自認爲最優找雞老大點評,老臉吶。

不得不跪服雞老大,短短一個代碼片段,便能直擊痛楚,甚至我這寫代碼的人都忽略的跳轉多場景調用,多次頻繁拷貝,甚至後續沾沾自喜封裝了一個小方法。

寫代碼,不僅僅是寫代碼,如果單純的爲了寫代碼而寫代碼,爲了完成任務而寫代碼,寫出的代碼,真的難以自看,此處是對自己說。

冗餘的代碼和精簡的代碼相比;
依靠註釋纔可磕巴通讀代碼和單純通讀代碼便可知其意;
雜亂無章的代碼和良好設計的代碼;
。。。

捫心自問,還是想糊弄自己嗎?

路漫漫其修遠兮!

番外

問個小問題:

  • 你有嫌棄過自己的代碼嗎?
  • 怎麼處理的?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章