(二)实现对库存管理系统的模块化编程

1 引言

本次我们将运用模块化编程技术来实现一个比较有现实意义的项目---《库存管理系统》。该系统将能实现:

  1. 实时跟踪库存产品数量、位置等信息;
  2. 新进产品的添加和已售卖产品的移除;
  3. 生成报告一:当前库存产品在各地的数量信息;
  4. 生成报告二:各种产品需要补充的数量信息。

2 设计库存管理系统

我们可将该系统支持功能细分为以下三类:

  • 存储信息(data storage);
  • 人机交互(user interface);
  • 生成报告(generating reports)。

按照上面的划分,有助于我们组织整个项目代码。例如,信息存储能够实现包括产品数量、位置等所有信息的存储操作,人机交互部分则能实现对用户诸如添加产品等操作的响应。

相应地,我们就得到三个与之对应的独立模块:

  • 信息存储模块(data storage module);
  • 人机交互模块(user interface module);
  • 生成报告模块(generating reports module)。

除了以上三个功能模块外,我们还需创建一个源文件作为主项目,让用户能够开启和运行整个库存管理系统,通常命名为main.py。

至此,我们整个项目已包含有四部分,在实现特定功能时通常需要各部分之间的相互协作。比如,生成报告模块需要从数据存储模块获取产品信息。因此,各部分间的交互可由下图进行表示:

到这里,我们就已经完全弄清了整个项目的框架,接下来我们就进一步来分析和搭建各部分模块。

3 数据存储模块

此模块将负责存储整个项目的信息,存储信息总共有三类:产品信息,位置信息,项目信息(产品代码和位置代码组成)。

3.1 产品信息创建函数

def set_products(products):
    global _products
    _products = products

功能:创建产品信息列表。

输入:产品信息,包括产品代码、描述信息和期望存储数量。将上述信息以元组格式作为参数输入到set_products(products)函数中,产品信息格式如下所示:

[("CODE01", "Product 1", 120),
 ("CODE02", "Product 2", 100), ...
]

3.2 返回产品信息函数

当我们能够输入并创建产品信息后,则需要有进行查看当前产品信息的功能,于是我们需要创建一个返回产品信息函数,如下所示:

def products():
    global _products
    return _products

功能:实现简单的返回产品相关信息,例如通过下面的语句可对整个产品信息列表进行扫描:

for code, description, desired_number in products():
    ...

3.3 位置信息创建函数

def set_locations(locations):
    global _locations
    _locations = locations

功能:创建位置信息列表。

输入:位置信息,包括位置代码和描述信息,同样以元组格式进行存储并作为参数输入到set_locations(locations)函数中。

3.4 返回位置信息函数

同样地,我们也需要能够返回产品位置信息的功能,于是创建位置信息返回函数,如下所示:

def locations():
    global _locations
    return _locations

3.5 返回产品项目信息函数

库存中的产品项目信息由产品代码和产品位置代码组成,定义返回库存产品项目信息函数,如下所示:

def items():
    global _items
    return _items

功能:返回产品项目信息,信息返回为元组格式,如下所示:

[("product_code01", "location_code01"),
 ("product_code02", "location_code02"), ...
]

3.6 增添项目信息函数

def add_item(product_code, location_code):
    global _items
    _items.append((product_code, location_code))
    _save_items()

功能:增添产品项目信息到原始项目信息列表中。

输入:产品代码、位置代码。

3.7 移除项目信息函数

def remove_item(product_code, location_code):
    global _items
    for i in range(len(_items)):
        prod_code, loc_code = _items[i]
        if prod_code == product_code and loc_code == location_code:
          del _items[i]
           _save_items()
           return True
    return False

功能:移除原始项目信息列表中某条产品项目信息。

输入:产品代码、位置代码。

3.8 初始化函数

当程序开始运行时,需要将相关信息数据从硬盘中加载到内存,或者内存中数据保存到硬盘上这样的操作,于是定义初始化函数支持此类操作。

def init():
    _load_items()

功能:程序开始运行时,从硬盘文件中加载数据信息。

3.9 加载数据函数

def _load_items():
  global _items
  if os.path.exists("items.json"):
    f = open("items.json", "r")
    _items = json.loads(f.read())
    f.close()
  else:
    _items = []

功能:从硬盘中名为items的json文件中加载数据到内存中。

