什么是抽象公共代码
抽象出公共代码以便重用是一种提高代码效率和可维护性的重要技术。通过识别并抽取重复的代码模式到单独的函数或类中,我们可以简化原有代码,减少错误,并使未来的修改更加容易。
示例:处理用户输入并进行验证
假设我们有一个程序,需要从用户那里获取多个输入,并对每个输入进行验证。例如,我们可能需要用户输入年龄、邮编和电子邮件地址,并对每个输入进行不同的验证。
非抽象代码示例
在下面的示例中,我们将看到对每种输入类型的重复验证代码,这些验证逻辑可以被抽象出来以减少代码重复。
def get_user_input():
# 获取用户年龄
age = input("Enter your age: ")
while not age.isdigit():
print("Invalid input. Please enter a valid age.")
age = input("Enter your age: ")
# 获取用户邮编
zipcode = input("Enter your zipcode: ")
while not zipcode.isdigit() or len(zipcode) != 5:
print("Invalid input. Please enter a 5-digit zipcode.")
zipcode = input("Enter your zipcode: ")
# 获取用户电子邮件地址
email = input("Enter your email: ")
while '@' not in email or '.' not in email:
print("Invalid input. Please enter a valid email address.")
email = input("Enter your email: ")
return age, zipcode, email
使用抽象重构代码
我们可以创建一个通用的输入验证函数,该函数接受输入提示和一个验证函数作为参数。这样,我们可以重用相同的逻辑来获取和验证不同类型的用户输入。
def get_valid_input(prompt, validation_function):
"""请求输入直到输入通过验证函数"""
user_input = input(prompt)
while not validation_function(user_input):
print("Invalid input. Please try again.")
user_input = input(prompt)
return user_input
def is_digit(input_str):
return input_str.isdigit()
def is_zipcode(input_str):
return input_str.isdigit() and len(input_str) == 5
def is_email(input_str):
return '@' in input_str and '.' in input_str
def get_user_input():
age = get_valid_input("Enter your age: ", is_digit)
zipcode = get_valid_input("Enter your zipcode: ", is_zipcode)
email = get_valid_input("Enter your email: ", is_email)
return age, zipcode, email
在这个重构后的版本中,我们创建了一个通用的get_valid_input
函数,它不断请求输入直到输入通过了提供的validation_function
验证。这样,我们就可以使用同样的函数来处理不同的输入验证需求,大大减少了代码的重复性,并提高了代码的可维护性和可扩展性。