标签: 软件开发 2026-01-15 次
代码重构是软件开发里挺重要的一步,就是在不改变功能的前提下,重新整理代码结构。在软件开发过程中,代码重构能提升代码质量。
为啥重构重要?主要是为了优化代码设计和后期维护。团队给软件加新功能、修bug的时候,总会有机会进行代码重构。所以说,写完一段代码后、再写新代码前,重构是个关键步骤。软件开发中,重构不可或缺。
加了新功能或修了bug后,程序员得回头想想:刚改的代码跟整体设计搭不搭?有没有更好的结构?现有方法能不能简化?要不要加新测试来确保代码没错?这都是软件开发中需要考虑的。
下面聊聊几种重构方法,附上实际例子。有些比如“处理泛化关系”“组合方法”是大类别,里面还有更具体的招儿。这些都是软件开发常用的代码重构手段。
这是测试驱动开发(TDD)的一种套路,分三步:
红:先写个会失败的测试,测你想实现的新功能。这在软件开发的代码重构环节很关键。
绿:写最少代码让测试通过。这也是软件开发中代码重构的一部分。
重构:优化刚写的方法。代码重构能让软件开发更高效。
举个例子,想在Python里写个反转字符串的方法。测试逼着你先想清楚接口—方法接收啥参数、返回啥值。测试还相当于功能说明书,明确输入对应啥输出。这就是软件开发中的代码重构实践。

