如何進行「小步重構」?

大家好,我是Z哥。

關于重構的文章之前也寫過兩篇:

  • 《接手歷史悠久的老項目,干or跑?》

  • 《好的重構方法才能擺脫“屎山”》

但是這兩篇主要講的是重構的方式方法。在 Z 哥看來,除了方式和方法還有一個點對于重構這件事來說也很重要,就是如何能夠實現“小步重構”。

因為只有“小步”地進行重構,才能達到那種未雨綢繆、防范于未然的效果,將風險扼殺在搖籃里。

所謂“善戰者無赫赫之功”,我是非常不提倡以“憋大招”的方式在某個時期重寫一個新系統的,不但風險大成本也大。

但是要實現“小步重構”,需要平時注意一些細節,下面我來分享一些我的經驗。

首先,歸根到底重構就是償還技術債。所以小步重構之前我們首先要有一種比較好的方式來對待技術債。

不知道你有沒有過這樣的經歷:

在編碼實現一個功能時,發現有一個邏輯如果按照全面去考慮的話需要改動很多地方,甚至可能要推翻當前已經寫過的部分代碼,但是呢現在實際場景并沒那么多,當前的實現已經能滿足。算了,先這樣吧,后續業務怎么發展還不知道呢,到時候再說。

這就是一種很常見的債務,并且這種債務很容易讓人忽視,因為它并沒有讓你在當下做出什么曲線救國的事情,只是一種“短視”的妥協。但是這種妥協一旦多了之后,后續的迭代往往會有很多大大小小的補丁來覆蓋之前沒有考慮的場景,最終積重難返,因為項目難以繼續維護而重寫。

上面提到的“大大小小的補丁”其實就是另一種常見的債務,這些補丁往往伴隨著 if-else 這種代碼出現。大家也都知道,if-else 代碼如果過多的話,對人的閱讀是非常不友好的。

技術債還有很多,我想每個程序員其實都能識別出來。對待它們的方式不同,最終形成不同人之間工作成果的差異。

Z哥推薦你對待技術債的方式很簡單。就是在代碼里增加 todo,然后將清理 todo 作為一個固定的任務安排,定期進行。

記 todo 看上去是一個簡單的事情,但是還是值得花點心思來提高效率的。常見的場景比如:

  1. 有一些改動需要涉及到多個地方,那么可以用某種標識(我習慣用當前時間精確到分鐘)來統一標注一下,這樣后續修改的時候就不會出現只改了一半導致出現 bug 的情況。

  2. 有些重構可能依賴于一些其它的改動才能進行,那么也可以把依賴的改動信息寫一下,如果所依賴的地方恰好也在本項目內,還可以備注一下相關的文件名和方法名。

  3. 有些重構還可能有一些 deadline 的約束,比如需要在 xx 日期前完成,那么也可以備注一下。

我平時用的 todo 格式是:

//todo:描述需要做什么重構。(202206121536)。依賴于xxx文件中的方法xxx。需要在2022.7.30前完成

做好了備注,剩下的就是定期清理 todo 了,這個需要根據當前的工作飽和度來安排,但 Z 哥建議,哪怕非常忙,至少 1 個月要進行一次。

好了,這篇呢 Z 哥和你分享了我對小步重構這件事的看法和經驗。

重構一定是小步快跑式的方式是最好的,不但可以降低風險,從長期來看所耗費的成本也是最低的。具體的做法也很簡單就是記 todo 和定時清理。

關于重構的一些方式方法可以查看我之前寫的兩篇文章。

  • 《接手歷史悠久的老項目,干or跑?》

  • 《好的重構方法才能擺脫“屎山”》

希望對你有所幫助。

對了,最后還有一個建議強烈推薦給你。就是沒有調用的方法盡早刪除,不要留著覺得以后可能還會用。根據我這么多年的經驗來看,未來再會用到的概率微乎其微,留著反而增加了后續的代碼重構成本。因為當你修改一個方法或者字段,然后通過IDE查找引用的時候,這些其實已經沒有調用的方法也會被關聯到。

