当前位置: 首页 > article >正文

什么是抽象公共代码

抽象出公共代码以便重用是一种提高代码效率和可维护性的重要技术。通过识别并抽取重复的代码模式到单独的函数或类中,我们可以简化原有代码,减少错误,并使未来的修改更加容易。

示例:处理用户输入并进行验证

假设我们有一个程序,需要从用户那里获取多个输入,并对每个输入进行验证。例如,我们可能需要用户输入年龄、邮编和电子邮件地址,并对每个输入进行不同的验证。

非抽象代码示例

在下面的示例中,我们将看到对每种输入类型的重复验证代码,这些验证逻辑可以被抽象出来以减少代码重复。

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验证。这样,我们就可以使用同样的函数来处理不同的输入验证需求,大大减少了代码的重复性,并提高了代码的可维护性和可扩展性。


http://www.kler.cn/a/288612.html

相关文章:

  • 蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)
  • Excel筛选的操作教程
  • Vue.js 项目创建流程
  • 浅谈:基于三维场景的视频融合方法
  • uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用
  • 45.第二阶段x86游戏实战2-hook监控实时抓取游戏lua
  • PLC边缘计算网关的选择策略-天拓四方
  • 0826-0901 各种面试笔试题算法题整理
  • CSS 样式化表格——WEB开发系列24
  • 【数据库|第9期】SQL Server、Access和Sqlite 的字段别名详解
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
  • 使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测
  • Java 入门指南:Java 并发编程 —— 线程隔离技术 ThreadLocal
  • subclass-balancing的实验结果分析
  • 开放式耳机排行榜10强?这五款绝对不能错过!
  • mysql高可用之组复制 (MGR)
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 【战略游戏】
  • Docker笔记-启动容器时,时间与宿主机保持一致
  • 如何找到适合的IT外包服务商
  • 【JAVA】两轮充电桩设计模式实践分享
  • mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题
  • 深入Redis:细谈持久化
  • 浅析前端数据埋点监控:用户行为与性能分析的桥梁
  • ES6基础----Generator的使用
  • 【RabbitMQ之一:windows环境下安装RabbitMQ】