软件开发规范

男娘i 2022-01-09 05:37 396阅读 0赞

一,为什么要规范软件开发?

1.1 为什么要有规范软件开发。

  你现在包括之前写的一些程序,所谓的’项目’,都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好。但是真正的后端开发的项目,系统等,少则几万行代码,多则十几万,几十万行代码,你全都放在一个py文件中行么?当然你可以说,只要能实现功能即可。咱们举个例子,如果你的衣物只有三四件,那么你随便堆在橱柜里,没问题,咋都能找到,也不显得特别乱,但是如果你的衣物,有三四十件的时候,你在都堆在橱柜里,可想而知,你找你穿过三天的袜子,最终从你的大衣口袋里翻出来了,这是什么感觉和心情……

  软件开发,规范你的项目目录结构,代码规范,遵循PEP8规范等等,让你更加清晰滴,合理滴开发。

  软件开发的首要规范就是从设计目录结构开始。

1.2 为什么要设计项目目录结构?

 “设计项目目录结构”,就和”代码编码风格”一样,属于个人风格问题。对于这种风格上的规范,一直都存在两种态度:

  1. 一类同学认为,这种个人风格问题”无关紧要”。理由是能让程序work就好,风格问题根本不是问题。
  2. 另一类同学认为,规范化能更好的控制程序结构,让程序具有更高的可读性。

我是比较偏向于后者的,因为我是前一类同学思想行为下的直接受害者。我曾经维护过一个非常不好读的项目,其实现的逻辑并不复杂,但是却耗费了我非常长的时间去理解它想表达的意思。从此我个人对于提高项目可读性、可维护性的要求就很高了。”项目目录结构”其实也是属于”可读性和可维护性”的范畴,我们设计一个层次清晰的目录结构,就是为了达到以下两点:

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

所以,我认为,保持一个层次清晰的目录结构是有必要的。更何况组织一个良好的工程目录,其实是一件很简单的事儿。

二,较好的目录结构方式(推荐)

1513627-20190307172152813-998037690.png

具体分析:

ContractedBlock.gif ExpandedBlockStart.gif

  1. #===============>start.py
  2. # 开启项目的start文件。
  3. import sys,os
  4. BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  5. sys.path.append(BASE_DIR)
  6. from core import src
  7. if __name__ == '__main__':
  8. src.run()
  9. #===============>settings.py
  10. # 配置文件,放一些路径或者信息等配置
  11. import os
  12. BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  13. DB_PATH=os.path.join(BASE_DIR,'db','db.json')
  14. LOG_PATH=os.path.join(BASE_DIR,'log','access.log')
  15. LOGIN_TIMEOUT=5
  16. """
  17. logging配置
  18. """
  19. # 定义三种日志输出格式
  20. standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
  21. '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
  22. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  23. id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
  24. # log配置字典
  25. LOGGING_DIC = {
  26. 'version': 1,
  27. 'disable_existing_loggers': False,
  28. 'formatters': {
  29. 'standard': {
  30. 'format': standard_format
  31. },
  32. 'simple': {
  33. 'format': simple_format
  34. },
  35. },
  36. 'filters': {},
  37. 'handlers': {
  38. #打印到终端的日志
  39. 'console': {
  40. 'level': 'DEBUG',
  41. 'class': 'logging.StreamHandler', # 打印到屏幕
  42. 'formatter': 'simple'
  43. },
  44. #打印到文件的日志,收集info及以上的日志
  45. 'default': {
  46. 'level': 'DEBUG',
  47. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  48. 'formatter': 'standard',
  49. 'filename': LOG_PATH, # 日志文件
  50. 'maxBytes': 1024*1024*5, # 日志大小 5M
  51. 'backupCount': 5,
  52. 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
  53. },
  54. },
  55. 'loggers': {
  56. #logging.getLogger(__name__)拿到的logger配置
  57. '': {
  58. 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  59. 'level': 'DEBUG',
  60. 'propagate': True, # 向上(更高level的logger)传递
  61. },
  62. },
  63. }
  64. #===============>src.py
  65. # 主要逻辑部分:
  66. # 核心逻辑,代码放在这。
  67. from conf import settings
  68. from lib import common
  69. import time
  70. logger=common.get_logger(__name__)
  71. current_user={
  72. 'user':None,'login_time':None,'timeout':int(settings.LOGIN_TIMEOUT)}
  73. def auth(func):
  74. def wrapper(*args,**kwargs):
  75. if current_user['user']:
  76. interval=time.time()-current_user['login_time']
  77. if interval < current_user['timeout']:
  78. return func(*args,**kwargs)
  79. name = input('name>>: ')
  80. password = input('password>>: ')
  81. db=common.conn_db()
  82. if db.get(name):
  83. if password == db.get(name).get('password'):
  84. logger.info('登录成功')
  85. current_user['user']=name
  86. current_user['login_time']=time.time()
  87. return func(*args,**kwargs)
  88. else:
  89. logger.error('用户名不存在')
  90. return wrapper
  91. @auth
  92. def buy():
  93. print('buy...')
  94. @auth
  95. def run():
  96. print('''
  97. 购物
  98. 查看余额
  99. 转账
  100. ''')
  101. while True:
  102. choice = input('>>: ').strip()
  103. if not choice:continue
  104. if choice == '1':
  105. buy()
  106. #===============>db.json
  107. # 重要数据放在这里
  108. #===============>common.py
  109. # 公共组件放在这里:公共功能部分。
  110. from conf import settings
  111. import logging
  112. import logging.config
  113. import json
  114. def get_logger(name):
  115. logging.config.dictConfig(settings.LOGGING_DIC) # 导入上面定义的logging配置
  116. logger = logging.getLogger(name) # 生成一个log实例
  117. return logger
  118. def conn_db():
  119. db_path=settings.DB_PATH
  120. dic=json.load(open(db_path,'r',encoding='utf-8'))
  121. return dic
  122. #===============>access.log
  123. # 日志信息
  124. [2017-10-21 19:08:20,285][MainThread:10900][task_id:core.src][src.py:19][INFO][登录成功]
  125. [2017-10-21 19:08:32,206][MainThread:10900][task_id:core.src][src.py:19][INFO][登录成功]
  126. [2017-10-21 19:08:37,166][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
  127. [2017-10-21 19:08:39,535][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
  128. [2017-10-21 19:08:40,797][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
  129. [2017-10-21 19:08:47,093][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
  130. [2017-10-21 19:09:01,997][MainThread:10900][task_id:core.src][src.py:19][INFO][登录成功]
  131. [2017-10-21 19:09:05,781][MainThread:10900][task_id:core.src][src.py:24][ERROR][用户名不存在]
  132. [2017-10-21 19:09:29,878][MainThread:8812][task_id:core.src][src.py:19][INFO][登录成功]
  133. [2017-10-21 19:09:54,117][MainThread:9884][task_id:core.src][src.py:19][INFO][登录成功]

关于README的内容

这个我觉得是每个项目都应该有的一个文件,目的是能简要描述该项目的信息,让读者快速了解这个项目。

它需要说明以下几个事项:

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

我觉得有以上几点是比较好的一个README。在软件开发初期,由于开发过程中以上内容可能不明确或者发生变化,并不是一定要在一开始就将所有信息都补全。但是在项目完结的时候,是需要撰写这样的一个文档的。

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

  

转载于:https://www.cnblogs.com/Big-Dinosaur/p/10490995.html

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读

    相关 软件编程规范

    1 排版 1-1:程序块要采用缩进风格编写,缩进的空格数为4个。(规定) 说明:对于由开发工具自动生成的代码可以有不一致。 1-2:不允许把多个短语句写在一行中,即

    相关 软件开发规范

    一,为什么要规范软件开发? 1.1 为什么要有规范软件开发。   你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认

    相关 软件开发规范

      为什么要有规范软件开发。   真正的后端开发的项目,系统等,少则几万行代码,多则十几万,几十万行代码,你全都放在一个py文件中行么?咱们举个例子,如果你的衣物只有三