推薦閱讀:

原創不易,如果你覺得這篇文章還不錯,就「點贊」或者「在看」一下吧,鼓勵我的創作 :)

也可以分享我的公眾號名片給有需要的朋友們。

如果你有關于軟件架構、分布式系統、產品、運營的困惑

可以試試點擊「閱讀原文

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/284700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【BIM入門實戰】Revit 2018幕墻的繪制與注意事項

一、幕墻概述 1. 定義 幕墻是建筑的外墻圍護,不承重,像幕布一樣掛上去,是現代大型和高層建筑常用的帶有裝飾效果的輕質墻體。由面板和支承結構體系組成的,可相對主體結構有一定位移能力或自身有一定變形能力、不承擔主體結構所作…

微信小程序之登錄

直接獲取用戶數據wx.getUserInfo({success: function (res) {var userInfo res.userInfoconsole.log("獲取登錄用戶的所有信息")console.log(res.userInfo)}}) 復制代碼如果用戶拒絕,提示模態框,點擊確定,進入設置,再次…

對象、字節流轉換

數據表示時間   長度(字節)   數據類型   描述及要求平臺登入時間   6        BYTE[6] (每個字節分別代表:年、月、日、時、分、秒)登入流水號 2        WORD    每登入一…

【BIM入門實戰】Revit 圖元分類有哪三種?Revit圖元分類圖文詳解

Revit在項目中使用3種類型的圖元:模型圖元、基準圖元和視圖專有圖元。 Revit中的圖元也稱為族。族包含圖元的幾何定義和圖元所使用的參數。圖元的每個實例都由族定義和控制。 1. 模型圖元 模型圖元表示建筑的實際三維幾何圖形,包括如下:墻、窗、門和屋頂,結構墻、樓板、坡…

跟益達學Solr5之solrconfig.xml配置詳解

solrconfig.xml配置文件中包含了很多solr自身配置相關的參數,solrconfig.xml配置文件示例可以從solr的解壓目錄下找到&#xff0c;如圖&#xff1a; 用文本編輯軟件打開solrconfig.xml配置&#xff0c;你將會看到以下配置內容&#xff1a; Xml代碼 <?xml version"1.…

.NET 7 新增速率限制 (Rate Limiting) 功能,輕松限制請求數量

前言.NET 7 內置了速率限制&#xff08;Rate Limiting&#xff09;功能&#xff0c;速率限制指的是限制可訪問資源的請求數。例如數據庫每分鐘可以安全處理 1000 個請求&#xff0c;再多不確定會不會崩。這時就可以在應用程序中放一個速率限制器&#xff0c;規定每分鐘只允許 …

Cmder集成到VS Code (新舊版設置不同)

1.55版本之前 "terminal.integrated.shell.windows": "cmd.exe","terminal.integrated.shellArgs.windows": ["/k", "d:\\cmder\\cmdermini\\vendor\\init.bat"],1.55版本之后 "terminal.integrated.profiles.windows&…

Linux Tomcat8 啟動堆內存溢出

今天在部署一個開源項目的時候&#xff0c;Tomcat8啟動異常&#xff0c;報錯信息&#xff1a; Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space 根據報錯信息我們可以看出是堆內存不夠。所以需要手動設置堆內存大小&…

【BIM入門實戰】Revit視圖中圖元看不見的原因總結

在Revit模型設計的過程中&#xff0c;有時會提示繪制的圖元不可見&#xff0c;通常情況下&#xff0c;可以采用以下三種方法讓隱藏的圖元顯示出來。 原因一&#xff1a;視圖范圍 平面視圖的形成是由操作平面對三維進行 水平切割的俯視圖&#xff0c;如果繪制的圖元不可見&…

Tabcontrol動態添加TabPage(獲取或設置當前選項卡及其屬性)

http://blog.csdn.net/xiongxyt2/article/details/6920575 ?MultiLine 屬性用true 或false來確定是否可以多行顯示 ?Appearance 屬性設置選項卡的顯示方式&#xff0c;Normal,Buttons和FlatButtons為三種不同的顯示方式。 ?TabPages屬性設置選項卡的一系列屬性&#xff0c;包…

