建立Python 编程的项目观和架构思维

打印 上一主题 下一主题

主题 1925|帖子 1925|积分 5775

目次

一、软件项目的认识
二、软件的规模认识
三、如何应对规模较大的软件开发——软件架构
四、分层架构的python综合例子:
1、项目简介:
2、项目的分层布局与文件构造布局的对照图:
3、主要功能运行界面:
4.主要代码的部门实例:
附录:未分层代码可以参考,运行领会.


一、软件项目的认识

软件项目是指利用编程语言开发的一套程序或软件,通常包含多个代码文件、模块、包以及相关资源,他们协同工作以实现特定的功能或办理特定的问题,除功能外还体现了一定的布局构造性。

软件项目包含的 常见功能性 和 构造性成分如下:


  • .py文件:是Python中最基本的源代码程序文件,用于存储纯文本情势的源代码。开发者通过编辑.py文件来编写程序,它包含函数、类、变量界说以及实验逻辑,由Python表明器直接读取并实验,是编写和实验Python程序的主要载体。
  • 模块(Module):按照Python的惯用约定,模块通常与.py文件重合,对应一个包含函数界说、类界说、变量赋值的.py文件。模块可以被其他Python代码导入,以实现代码和功能重用。 与.py文件的区别:模块名是对功能的一种抽象表现,它暂时不直接对应详细的文件名或文件位置,实验时由Python表明器通过一定的机制动态(如搜刮路径)对应到.py文件。
    留意:意味着同一个模块名可以对应不同的.py文件,取决于当前工作路径里包含的.py名和表明器搜刮路径里包含的.py名与模块名的对照同等性。
  • 包:包是包含多个模块的文件夹,其中包含一个特殊的__init__.py文件(即使这个文件为空也可以)。包允许开发者按不同设计目的,实现布局清晰的构造模块和代码。例如,你可以创建一个名为mypackage的文件夹,其中包含一个__init__.py文
        包、文件、模块形成了不同的条理地区性的、本身的命名空间,在此区间里不允许同名。意味着不同条理中的命名可以是相同的,而不会相互干扰,主要作用总结:


  •  封装性:可以将一系列相关的函数和变量封装起来,形成一个独立的命名空间。
  • 可重用性:通过导入,可以在不同的程序中重复利用。
  • 构造性:可以资助你构造代码,使得代码更加清晰、易于维护
        命名空间(Namespace)‌是一种用于构造代码和防止命名冲突的重要机制。通过命名空间,开发者可以将标识符(如变量、函数、类等)封装在一个独立的作用域中,从而避免不同模块或库中的同名标识符发生冲突。‌
        Python中的命名空间主要有内置、全局和局部三种类型。内置命名空间在表明器启动时创建,自动映射到全局空间,全局命名空间在模块界说时创建,局部命名空间在函数调用时创建。
二、软件的规模认识

软件按规模划分

  • 微型:代码行数较少,功能简单一,一样平常代码行数在两千行以内,通常一个人完成。
  • 小型:功能较为单一或几个焦点功能,代码行数在几千到几万行之间的项目,团队规模较小约1到5人。
  • 中型:功能较为复杂,代码行数在几万到几团队规模较约6到15人。
  • 大型项:代码行数凌驾几十万行,甚至可能达到百万级。团队规模约16到50人。
三、如何应对规模较大的软件开发——软件架构

        应对大规模软件开发的手段包罗:需求管理机制、技能架构设计开发过程控制、团队协作优化。这里只谈架构方面。        
        软件架构 是指软件系统中各要素的基本布局和构造方式,它界说了软件系统的各个部门之间的关系和交互方式,以及系统的整体设计方案。软件架构设计包罗软件的构成部门和模块的划分、以及它们之间的关系和依靠等。


        软件架构作用:软件架构是开发项目的蓝图,是设计团队部署需要实验的任务的依据,使复杂问题被规划成规模合理的子问题,简化问题,有助于提高系统的可维护性、可扩展性和可重用性,同时体现了工程思维。软件架构详细规划了如下内容:



  • 软件的构成构件和功能:系统要实现的功能和业务是什么。
  • 软件系统的性能和可靠性:包罗系统的响应速率、容错本领、可用性和安全性等方面。
  • 软件系统的接口和交互:包罗系统内部构件间交互,软件系统与外界的接口和交互方式,涉及与用户的交互、与其他系统的数据交换等。
  • 软件系统的部署和维护:考虑系统的可部署性、可设置性、可测试性和可监控性等方面。
1、常见软件架构



  • 分层架构:是最常见的架构模式之一,通常被称为n层架构。它将软件分为多个条理,如展现层、业务逻辑层和长期层。这种架构有助于提高代码的可维护性和可扩展性,但可能会导致性能降落,而且增长系统生产成本和复杂性。
  • 变乱驱动架构:组件通过变乱进行通信,适用于需要高度解耦的系统,如实时数据处理和异步工作流。这种架构可以提高系统的响应速率和机动性,但不适合交互性强的系统。
  • 微服务架构:将应用程序划分为一组小的、松散耦合的服务,每个服务实现特定的业务功能并通过轻量级通信机制(如HTTP RESTful API)相互协作。适用于需要高度可扩展性和机动性的大型复杂应用。
2、分层架构的设计

        在软件工程中,分层架构是一种将应用或系统划分为多个独立条理(或模块)的方法,每个条理负责不同的功能。分层架构的主要目的是降低层与层之间的依靠,实现功能模块的合理粒度规划和高内聚低耦合,以提高系统的机动性和可维护性,同时实现开发任务的可控划分、分配与高效管理,这是分层架构软件设计的重点和精髓。
        分层架构通常包罗用户接口层、应用层、范畴层(可选)和基础层。分层架构的实现是如何体现的,起首体现在项目的布局上,如下:

四、分层架构的python综合例子:

1、项目简介:

        名称students_Score
        功能包含登录注册功能、成绩录入与成绩可视化;
         数据表成绩表(包含数学、英语、专业课字段)用户表(包含用户名和密码字段)。
         系统软件的分层架构:数据访问层model,服务控制层service,界面显示层view。
        特点:每层间的依靠是单向的,非跳跃的,通过分层设计,系统各层之间的依靠关系被明确界定,降低了层与层之间的耦合度,从而提高了系统的机动性和可维护性。
2、项目的分层布局与文件构造布局的对照图:


数据访问层model

服务控制层service

界面显示层view


3、主要功能运行界面:




4.主要代码的部门实例:

服务控制层 service包里 的loginuser模块代码如下:
  

附录:未分层代码可以参考,运行领会.

  1. import streamlit as st
  2. import pandas as pd
  3. import hashlib
  4. import sqlite3
  5. if 'user' not in st.session_state:
  6.     st.session_state.user = None
  7. # Hashing password
  8. def hash_password(password):
  9.     return hashlib.sha256(password.encode()).hexdigest()
  10. # Database connection
  11. conn = sqlite3.connect('grades.db', check_same_thread=False)
  12. c = conn.cursor()
  13. # Create tables if they don't exist
  14. def init_db():
  15.     c.execute('''
  16.         CREATE TABLE IF NOT EXISTS users (
  17.             username TEXT PRIMARY KEY,
  18.             password_hash TEXT
  19.         )
  20.     ''')
  21.     c.execute('''
  22.         CREATE TABLE IF NOT EXISTS grades (
  23.             id INTEGER PRIMARY KEY AUTOINCREMENT,
  24.             math REAL,
  25.             english REAL,
  26.             major REAL
  27.         )
  28.     ''')
  29.     conn.commit()
  30. init_db()
  31. # Login function
  32. def login():
  33.     st.subheader("登录")
  34.     username = st.text_input("用户名")
  35.     password = st.text_input("密码", type="password")
  36.     if st.button("登录"):
  37.         hashed_password = hash_password(password)
  38.         c.execute("SELECT * FROM users WHERE username=? AND password_hash=?", (username, hashed_password))
  39.         user = c.fetchone()
  40.         if user:
  41.             st.success(f"成功登录为 {username}")
  42.             st.session_state.user = username
  43.         else:
  44.             st.error("无效的用户名或密码")
  45. # Register function
  46. def register():
  47.     st.subheader("注册")
  48.     new_username = st.text_input("新用户名")
  49.     new_password = st.text_input("新密码", type="password")
  50.     confirm_password = st.text_input("确认密码", type="password")
  51.     if st.button("注册"):
  52.         if new_password == confirm_password:
  53.             hashed_password = hash_password(new_password)
  54.             try:
  55.                 c.execute("INSERT INTO users (username, password_hash) VALUES (?, ?)", (new_username, hashed_password))
  56.                 conn.commit()
  57.                 st.success("用户注册成功!")
  58.             except sqlite3.IntegrityError:
  59.                 st.error("用户名已存在")
  60.         else:
  61.             st.error("密码不匹配")
  62. # Grades input function
  63. def input_grades():
  64.     st.subheader("输入成绩")
  65.     math = st.number_input("数学成绩", min_value=0, max_value=100, step=1)
  66.     english = st.number_input("英语成绩", min_value=0, max_value=100, step=1)
  67.     major = st.number_input("专业课成绩", min_value=0, max_value=100, step=1)
  68.     if st.button("提交"):
  69.         c.execute("INSERT INTO grades (math, english, major) VALUES (?, ?, ?)", (math, english, major))
  70.         conn.commit()
  71.         st.success("成绩提交成功!")
  72. # Grades visualization function
  73. def visualize_grades():
  74.     st.subheader("成绩可视化")
  75.     c.execute("SELECT * FROM grades")
  76.     grades_data = c.fetchall()
  77.     if grades_data:
  78.         df = pd.DataFrame(grades_data, columns=["ID", "Math", "English", "Major"])
  79.         st.dataframe(df)
  80.         st.bar_chart(df.set_index("ID"))
  81.     else:
  82.         st.warning("没有可用的成绩数据")
  83. # Main application logic
  84. def main():
  85.     st.title("学生成绩管理系统")
  86.    
  87.     menu = ["登录", "注册", "输入成绩", "成绩可视化"]
  88.     choice = st.sidebar.selectbox("菜单", menu)
  89.     if choice == "登录":
  90.         login()
  91.     elif choice == "注册":
  92.         register()
  93.     elif choice == "输入成绩":
  94.         if st.session_state.user:
  95.             input_grades()
  96.         else:
  97.             st.warning("请先登录以访问此功能")
  98.     elif choice == "成绩可视化":
  99.         if st.session_state.user:
  100.             visualize_grades()
  101.         else:
  102.             st.warning("请先登录以访问此功能")
  103. if __name__ == "__main__":
  104.     main()
复制代码
总结:分层架构系统 代码 相较未分层 模块化设计,复杂度增长、代码量、存储消耗稍有增长,需要仔细规划依靠和依靠通报。付出这些一次性、不大的代价,换来了功能模块的合理粒度的规划和高内聚低耦合,提高了系统的机动性和日后的可维护性,同时实现了开发任务的可控性 边界清晰的划分、分配与高效管理等,是应对规模较大软件开发时, 可选的常用架构设计方案之一。
非常感谢你每一次的停留和阅读!这承载了满满厚爱与支持!愿你在编程的道路上日新月异,劳绩满满的成就和高兴

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表