欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第19天 目录规范

程序员文章站 2022-04-12 19:34:49
目录规范 人生三问: 案例分享: 1. 在一个文件夹下面创建了三个文件,如下 atm文件信息如下: def login(): print('login') # 打开用户文件为验证 with open('userinfo', 'rt', encoding='utf-8') as f: print(f. ......

目录规范

人生三问:

1. 什么是目录规范
  目录规范就是写程序的时候对目录做的一种规定。 2. 为什么要用目录规范
  为了使我们的程序代码能够更好的管理,具有更好的可读性,减少代码的冗余。 3. 怎么使用目录规范
  会创建以下几个目录
  bin 放的是程序的可执行文件
  conf   配置文件
  core 逻辑代码文件
  lib    库文件
  db    数据文件
  log    日志文件
  readme  说明文档
  

案例分享:

1. 在一个文件夹下面创建了三个文件,如下

第19天  目录规范

 

atm文件信息如下:

第19天  目录规范
def login():
    print('login')
    # 打开用户文件为验证
    with open('userinfo', 'rt', encoding='utf-8') as f:
        print(f.read())


def register():
    print('register')
    with open('userinfo', 'at', encoding='utf-8') as f:
        print(f.write('这是注册'))

def repayment():
    print('repayment')


def logger(log_str):
    # 写入日志文件内容
    with open('log.txt', 'at', encoding='utf-8') as f:
        f.write(log_str)

def run():
    print('欢迎!')
    while true:
        print('1.登录 2.注册 3.还款...')
        index = input('>>').strip()
        if index == '1':
            login()
        elif index == '2':
            register()
        elif index == '3':
            repayment()
        else:
            print('重新输入!')


run()
atm文件内容

 

问题一: 如果我们的用户信息文件和日志信息文件的路径改变了,我们该怎么改这个程序,我们需要改变代码中所有包含路径的信息,我们这个代码只写了三个,当然好改,但是如果是一个大型的项目我们难道要一个一个的修改吗?当然不必要,我们只需要把路径赋值给一个变量,当用户需要修改的时候只需要把变量的路径 改一下就可以了。因此我们代码改动如下

第19天  目录规范
user_file_path = r'h:\python_study\day19\测试\userinfo'
log_file_path = r'h:\python_study\day19\测试\log.txt'

def login():
    print('login')
    # 打开用户文件为验证
    with open(user_file_path, 'rt', encoding='utf-8') as f:
        print(f.read())

def register():
    print('register')
    with open(user_file_path, 'at', encoding='utf-8') as f:
        print(f.write('这是注册'))

def repayment():
    print('repayment')

def logger(log_str):
    # 写入日志文件内容
    with open(user_file_path, 'at', encoding='utf-8') as f:
        f.write(log_str)

def run():
    print('欢迎!')
    while true:
        print('1.登录 2.注册 3.还款...')
        index = input('>>').strip()
        if index == '1':
            login()
        elif index == '2':
            register()
        elif index == '3':
            repayment()
        else:
            print('重新输入!')

run()
atm更改路径变量

 

问题二:路径修改完成之后我们会发现多出来两个变量,这两个变量是可以根据用户文件的不同进行修改的,也就是说这个是我们程序的一个配置信息,如果之后配置信息有很多,那么再把这些配置信息放在atm文件中,可能用户都需要找个大半天也不知道应该更改哪个值,因此我们需要创建一个用来专门存放配置信息的文件夹,那就是conf,  存放配置信息的我们暂时创建一个settings.py配置文件,然后把刚刚那两个配置信息写进去。

第19天  目录规范

 

问题三:在我们的测试目录下面有很多的文件,其中有日志文件,数据文件以及执行文件,很乱,随着我们项目越来越大,可能数据文件也越来越多,产生的日志也会越来越多,因此,我们需要专门的创建一个目录log文件来存放我们的日志文件,我们还需要专门的创建一个数据文件来存放我们的数据,因此我们的目录结构就变成了下面这个样子 

第19天  目录规范

 

问题四: 现在虽然说我们的目录结构已经很清晰了,但是我们目前只是有一个核心程序atm,如果我们再加上一个购物车,管理员操作程序呢,我们就会发现程序的可执行文件太多,如果给用户用户根本就不清楚哪一个才是程序的执行入口,因此我们需要创建一个bin目录来存放程序的执行入口,把一些功能的核心程序放在core目录下面,如下:

第19天  目录规范

 

 问题五:虽然说这样让我们的代码变得又清晰了很多,但是有这样一个问题,在atm中我们有一个写入日志的函数,这个函数在很多的过程中都会使用到,无论是转账, 提现啊等都会调用这个函数去写入文件。 如果我们在写一个用户登录认证装饰器,我们会发现在很多的场景也会使用到这个函数。也就是说某一个函数可能被很多的函数所调用的时候,我们需要把这些函数专门的放在一块,作为库来被关键代码所调用,这个就是lib文件夹。如下:我们把atm中的logger函数放在commont模块中。

第19天  目录规范

至此,我们的程序就完成建立成功了,接下来,我们来解释一下怎么使这个程序运行起来呢?

第一步:程序启动入口的设置:

 我们之前是在atm文件中调用了run函数,既然我们要把启动文件设置在bin目录下,那么我们的当然不能在atm中调用函数了,我们需要把bin目录下的start文件当成执行文件去调用我们需要的功能。

问题思考:
    当我们把start文件当成执行文件之后,sys.path中的添加的路径就是bin目录了, 那当我们想要去调用core下面的atm函数的时候应该怎么去导入模块呢?

问题的解决:
    我们需要把当前执行文件的目录的上一层目录给添加到环境变量中

操作方法:start.py文件内容
import sys, os
# 获得当前目录的上一层的路径
base_dir = os.path.dirname(os.path.dirname(__file__))
# 添加到环境变量中,这样我们就可以导入刚刚创建的目录了
sys.path.append(base_dir)

# 导入核心代码中的atm模块
import core.atm
core.atm.run()

第二步:核心代码程序中的变量导入

atm.py文件的修改
在第一行导入settings配置文件

from conf.setttings import *

 第三步:配置信息的更正

setttings.py的配置信息
因为我们之前的移动过用户文件和日志文件

更改路径:
# 用户只需要更改此处的路径,不需要更改源代码中的路径
user_file_path = r'h:\python_study\day19\测试\db\userinfo'
log_file_path = r'h:\python_study\day19\测试\log\log.txt'

重新执行start文件发现可以执行了文件,有人可能会说,就这几行的代码有必要搞得这么麻烦吗?这个原因是因为我们只是写了这样一个简单的代码来进行举例,如果我们的项目本来就很大,如果我们不进行结构化的整理,那么对于代码的书写以及代码的维护都将是一个非常困难的事情。所以以后写代码还是最好按照一定的代码结构来整理会相对来说好一点。 

问题六:我们应该把这些目录创建成包还是目录呢?

结论:
    创建的结构都不建议创建成包。包一般都放在lib目录下面