用C#為國產智能手表寫“Hello, China. ”

在此之前&#xff0c; 我寫過幾篇如何使用C#編寫STM32程序的例子&#xff0c; 那么同樣&#xff0c; ESP32下我們也可以使用C#&#xff0c;我們依然仰仗于一直在發展壯大的 .Net nanoFramework , 目前他支持的開發板越來越多 &#xff0c; 支持的芯片種類也越來越多&#xff0c…

Python將list存為csv文件

#!/usr/bin/env python # -*- encoding: utf-8 -*-import sys import json import os import pandas as pd""" description:將list存為csv文件 param {*} return {*} """staticmethod def list_to_csv(list_data, csv_file):if len(list_data) &…

【BIM入門實戰】Revit入門基礎知識選擇題帶答案解析(116題)

1、在Revit同一個界面同時打開多個視圖的快捷鍵是( )。 A、 WT B、 WA C、 WC D、 WD 答案: A 2、Revit樣板文件的后綴名是( )。 A、 .rvt B、 .rte C、 .rfa D、 .ifc 答案: B 3、標高、軸網創建的快捷鍵分別是( )。 A、 AL LL B、 LL GR C、 AR MM D、 LL TR 答案…

數據遷移 (選做)

1. pip install flask-migrate #Flask-Migrate 是一個數據遷移框架,需要通過Flask-script庫來操作. 2. pip install flask-script #通過命令行來操作Flask 3. 新建模型更改文件&#xff1a;manage.py from flask_script import Managerfrom flask_migrate import Migrate, Mi…

Flex4項目html-template文件夾解析

每個Flex的web應用程序項目都包含一個名為html-template文件夾。這個文件夾包含HTml模板和在瀏覽器中運行程序的支持文件。 每當你更改保存到你的源代碼&#xff0c;Flash Builder會自動重建應用程序使用的HTML模型文件并生成一個HTML包。同時&#xff0c;它把HTML模板文件夾的…

驅動之LCD的介紹與應用20170209

本文主要介紹的是LCD的介紹與應用&#xff0c;直接看個人筆記即可: 轉載于:https://www.cnblogs.com/yuweifeng/p/6382551.html

.NET 序列化枚舉為字符串

默認情況下&#xff0c;枚舉是以其整數形式進行 JSON 序列化&#xff0c;這通常會導致與消費者應用缺乏互操作性&#xff0c;因為他們需要事先了解這些數字的實際含義。因此&#xff0c;我們希望它們在一些情況下以字符串的形式進行序列化。本文將講解實現這一目標的各種方法。…

ArcGIS實驗教程——實驗四十四:ArcGIS地圖浮雕效果制作完整案例教程

ArcGIS制作地圖時可以制作出很多很炫的效果,比如地圖陰影、地圖暈渲效果、浮雕效果、三維效果等等。本實驗講解在ArcGIS中制作浮雕效果地圖,效果如下所示: 擴展閱讀:【ArcGIS Pro微課1000例】0016:ArcGIS Pro 2.8浮雕效果地圖制圖案例教程 1. 加載矢量數據 加載實驗數據包…

Mysql,SqlServer,Oracle主鍵自動增長的設置

參考文獻 http://blog.csdn.net/andyelvis/article/details/2446865 1、把主鍵定義為自動增長標識符類型 MySql 在mysql中&#xff0c;如果把表的主鍵設為auto_increment類型&#xff0c;數據庫就會自動為主鍵賦值。例如&#xff1a; create table customers(id int auto_incre…

Chapter 3 Phenomenon——19

His unfriendliness intimidated me. 他的不友好恐嚇到了我。 My words came out with less severity than Id intended. 我說出來的言辭比我打算的要不嚴厲一些。 我說出的話遠遠沒有達到我所想要的充滿火藥味的效果。 "You owe me an explanation," I reminded him…