软件开发规范

软件的开发规范

程序配置

划分文件

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('\033[1;45m 欢迎来到注册页面 \033[0m')
        username = input('请输入用户名:').strip()
        if not username.isalnum():
            print('\033[1;31;0m 用户名有非法字符,请重新输入 \033[0m')
            continue
        if username in dic:
            print('\033[1;31;0m 用户名已经存在,请重新输入 \033[0m')
            continue
        password = input('请输入密码:').strip()
        if 6 <= len(password) <= 14:
            with open('register', encoding='utf-8', mode='a') as f1:
                f1.write(f'\n{username}|{password}')
            status_dic['username'] = str(username)
            status_dic['status'] = True
            print('\033[1;32;0m 恭喜您,注册成功!已帮您成功登录~ \033[0m')
            return True
        else:
            print('\033[1;31;0m 密码长度超出范围,请重新输入 \033[0m')





@common.auth
def article():
    print(f'\033[1;32;0m 欢迎{status_dic["username"]}访问文章页面\033[0m')


@common.auth
def diary():
    print(f'\033[1;32;0m 欢迎{status_dic["username"]}访问日记页面\033[0m')


@common.auth
def comment():
    print(f'\033[1;32;0m 欢迎{status_dic["username"]}访问评论页面\033[0m')


@common.auth
def enshrine():
    print(f'\033[1;32;0m 欢迎{status_dic["username"]}访问收藏页面\033[0m')


def login_out():
    status_dic['username'] = None
    status_dic['status'] = False
    print('\033[1;32;0m 注销成功 \033[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('\033[1;31;0m 您输入的超出范围,请重新输入 \033[0m')

        else:
            print('\033[1;31;0m 您您输入的选项有非法字符,请重新输入 \033[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('\033[1;31;0m 请先进行登录 \033[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功能和源码结构。

posted @ 2019-06-24 13:28  樊xs  阅读(131)  评论(1编辑  收藏  举报