爛代碼重構(gòu)

今天接手了前同事的一個項目肴甸。一個簡單的應(yīng)用箕昭,竟然寫了2100多行代碼凤瘦,40個action方法哑蔫,最長的一個action有130多行。


整理前的代碼縮略圖

這圖的底部曲線直接就反應(yīng)了我看到這些代碼的心情乍迄,波濤洶涌管引,又如滔滔江水,連綿不絕闯两。

如果可以褥伴,我不想接手這樣的爛代碼。它具備了以下特征:

  • 函數(shù)過長
  • if else 多層嵌套
  • 大量重復(fù)性代碼
  • 命名不規(guī)范漾狼、混亂
  • 大量無用代碼(接口不用了重慢,代碼不刪)
  • 無用注釋

代碼片段示例

    public function actionKidinfo() {
        $userInfo = $this->userinfo; //獲取身份
        $status = array();
        $resourceId = $this->request->get('resource_id'); //書本資源ID
        if (is_object($userInfo) && $userInfo->userId !== NULL) {
            $returnUser['profile']['type'] = $userInfo->role;
            $returnUser['profile']['_id'] = $userInfo->userId;
            $returnUser['profile']['display_name'] = $userInfo->name;
            $childrenInfo = isset($this->user['children']) ? $this->user['children'] : [];

            $data = [];
            foreach ($childrenInfo as $key => $value) {
                $childData = SsoHelper::getUserInfoByIds($value);
                if ($childData['ret'] == 0 && isset($childData['data'][$value])) {
                    $returnUser['profile'][$key] = $childData;
                    $result['profile']['children'][$key]['kid_id'] = $value;
                    $result['profile']['children'][$key]['name'] = $returnUser['profile'][$key]['data'][$value]['display_name'];
                    $result['profile']['children'][$key]['thumb'] = $returnUser['profile'][$key]['data'][$value]['avatar'];
                    $result['profile']['children'][$key]['status'] = $this->recommend->Kidresourceid($value, $resourceId);
                    if ($result['profile']['children'][$key]['status'] == 'true') {
                        $status[$key] = '1';
                    }
                }
            }
            if (array_sum($status) == count($childrenInfo)) {
                $status = 1;
            } else {
                $status = 0;
            } // 給到是否可以發(fā)送推薦 關(guān)鍵字
            if (!empty($result['profile']['children'])) {
                $return = ['kidsinfo' => $result['profile']['children'], 'status' => $status];
                return $this->returnData(OKCODE::ok, '', $return);
            } else {
                return $this->returnData(OKCODE::no_records_found, '沒有相關(guān)的信息', ['kidsinfo' => [], 'status' => $status]);
            }
        } else {
            return $this->returnData(OKCODE::no_records_found, '沒有相關(guān)的信息', ['kidsinfo' => [], 'status' => $status]);
        }
    }

為了不讓自己踩坑,我花了約20分鐘(主要時間花在理解代碼上)進行重構(gòu)逊躁,并調(diào)試完畢的最后代碼如下:

    public function actionKidinfo() {
        $userInfo = new UserInfo;
        if (!is_object($userInfo) || $userInfo->userId === NULL) {
            return $this->returnData(OKCODE::no_records_found, '沒有相關(guān)的信息', 
              ['kidsinfo' => [], 'status' => 0]);
        }
        $resourceId = Yii::$app->request->get('resource_id');
        $children = UserHelper::getChildrenBy($userInfo->userId);
        $isAllChildrenRecommend = 1;
        foreach ($children as $key => $child) {
            $recommendStatus = RecommendModel::isResourceRecommendToKid($child['id'], $resourceId);
            $children[$key]['status'] = $recommendStatus;
            if (!$recommendStatus) {
                $isAllChildrenRecommend = 0;
            }
        }
        return $this->returnData(OKCODE::ok, '', 
          ['kidsinfo' => $children, 'status' => $isAllChildrenRecommend]);
    }

下面來說下我對付爛代碼的一點心得似踱。

1、刪稽煤,快刀斬亂麻

在前端同事的配合下核芽,我首先找出了那些已經(jīng)廢棄了的接口,40個接口酵熙,有用的竟然只有10個轧简。一頓刪除后,整個類只剩下800多行代碼了绿店。刪完后瞬間心情好轉(zhuǎn)吉懊。

而在【代碼片段示例】途中中庐橙,也存在了無用的代碼假勿。

$returnUser['profile']['type'] = $userInfo->role;
$returnUser['profile']['_id'] = $userInfo->userId;
$returnUser['profile']['display_name'] = $userInfo->name;

這段代碼就是各位新手都十分喜歡的操作(復(fù)制粘貼)而留下的代碼隱患,在整個代碼中态鳖,變量:type转培、_id、display_name壓根是沒有用到過的浆竭。

程序員信條:復(fù)制粘貼一時爽浸须,一直復(fù)一直爽惨寿!

對于沒有用的代碼千萬不要留,果斷點刪删窒。

2裂垦、減少if else 嵌套,盡早返回

