一、模块化编程
模块化编程是把程序分成若干个程序块,每个程序块含有一些设备和任务的逻辑指令。
二、执行
在组织块(OB1)中的指令决定控制程序的模块的执行。模块化编程功能(FC)或功能块(FB)。它们控制着不同的过程任务,例如: *** 作模式,诊断或实际控制程序。这些块相当于主循环程序的子程序。
三、优点和缺点
在模块化编程中,在主循环程序和被调用的块之间仍没有数据的交换。但是,每个功能区被分成不同的块。这样就易于几个人同时编程,而相互之间没有冲突。另外,把程序分成若干小块,将易于对程序调试和查找故障。OB1中的程序包含有调用不同块的指令。由于每次循环中不是所有的块都执行,只有需要时才调用有关的程序块,这样,CPU 将更有效地得到利用。一些用户对模块化编程不熟悉,开始时此方法看起来没有什么优点,但是,一旦理解了这个技术,编程人员将可以编写更有效和更易于 开发的程序。
首先编程中模块是程序中开发好的功能集合,在需要用的时候引入到项目中,如何使用如下:
基础库中的模块可以使用引用方法导入。 只有一个导出函数直接放在全局环境中: require。 所有其它的部分都导出在表 package 中。
1.require 遵循 package.searchers 序列的指引来查找加载器。 如果改变这个序列,我们可以改变 require 如何查找一个模块。 下列说明基于 package.searchers 的默认配置。
首先 require 查找 package.preload[modname] 。 如果这里有一个值,这个值(必须是一个函数)就是那个加载器。 否则 require 使用 Lua 加载器去查找 package.path 的路径。 如果查找失败,接着使用 C 加载器去查找 package.cpath 的路径。 如果都失败了,再尝试 一体化 加载器 (参见 package.searchers)。
2.每次找到一个加载器,require 都用两个参数调用加载器: modname 和一个在获取加载器过程中得到的参数。 (如果通过查找文件得到的加载器,这个额外参数是文件名。) 如果加载器返回非空值, require 将这个值赋给 package.loaded[modname]。 如果加载器没能返回一个非空值用于赋给 package.loaded[modname], require 会在那里设入 true 。 无论是什么情况,require 都会返回 package.loaded[modname] 的最终值。
3.一个描述有一些为包管理准备的编译期配置信息的串。这个字符串由一系列行构成:
第一行是目录分割串。 对于 Windows 默认是 '\' ,对于其它系统是 '/' 。
第二行是用于路径中的分割符。默认值是 '' 。
第三行是用于标记模板替换点的字符串。 默认是 '?' 。
包管理库提供了从 Lua 中加载模块的基础库。 只有一个导出函数直接放在全局环境中: require。 所有其它的部分都导出在表 package 中。
require (modname)
4.加载一个模块。 这个函数首先查找 package.loaded 表, 检测 modname 是否被加载过。 如果被加载过,require 返回 package.loaded[modname] 中保存的值。 否则,它试着为模块寻找 加载器 。
require 遵循 package.searchers 序列的指引来查找加载器。 如果改变这个序列,我们可以改变 require 如何查找一个模块。 下列说明基于 package.searchers 的默认配置。
首先 require 查找 package.preload[modname] 。 如果这里有一个值,这个值(必须是一个函数)就是那个加载器。
希望能帮到你,谢谢!
简单性:模块通常只关注问题的一小部分,而不是关注手头的整个问题。如果正在处理单个模块,那么将有一个较小的问题等待解决。这使得开发更容易,更不容易出错。2.
可维护性:模块通常设计为能够在不同的问题域之间实施逻辑边界。如果以最小化相互依赖性的方式编写模块,则对单个模块的修改将对程序的其他部分产生影响的可能性降低(甚至可以在不了解该模块之外的应用程序的情况下对模块进行更改)。这使得许多程序团队在大型应用程序上协同工作更加可行。
3.
可重用性:单个模块中定义的功能可以通过应用程序的其他部分轻松地重用(通过适当
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)