• 080 面向过程编程


    面向过程编程是解决问题的一种思想,相当于武林门派,武林门派之间没有好坏之分,因此它与我们之后学习的面向对象编程其实没有好坏之分。

    面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么、后干什么、再干什么、然后干什么……

    基于该思想编写程序就好比在设计一条流水线,面向对称编程其实是一种机械式的思维方式。

    当我们写登录功能,我们首先需要输入账号、密码,然后认证两次密码是否相同,然后从数据库中读取密码验证用户密码输入是否正确,然后输入验证码……之后,我们就能够实现登录功能。这样把登录功能问题流程化,进而是解决问题的思路非常清晰。

    56面向过程编程-流水线.jpg?x-oss-process=style/watermark

    优点:复杂的问题流程化,进而简单化。

    生产汽水瓶的流水线,没办法生产特斯拉。流水线下一个阶段的输入与上一个阶段的输出是有关联的。因此他的扩展性极差。

    缺点:扩展性差。

    一、注册功能

    1.1 接受用户输入用户名,进行合法性校验,拿到合法的用户名

    def check_username():
        username = input('username>>>').strip()
        if username.isalpha():
            return username
        else:
            print('用户名必须为字母,傻叉')
    

    1.2 接受用户输入密码,进行合法性校验,拿到合法的密码

    def check_pwd():
        while True:
            pwd = input('password>>>').strip()
            if len(pwd) < 5:
                print('密码长度至少五位')
                continue
            re_pwd = input('re_password>>>').strip()
            if pwd == re_pwd:
                return pwd
            else:
                print('两次输入密码不一致')
    

    1.3 将合法的用户名和密码写入文件

    def insert(username, pwd, path='57.txt'):
        with open(path, 'a', encoding='utf8') as fa:
            fa.write(f'{username}:{pwd}\n')
    

    1.4 注册

    def register():
        username = check_username()
        pwd = check_pwd()
        insert(username, pwd)
        print(f'{username}注册成功')
    
    
    register()
    
    username>>>nick
    password>>>12345
    re_password>>>12345
    nick注册成功
    

    如果现在我们需要校验用户的年龄,因此我们需要增加一个check_age()方法,并且其他有牵连的地方都需要修改,因此它的扩展性极差。

    1.5 封装文件读写功能

    # def register():
    #     while True:
    #         username = input('username>>>').strip()
    #         # 检测用户是否重复,如果重复则重新输入
    #         with open('db.txt', 'r', encoding='utf8') as fr:
    #             for line in fr:
    #                 info = line.strip('\n').split(':')
    #                 if username == info[0]:
    #                     print('用户名已经存在')
    #                     break
    #             else:
    #                 # 用户名不存在
    #                 # 跳出循环,不用重复输入用户名字
    #         res =
    
    # def tell_info():
    #     username = input('username>>>').strip()
    #     with open('db.txt', 'r', encoding='utf8') as fr:
    #         for line in fr:
    #             info = line.strip('\n').split(':')
    #             if username == info[0]:
    #                 return info
    

    数据处理层

    def select(username):
        with open('db.txt', 'r', encoding='utf8') as fr:
            for line in fr:
                info = line.strip('\n').split(':')
                if username == info[0]:
                    return info
    
    
    def tell_info():
        username = input('username>>>').strip()
        info = select(username)
        print(info)
    

    用户功能层

    def register():
        while True:
            username = input('username>>>').strip()
            # 检测用户是否重复,如果重复则重新输入
            res = select(username)
            if res:
                print('用户名已经存在')
            else:
                break
    
        while True:
            pwd = input('password>>>').strip()
            re_pwd = input('re_password>>>').strip()
            if pwd != re_pwd:
                print('两次输入密码不一致,请重新输入')
            else:
                break
    

    把注册功能分开之后,功能与功能直接解耦合,复杂的问题流程化,更加清晰。

    二、分层实现功能

    • 用户功能层:实现用户具体的功能。
    • 接口层:连接数据处理层和用户功能层。
    • 数据处理层:处理数据后把结果交给接口层。

    分层实现功能的好处:当我们需要实现web端和app端的软件,我们只要把数据处理层和接口层写好,然后实现不同的用户功能层即可,web端使用web端的用户功能层,app端使用app端的用户功能层,但是接口层和数据处理层是通用的。

  • 相关阅读:
    [BZOJ 1019][SHOI2008]汉诺塔(递推)
    [BZOJ 1018][SHOI2008]堵塞的交通traffic(线段树)
    [BZOJ 1017][JSOI2008]魔兽地图DotR(树形Dp)
    [BZOJ 1015][JSOI2008]星球大战starwar(并查集+离线)
    [BZOJ 1014][JSOI2008]火星人prefix(Splay+二分+hash)
    Vue脚手架创建项目目录详解
    Vue-cli3 vue.config.js配置详解
    Systemd指令大全
    CentOS7 常用命令集合
    Centos7虚拟机集群配置
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11794044.html
Copyright © 2020-2023  润新知