应用模块就某一个功能集中划分的代码块,我们常称为应用模块。
1.加载一个模块。这个函数首先查找 package.loaded表,检测 modname是否被加载过。如果被加载过,require返回 package.loaded[modname]中保存的值。否则,它试着为模块寻找加载器。
2.require遵循 package.searchers序列的指引来查找加载器。如果改变这个序列,我们可以改变 require如何查找一个模块。下列说明基于 package.searchers的默认配置。
首先 require查找 package.preload[modname]。如果这里有一个值,这个值(必须是一个函数)就是那个加载器。否则 require使用 Lua加载器去查找 package.path的路径。如果查找失败,接着使用 C加载器去查找 package.cpath的路径。如果都失败了,再尝试一体化加载器()。
3.每次找到一个加载器,require都用两个参数调用加载器: modname和一个在获取加载器过程中得到的参数。(如果通过查找文件得到的加载器,这个额外参数是文件名。)如果加载器返回非空值, require将这个值赋给 package.loaded[modname]。如果加载器没能返回一个非空值用于赋给 package.loaded[modname], require会在那里设入 true。无论是什么情况,require都会返回 package.loaded[modname]的最终值。
4.如果在加载或运行模块时有错误,或是无法为模块找到加载器, require都会抛出错误。
查找器查找模块 foo会依次尝试打开文件./foo.so,./foo.dll,以及/usr/local/foo/init.so。一旦它找到一个 C库,查找器首先使用动态链接机制连接该库。然后尝试在该库中找到可以用作加载器的 C函数。这个 C函数的名字是"luaopen_"紧接模块名的字符串,其中字符串中所有的下划线都会被替换成点。此外,如果模块名中有横线,横线后面的部分(包括横线)都被去掉。例如,如果模块名为 a.b.c-v2.1,函数名就是 luaopen_a_b_c。
5.第四个搜索器是一体化加载器。它从 C路径中查找指定模块的根名字。例如,当请求 a.b.c时,它将查找 a这个 C库。如果找得到,它会在里面找子模块的加载函数。在我们的例子中,就是找luaopen_a_b_c。利用这个机制,可以把若干 C子模块打包进单个库。每个子模块都可以有原本的加载函数名。
6.除了第一个(预加载)搜索器外,每个搜索器都会返回它找到的模块的文件名。这和 package.searchpath的返回值一样。第一个搜索器没有返回值。
这张表内的每一项都是一个查找器函数。当查找一个模块时, require按次序调用这些查找器,并传入模块名(require的参数)作为唯一的一个参数。此函数可以返回另一个函数(模块的加载器)加上另一个将传递给这个加载器的参数。或是返回一个描述为何没有找到这个模块的字符串(或是返回 nil什么也不想说)。
android应用模块开发:
在android的项目开发中,都会遇到后期功能拓展增强与主程序代码变更的现实矛盾,也就是程序的灵活度。
由于linux平台的安全机制,再加上dalvik的特殊机制,各种权限壁垒,使得开发一个灵活多变的程序,变得比较困难,不像pc平台下那么容易。
瞅瞅elipse的插件,瞅瞅360的插件,在android下,我们一开始很难写好一个主程序,然后通过插件机制来应对以后的功能拓展,于是程序变得不那么灵活多变了。
比如一款android下的安全软件,新版本增加了一个功能,如短信拦截,往往会因为一个模块的增加,而重新编译一个apk包,这样周而复始,哪怕只增加50kb的功能代码,用户也需要升级一个完整的apk,往往是5~6M的体积。
模块可以理解为定义全局变量、函数的地方,类模块可以定义一个类,可在程序中创建一个该类的实例,完成类的功能。
模块有三种类型:窗体、标准和类。
简单的应用程序可以只有一个窗体,应用程序的所有代码都驻留在窗体模块中。而当应用程序庞大复杂时,就要另加窗体。最终可能会发现在几个窗体中都有要执行的公共代码。因为不希望在两个窗体中重复代码,所以要创建一个独立模块,它包含实现公共代码的过程。独立模块应为标准模块。此后可以建立一个包含共享过程的模块库。
每个标准模块、类模块和窗体模块都可包含:
声明。可将常数、类型、变量和动态链接库(DLL)过程的声明放在窗体、类或标准模块的模块级。
过程。Sub、Function或者 Property过程包含可以作为单元来执行的代码片段。本章后面的“过程概述”一节中将讨论这些内容。
窗体模块
窗体模块(文件扩展名为.FRM)是大多数 Visual Basic应用程序的基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、类型和外部过程的窗体级声明。如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值。写入窗体模块的代码是该窗体所属的具体应用程序专用的;它也可以引用该应用程序内的其它窗体或对象。
标准模块
标准模块(文件扩展名为.BAS)是应用程序内其它模块访问的过程和声明的容器。它们可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。写入标准模块的代码不必绑在特定的应用程序上;如果不小心用名称引用窗体和控件,则在许多不同的应用程序中可以重用标准模块。
类模块
在 Visual Basic中类模块(文件扩展名为.CLS)是面向对象编程的基础。可在类模块中编写代码建立新对象。这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模块,在其上可安放控件、可显示窗体窗口。
详细信息关于在类模块中编写代码的更详细的信息,请参阅“用对象编程”。
注意 Visual Basic的专业版和企业版也包含 ActiveX文档、ActiveX设计器和用户控件。它们介绍了具有不同文件扩展名的新模块类型。从编写代码的角度来看,这些模块应视同为窗体模块。
转载请注明:片头模版 » 应用模块是什么(软件开发中的应用模块是什么呢)