3.10 保存数据函数

def _save_items():
    global _items
    f = open("items.json", "w")
    f.write(json.dumps(_items))
    f.close()

功能:保存内存中数据到硬盘文件。

至此,我们完成了数据存储模块的全部功能函数,它们共同组成了该模块的公共接口以供调用,整体结构如下图所示:

4 人机交互模块

人机交互模块将负责与用户进行交互,包括向用户请求信息和显示信息在屏幕上。这里为了简化,我们仅实现文字交互,运用input()函数向用户请求信息,运用print()函数显示信息在屏幕上。

4.1 用户命令响应函数

def prompt_for_action():
    ...

功能:响应用户各类操作请求代码,请求代码含义如下表所示:

4.2 响应用户并返回产品代码函数

def prompt_for_product():
    ...

功能:显示列表中产品代码信息供用户选择,若用户取消,则返回None。

4.3 响应用户并返回位置代码函数

def prompt_for_location():
    ...

功能:显示列表中位置代码信息供用户选择,若用户取消,则返回None。

4.4 报告显示函数

def show_report(report):
    print()
    for line in report:
        print(line)
    print()

功能:纯文本格式显示报告内容。

输入:存储报告信息的列表。

5 生成报告模块

5.1 生成当前库存产品信息报告函数

def generate_inventory_report():
    ...

功能:将当前库存全部产品信息生成报告并显示。

5.2 生成需补充产品信息报告函数

def generate_reorder_report():
    ...

功能:将当前需要补充产品信息生成报告并显示。

6 主函数项目

我们不应该将主项目视为一个模块,而应该将其作为一个标准Python源文件,用户运行此源文件来启动整个项目系统。主项目中需要导入它所需要的各种模块,并调用所定义的各种函数来完成项目的既定任务,它就好比是胶黏剂,将项目各部分全部有机粘合在一起。在Python语言中,这种源文件内通常可见到如下所示的语法框架:

def main():
    ...
if __name__ == "__main__":
    main()

整个项目的执行逻辑全部写进main()函数中, 当用户运行此项目时,最后两行程序便会告知系统执行main()函数中的全部逻辑。

对于本次设计的库存管理系统,主项目需要完成的任务有如下:

  1. 调用初始化函数,初始化需要初始化的各个模块;
  2. 提供库存初始产品信息和位置信息;
  3. 请求人机交互模块并给用户显示可用操作命令提示;
  4. 响应用户输入的命令。

【注】:步骤3、4无限循环执行直到用户退出。

7 小结

本次我们用模块化编程技术完成设计和实现了一个跟踪库存产品信息的管理系统,详细地设计并实现了各个功能模块以及模块中的各个功能函数,完整地体验了整个项目的逻辑结构。能够在设计实现过程中体会到模块化编程思想能大大提高设计的灵活性和效率。

未完待续...

本文章属于原创作品,欢迎大家转载分享,禁止修改文章的内容。尊重原创,转载请注明来自:躬耕南阳  https://www.cnblogs.com/yangmi511/

原文地址:https://www.cnblogs.com/yangmi511/p/12227119.html

时间: 2024-10-10 03:12:31

(二)实现对库存管理系统的模块化编程的相关文章

js模块化编程(二):AMD规范

转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的用法 今天介绍如何规范地使用模块. 接上文 七.模块的规范 先想一想,为什么模块很重要?因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模

js模块化编程(三):Require.js的用法

转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的用法 介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战.我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多

js模块化编程(一):模块的写法

转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的用法 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂.网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑.Javascript模块化编程,已经成为一个迫切的需求.理想

JS模块化编程(二)

背景 我们常在页面引用js遇到下面情况 <script src="1.js"></script> <script src="2.js"></script> <script src="3.js"></script> <script src="4.js"></script> <script src="5.js"

Javascript模块化编程(二):AMD规范

作者: 阮一峰 日期: 2012年10月30日 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种

Javascript模块化编程(二):AMD规范(转)

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS和AMD.我主要介绍AMD,但

Javascript模块化编程(二):AMD规范 作者: 阮一峰

声明:转载自阮一峰的网络日志 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS

Javascript模块化编程(二)AMD规范(规范使用模块)

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊.今天介绍如何规范地使用模块. 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,

Javascript模块化编程(二):AMD规范(转)

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS和AMD.我主要介绍AMD,但