$userInfo = $this->userinfo; //獲取身份
$status = array();
$resourceId = $this->request->get('resource_id'); //書本資源ID
if (is_object($userInfo) && $userInfo->userId !== NULL) {
} else{
    return $this->returnData(OKCODE::no_records_found, '沒有相關(guān)的信息', ['kidsinfo' => [], 'status' => 0]);
}

改為

$userInfo = new UserInfo;
if (!is_object($userInfo) || $userInfo->userId === NULL) {
    return $this->returnData(OKCODE::no_records_found, '沒有相關(guān)的信息', 
        ['kidsinfo' => [], 'status' => 0]);
}

3肌索、提煉專職的函數(shù)

在【代碼片段示例】中蕉拢,有獲取孩子列表的功能,而這個功能在其他地方也用到诚亚。為了更好地復(fù)用晕换,我提煉了一個getChildrenBy($userId)的函數(shù)

    public static function getChildrenBy($userId) {
        $response = SsoHelper::getUserInfoByIds($userId);
        if (isset($response['ret']) && $response['ret'] == 0
            && isset($response['data'][$userId])) {
            $userData = $response['data'][$userId];
        } else {
            $userData = [];
        }
        $children = isset($userData['children']) ? $userData['children'] : [];
        $childrenData = SsoHelper::getUserInfoByIds($children);
        if ($childrenData['ret'] == 0) {
            $result = [];
            foreach ($childrenData['data'] as $childId => $childData) {
                $result[] = [
                    'id' => $childId,
                    'name' => $childData['display_name'],
                    'avatar' => $childData['avatar'],
                    'kid_id' => $childId,
                    'thumb' => $childData['avatar'],
                ];
            }
            return $result;
        } else {
            return [];
        }
    }

4、根據(jù)情景對進行有意義的命名

在【代碼片段示例】中

$result['profile']['children'][$key]['status'] = $this->recommend->Kidresourceid($value, $resourceId);

這個Kidresourceid()是什么站宗?第一眼看去闸准,就要奔潰了。通讀下來梢灭,我才知道原來是這個資源是否推薦給了孩子夷家。那么按照最簡單的說法,我改成了

$result['profile']['children'][$key]['status'] 
= $this->recommend->isResourceRecommendToKid($value, $resourceId);

還有其他的變量有混淆敏释,我就不再列舉了瘾英。

5、刪掉無用注釋

$userInfo = $this->userinfo; //獲取身份
$resourceId = $this->request->get('resource_id'); //書本資源ID
            if (array_sum($status) == count($childrenInfo)) {
                $status = 1;
            } else {
                $status = 0;
            } // 給到是否可以發(fā)送推薦 關(guān)鍵字

雖然大家都推薦多寫注釋颂暇,但是這些無用的注釋就不用寫了缺谴,寫了還給我造成混亂 “// 給到是否可以發(fā)送推薦 關(guān)鍵字” 通讀下來這個壓根就不是這個意思,如果是在需求緊急的情況下耳鸯,這簡直令人發(fā)狂湿蛔。

在一天內(nèi)不斷重復(fù)這幾個步驟后,代碼整體的縮略圖如下:


整理后的代碼縮略圖

看到這張圖县爬,心情總算平靜了許多阳啥。

其實重構(gòu)完后,整個人特別累财喳。這次里面還是相當感謝前端同事的配合察迟,沒有配合,很難實現(xiàn)重構(gòu)耳高,因為那30個接口就會花費更多的時間扎瓶。而且這次重構(gòu)的是不涉及到其他關(guān)聯(lián)應(yīng)用的模塊,否則花費的時間將更加多泌枪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末概荷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碌燕,更是在濱河造成了極大的恐慌误证,老刑警劉巖继薛,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愈捅,居然都是意外死亡遏考,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門蓝谨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诈皿,“玉大人,你說我怎么就攤上這事像棘』鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵缕题,是天一觀的道長截歉。 經(jīng)常有香客問我,道長烟零,這世上最難降的妖魔是什么瘪松? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮锨阿,結(jié)果婚禮上宵睦,老公的妹妹穿的比我還像新娘。我一直安慰自己墅诡,他們只是感情好壳嚎,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著末早,像睡著了一般烟馅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上然磷,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天郑趁,我揣著相機與錄音,去河邊找鬼姿搜。 笑死寡润,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的舅柜。 我是一名探鬼主播梭纹,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼业踢!你這毒婦竟也來了栗柒?” 一聲冷哼從身側(cè)響起礁扮,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤知举,失蹤者是張志新(化名)和其女友劉穎瞬沦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雇锡,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡逛钻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锰提。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曙痘。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖立肘,靈堂內(nèi)的尸體忽然破棺而出边坤,到底是詐尸還是另有隱情,我是刑警寧澤谅年,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布茧痒,位于F島的核電站,受9級特大地震影響融蹂,放射性物質(zhì)發(fā)生泄漏旺订。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一超燃、第九天 我趴在偏房一處隱蔽的房頂上張望区拳。 院中可真熱鬧,春花似錦意乓、人聲如沸樱调。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本涕。三九已至,卻和暖如春伙窃,著一層夾襖步出監(jiān)牢的瞬間菩颖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工为障, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晦闰,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓鳍怨,卻偏偏與公主長得像呻右,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鞋喇,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容