• 软件开发规范


    软件的开发规范

    程序配置

    划分文件

    bin(程序的执行文件夹) → start.py 项目启动文件

    方便开启整个项目

    conf (配置文件夹) → settings.py (配置文件)

    配置文件,就是放置一些项目中需要的静态参数,比如文件路径,数据库配置,软件的默认设置等等

    core(逻辑文件夹) → src.py 核心逻辑功能 / 主逻辑

    这个文件主要存放的就是核心逻辑功能,你看你需要进行选择的这些核心功能函数,都应该放在这个文件中。

    db(数据文件夹) → 类似于register文件

    这个文件文件名不固定,register只是我们项目中用到的注册表,但是这种文件就是存储数据的文件,类似于文本数据库,那么我们一些项目中的数据有的是从数据库中获取的,有些数据就是这种文本数据库中获取的,总之,你的项目中有时会遇到将一些数据存储在文件中,与程序交互的情况,所以我们要单独设置这样的文件

    lib (库文件,辅助功能文件夹)→ common.py ( 辅助功能公共组件库文件 / 例 : 装饰器 )

    公共组件文件,这里面放置一些我们常用的公共组件函数,并不是我们核心逻辑的函数,而更像是服务于整个程序中的公用的插件,程序中需要即调用。比如我们程序中的装饰器auth,有些函数是需要这个装饰器认证的,但是有一些是不需要这个装饰器认证的,它既是何处需要何处调用即可。比如还有密码加密功能,序列化功能,日志功能等这些功能都可以放在这里。

    log(日志文件) → 日志文件

    日志主要是供开发人员使用。比如你项目中出现一些bug问题,比如开发人员对服务器做的一些操作都会记录到日志中,以便开发者浏览,查询

    划分具体目录

    设计项目目录结构

    规范化能更好的控制程序结构,让程序具有更高的可读性

    1. 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。
    2. 可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。

    博客园登录实例

    # starts_________________________________
    # import sys
    # # 太麻烦,添加一个一个文件夹的路径,我要将整个项目的路径添加到sys.path
    # # 动态获取路径
    # # print(__file__)
    # # import os
    # # BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    # # sys.path.append(BASE_PATH)
    # # from core import src # No module named 'src'
    # # print(src.flag)
    # # # run()
    import sys
    import os
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    sys.path.append(BASE_PATH)
    from core import src
    if __name__ == '__main__':
        src.run()
    ```
    
    ```python
    # settings_________________________________
    import os
    BASE_PATH = os.path.dirname(os.path.dirname(__file__))
    register_path = os.path.join(BASE_PATH,'db','register')
    ```
    
    ```python
    # src_________________________________
    from conf import settings
    from lib import common
    status_dic = {
        'username': None,
        'status': False,
    }
    flag = True
    
    
    
    def login():
        i = 0
        with open(settings.register_path, encoding='utf-8') as f1:
            dic = {i.strip().split('|')[0]: i.strip().split('|')[1] for i in f1}
        while i < 3:
            username = input('请输入用户名:').strip()
            password = input('请输入密码:').strip()
            if username in dic and dic[username] == password:
                status_dic['username'] = str(username)
                status_dic['status'] = True
                print('登录成功')
                return True
            else:
                print('用户名密码错误,请重新登录')
                i += 1
    
    
    def register():
        with open(settings.register_path, encoding='utf-8') as f1:
            dic = {i.strip().split('|')[0]: i.strip().split('|')[1] for i in f1}
        while 1:
            print('33[1;45m 欢迎来到注册页面 33[0m')
            username = input('请输入用户名:').strip()
            if not username.isalnum():
                print('33[1;31;0m 用户名有非法字符,请重新输入 33[0m')
                continue
            if username in dic:
                print('33[1;31;0m 用户名已经存在,请重新输入 33[0m')
                continue
            password = input('请输入密码:').strip()
            if 6 <= len(password) <= 14:
                with open('register', encoding='utf-8', mode='a') as f1:
                    f1.write(f'
    {username}|{password}')
                status_dic['username'] = str(username)
                status_dic['status'] = True
                print('33[1;32;0m 恭喜您,注册成功!已帮您成功登录~ 33[0m')
                return True
            else:
                print('33[1;31;0m 密码长度超出范围,请重新输入 33[0m')
    
    
    
    
    
    @common.auth
    def article():
        print(f'33[1;32;0m 欢迎{status_dic["username"]}访问文章页面33[0m')
    
    
    @common.auth
    def diary():
        print(f'33[1;32;0m 欢迎{status_dic["username"]}访问日记页面33[0m')
    
    
    @common.auth
    def comment():
        print(f'33[1;32;0m 欢迎{status_dic["username"]}访问评论页面33[0m')
    
    
    @common.auth
    def enshrine():
        print(f'33[1;32;0m 欢迎{status_dic["username"]}访问收藏页面33[0m')
    
    
    def login_out():
        status_dic['username'] = None
        status_dic['status'] = False
        print('33[1;32;0m 注销成功 33[0m')
    
    
    def exit_program():
        global flag
        flag = False
        return flag
    
    
    choice_dict = {
        1: login,
        2: register,
        3: article,
        4: diary,
        5: comment,
        6: enshrine,
        7: login_out,
        8: exit_program,
    }
    
    
    
    def run():
        while flag:
            print('''
            欢迎来到博客园首页
            1:请登录
            2:请注册
            3:文章页面
            4:日记页面
            5:评论页面
            6:收藏页面
            7:注销
            8:退出程序''')
    
            choice = input('请输入您选择的序号:').strip()
            if choice.isdigit():
                choice = int(choice)
                if 0 < choice <= len(choice_dict):
                    choice_dict[choice]()
                else:
                    print('33[1;31;0m 您输入的超出范围,请重新输入 33[0m')
    
            else:
                print('33[1;31;0m 您您输入的选项有非法字符,请重新输入 33[0m')
    
    
    # run()
    ```
    
    ```python
    # register_________________________________
    alex|alex3714
    liye|dsb
    duidui|xsb
    ```
    
    ```python
    # common_________________________________
    from core import src
    def auth(func):
        def inner(*args, **kwargs):
            if src.status_dic['status']:
                n = 'alex'
                ret = func(*args, **kwargs)
                return ret
            else:
                print('33[1;31;0m 请先进行登录 33[0m')
                if src.login():
                    ret = func(*args, **kwargs)
                    return ret
    
        return inner
    ```
    
    ```python
    # log_________________________________
    201906281200.log
    ```
    
    
    

    关于README的内容

    1. 软件定位,软件的基本功能。
    2. 运行代码的方法: 安装环境、启动命令等。
    3. 简要的使用说明。
    4. 代码目录结构说明,更详细点可以说明软件的基本原理。
    5. 常见问题说明。

    可以参考Redis源码中Readme的写法,这里面简洁但是清晰的描述了Redis功能和源码结构。

  • 相关阅读:
    gcc各个版本下载
    加减法运算解决乘除法
    蚂蚁碰撞的概率
    ns2.34移植leach协议
    ubantu16.04安装ns2.34 错误
    ubantu安全卸载火狐浏览器
    post和get的区别
    docker加速配置阿里云镜像
    重装系统后,会因为本机保存的公匙不对报错
    集合 set
  • 原文地址:https://www.cnblogs.com/fanxss/p/11109486.html
Copyright © 2020-2023  润新知