测试代码大概这样:
import unittest
# 函数后面定义
class TestReverseString(unittest.TestCase):
def test_empty_string(self):
self.assertEqual(reverse_string(""), "")
def test_single_character_string(self):
self.assertEqual(reverse_string("a"), "a")
def test_palindrome_string(self):
self.assertEqual(reverse_string("madam"), "madam")
def test_normal_string(self):
self.assertEqual(reverse_string("hello"), "olleh")重构后就能简化成Python风格的切片:
def reverse_string(s): return s[::-1] # 直接切片反转,简洁多了
把多处重复的代码抽出来,做成抽象类或接口,归到一个更高层的抽象里。目的是减少重复、让代码更模块化、好维护。共用逻辑集中了,改代码或加功能就省事,软件设计也更干净可靠。
比如有两个类,分别发邮件和短信,都有连接、发送、断开的逻辑。重构时可以把共同逻辑抽出来,弄个通用的MessageSender基类。
重构前两个类是这样的:
class EmailSender:
def __init__(self, server, port):
self.server = server
self.port = port
self.connection = None
def connect(self):
print(f"连邮箱服务器 {self.server}:{self.port}...")
self.connection = f"EmailConnection:{self.server}"
print("邮箱连好了")
def send_message(self, recipient, message):
if not self.connection:
print("错误:没连邮箱服务器")
return
print(f"发邮件给 {recipient}:{message}")
def disconnect(self):
if self.connection:
print(f"断开 {self.connection}...")
self.connection = None
print("邮箱断开")
class SMSSender:
def __init__(self, gateway, api_key):
self.gateway = gateway
self.api_key = api_key
self.connection = None
def connect(self):
print(f"用API密钥 {api_key} 连短信网关 {gateway}...")
self.connection = f"SMSConnection:{self.gateway}"
print("短信连好了")
def send_message(self, recipient, message):
if not self.connection:
print("错误:没连短信网关")
return
print(f"发短信给 {recipient}:{message}")
def disconnect(self):
if self.connection:
print(f"断开 {self.connection}...")
self.connection = None
print("短信断开")重构后抽共同逻辑到抽象基类:
import abc
class MessageSender(abc.ABC):
def __init__(self):
self.connection = None
@abc.abstractmethod
def connect(self): pass # 抽象方法,子类必须实现
@abc.abstractmethod
def _send(self, recipient, message): pass # 具体发送逻辑让子类写
def send_message(self, recipient, message): # 通用发送流程
if not self.connection:
print("错误:没连接")
return
self._send(recipient, message) # 调用子类的具体发送
def disconnect(self): # 通用断开流程
if self.connection:
print(f"断开 {self.connection}...")
self.connection = None
print("已断开")
class EmailSender(MessageSender):
def __init__(self, server, port):
super().__init__()
self.server = server
self.port = port
def connect(self):
print(f"连邮箱服务器 {self.server}:{self.port}...")
self.connection = f"EmailConnection:{self.server}"
print("邮箱连好了")
def _send(self, recipient, message):
print(f"发邮件给 {recipient}:{message}")
class SMSSender(MessageSender):
def __init__(self, gateway, api_key):
super().__init__()
self.gateway = gateway
self.api_key = api_key
def connect(self):
print(f"用API密钥 {self.api_key} 连短信网关 {self.gateway}...")
self.connection = f"SMSConnection:{self.gateway}"
print("短信连好了")
def _send(self, recipient, message):
print(f"发短信给 {recipient}:{message}")把单个方法拆成更小的单元,让它更清晰好懂。核心是别让方法太长太绕,每个小方法只干一件事。常用招儿:
提取方法:把一段代码块抽成独立方法。
内联方法:把简单方法的代码直接塞进调用它的地方。
目标是每个方法只在一个抽象层级干活,目的明确。这样测试也方便,每个小方法功能单一。
比如有个OrderProcessor类,process_order方法又臭又长,啥都干:算总价、打折、算税、格式化账单。重构后拆成几个小方法:
重构前:
class OrderProcessor: def __init__(self, order_items, discount_rate, tax_rate): self.order_items = order_items self.discount_rate = discount_rate self.tax_rate = tax_rate def process_order(self): # 算小计 total_price = 0 for item in self.order_items: total_price += item['price'] * item['quantity'] # 打折 discount_amount = total_price * self.discount_rate price_after_discount = total_price - discount_amount # 算税 tax_amount = price_after_discount * self.tax_rate final_price = price_after_discount + tax_amount # 格式化账单(省略一堆字符串拼接) print(summary) return final_price
重构后拆成小方法:
class OrderProcessor: def __init__(self, order_items, discount_rate, tax_rate): self.order_items = order_items self.discount_rate = discount_rate self.tax_rate = tax_rate def calculate_subtotal(self): # 算小计 subtotal = 0 for item in self.order_items: subtotal += item['price'] * item['quantity'] return subtotal def apply_discount(self, subtotal): # 打折 discount = subtotal * self.discount_rate return subtotal - discount, discount def calculate_tax(self, price_after_discount): # 算税 tax = price_after_discount * self.tax_rate return price_after_discount + tax, tax def format_summary(self, subtotal, discount, tax, final): # 格式化账单 # (省略拼接逻辑,返回一个字符串) return summary def process_order(self): # orchestrate各步骤 subtotal = self.calculate_subtotal() price_after_discount, discount = self.apply_discount(subtotal) final_price, tax = self.calculate_tax(price_after_discount) summary = self.format_summary(subtotal, discount, tax, final_price) print(summary) return final_price
让单个方法内部的逻辑更简单直接,不搞复杂嵌套、长参数列表。常用招儿:
用卫语句(guard clauses)代替嵌套条件(提前返回)。
合并重复的条件代码。
用参数对象简化方法签名。
比如有个check_access方法,嵌套一堆if-else,绕得慌:
重构前:
def check_access(user_status, user_role, subscription_level, resource_type): if user_status == "active": if user_role == "admin": if resource_type == "sensitive": return True # 活跃管理员总能访问敏感资源 else: return True # 活跃管理员访问非敏感资源也OK else: # 普通用户 if subscription_level == "premium": if resource_type != "sensitive": return True # 高级用户访问非敏感资源OK else: return False # 高级用户不能访问敏感资源 else: # 非高级用户 if resource_type == "public": return True # 只能访问公共资源 else: return False else: # 非活跃用户 return False # 没权限
用卫语句重构后,逻辑一目了然:
def check_access_simplified(user_status, user_role, subscription_level, resource_type): # 卫语句1:非活跃用户直接拒绝 if user_status != "active": return False # 卫语句2:活跃管理员全有权限 if user_role == "admin": return True # 到这里:活跃且非管理员 # 卫语句3:非高级用户只能访问公共资源 if subscription_level != "premium": return resource_type == "public" # 是公共资源就True,否则False # 到这里:活跃、非管理员、高级用户 # 卫语句4:高级用户不能访问敏感资源 if resource_type == "sensitive": return False # 剩下的情况:活跃、非管理员、高级、非敏感资源 → 有权限 return True
把方法或字段从一个类挪到逻辑上更合适的另一个类里,让职责分配更合理。比如一个类里的方法其实属于另一个类,挪过去能提高类的内聚性,减少不必要的耦合。
常用“移动方法”“移动字段”这些招儿。比如有个Customer类,里面有calculate_order_total方法,但其实这方法应该属于Order类。
重构前:
class Order: def __init__(self, items): # items是商品列表 self.items = items class Customer: def __init__(self, name, email): self.name = name self.email = email self.orders = [] def add_order(self, order): self.orders.append(order) def calculate_order_total(self, order): # 这方法其实属于Order total = 0 for item in order.items: total += item['price'] * item['quantity'] return total
重构后把方法挪到Order类:
class Order: def __init__(self, items): self.items = items def calculate_total(self): # 挪过来的方法 total = 0 for item in self.items: total += item['price'] * item['quantity'] return total class Customer: def __init__(self, name, email): self.name = name self.email = email self.orders = [] def add_order(self, order): self.orders.append(order) # 删掉了calculate_order_total方法
管理类和继承关系的重构技巧,比如用多态代替类型判断、把共用方法提到父类、子类特有方法下放等。目标是理清类之间关系,去掉依赖类型码的复杂条件。
比如有个Product类,用type字段判断运费:
重构前:
class Product: def __init__(self, name, price, type): # type是'book'/'electronics'/'clothing' self.name = name self.price = price self.type = type def get_shipping_cost(self): if self.type == 'book': return 5.00 elif self.type == 'electronics': return 10.00 elif self.type == 'clothing': return 7.50 else: return 99.99 # 默认值
重构后用子类代替类型判断:
class Product: def __init__(self, name, price): self.name = name self.price = price def get_shipping_cost(self): return 99.99 # 基类默认运费(或抛异常) class BookProduct(Product): def get_shipping_cost(self): return 5.00 class ElectronicsProduct(Product): def get_shipping_cost(self): return 10.00 class ClothingProduct(Product): def get_shipping_cost(self): return 7.50
动手重构时记住这几条:
重构前先测试:确保当前代码没问题,留个基准。
改一点测一点:每动一小块就跑测试,别攒一堆改完再测。
善用工具:IDE的重构功能(重命名、提取方法、格式化)能省不少事。
小步慢走:一次只改一小块,出问题也好排查。
挑时机重构:比如加新功能前、发版本前,顺手理理旧代码。