模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性。模块化本体是指具有模块结构的本体(知识库的一种表现形式)。模块化用来分割,组织和打包软件。模块化是一种处理复杂系统分解成为更好的可管理模块的方式。一种是基于非经典语义的逻辑语言扩展,如分布式描述逻辑,E-连接和基于包的描述逻辑;另外一种途径是基于经典描述逻辑语义,但限制对外部符号的使用以保证各模块可安全的合并。
模块化
模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性。模块化本体是指具有模块结构的本体(知识库的一种表现形式)。模块化用来分割,组织和打包软件。模块化是一种处理复杂系统分解成为更好的可管理模块的方式。一种是基于非经典语义的逻辑语言扩展,如分布式描述逻辑,E-连接和基于包的描述逻辑;另外一种途径是基于经典描述逻辑语义,但限制对外部符号的使用以保证各模块可安全的合并。
基本信息
运行模式
独立的工作运行模式
基本属性
接口、功能、逻辑、状态
作用
模块化用来分割,组织和打包软件。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。
模块具有以下几种基本属性:接口、功能、逻辑、状态,功能、状态与接口反映模块的外部特性,逻辑反映它的内部特性。
在系统的结构中,模块是可组合、分解和更换的单元。模块化是一种处理复杂系统分解成为更好的可管理模块的方式。它可以通过在不同组件设定不同的功能,把一个问题分解成多个小的独立、互相作用的组件,来处理复杂、大型的软件。
模块化本体
模块化本体是指具有模块结构的本体(知识库的一种表现形式)。许多应用领域需要模块化的本体,如
协作式本体开发
分布式数据管理
大规模本体的管理和推理
本体的部分重用
当前,实现模块化本体主要有两种主要的语言途径。一种是基于非经典语义的逻辑语言扩展,如分布式描述逻辑,E-连接和基于包的描述逻辑;另外一种途径是基于经典描述逻辑语义,但限制对外部符号的使用以保证各模块可安全的合并。
基础
我们首先简单地概述一下,自从三年前Eric Miraglia(YUI的开发者)第一次发表博客描述模块化模式以来的一些模块化模式。如果你已经对于这些模块化模式非常熟悉了,大可以直接跳过本节,从“进阶模式”开始阅读。
匿名闭包
这是一种让一切变为可能的基本结构,同时它也是Javascript最棒的特性。我们将简单地创建一个匿名函数并立即执行它。所有的代码将跑在这个函数内,生存在一个提供私有化的闭包中,它足以使得这些闭包中的变量能够贯穿我们的应用的整个生命周期。
复制代码代码如下:
(function(){
//... all vars and functions are in this scope only
// still maintains access to all globals
}());
注意这对包裹匿名函数的最外层括号。因为Javascript的语言特性,这对括号是必须的。在js中由关键词function开头的语句总是会被认为是函数声明式。把这段代码包裹在括号中就可以让解释器知道这是个函数表达式。
全局变量导入
Javascript有一个特性叫做隐式全局变量。无论一个变量名在哪儿被用到了,解释器会根据作用域链来反向找到这个变量的var声明语句。如果没有找到var声明语句,那么这个变量就会被视为全局变量。如果这个变量用在一句赋值语句中,同时这个变量又不存在时,就会创建出一个全局变量。这意味着在匿名闭包中使用或创建全局变量是很容易的。不幸的是,这会导致写出的代码极难维护,因为对于人的直观感受来说,一眼根本分不清那些是全局的变量。
幸运的是,我们的匿名函数提供了简单的变通方法。只要将全局变量作为参数传递到我们的匿名函数中,就可以得到比隐式全局变量更清晰又快速的代码了。下面是示例:
复制代码代码如下:
(function($, YAHOO){
// now have access to globals jQuery(as$) and YAHOO in this code
}(jQuery, YAHOO));
模块导出
有时你不仅想要使用全局变量,你还想要声明它们,以供反复使用。我们可以很容易地通过导出它们来做到这一点——通过匿名函数的返回值。这样做将会完成一个基本的模块化模式雏形,接下来会是一个完整的例子:
复制代码代码如下:
var MODULE=(function(){
var my={},
privateVariable= 1;
function privateMethod(){
//...
}
my.moduleProperty= 1;
my.moduleMethod= function(){
//...
};
return my;
}());
注意我们已经声明了一个叫做MODULE的全局模块,它拥有2个公有的属性:一个叫做MODULE.moduleMethod的方法和一个叫做MODULE.moduleProperty的变量。另外,它还维护了一个利用匿名函数闭包的、私有的内置状态。同时,我们可以很容易地导入需要的全局变量,并像之前我们所学到的那样来使用这个模块化模式。
进阶模式
上面一节所描述的基础已经足以应对许多情况,现在我们可以将这个模块化模式进一步的发展,创建更多强大的、可扩展的结构。让我们从MODULE模块开始,一一介绍这些进阶模式。
放大模式
整个模块必须在一个文件中是模块化模式的一个限制。任何一个参与大型项目的人都会明白将js拆分多个文件的价值。幸运的是,我们拥有一个很棒的实现来放大模块。首先,我们导入一个模块,并为它添加属性,最后再导出它。下面是一个例子——从原本的MODULE中放大它:
复制代码代码如下:
var MODULE=(function(my){
my.anotherMethod= function(){
// added method...
};
return my;
}(MODULE));
我们用var关键词来保证一致性,虽然它在此处不是必须的。在这段代码执行完之后,我们的模块就已经拥有了一个新的、叫做MODULE.anotherMethod的公有方法。这个放大文件也会维护它自己的私有内置状态和导入的对象。
宽放大模式
我们的上面例子需要我们的初始化模块最先被执行,然后放大模块才能执行,当然有时这可能也不一定是必需的。Javascript应用可以做到的、用来提升性能的、最棒的事之一就是异步执行脚本。我们可以创建灵活的多部分模块并通过宽放大模式使它们可以以任意顺序加载。每一个文件都需要按下面的结构组织:
复制代码代码如下:
var MODULE=(function(my){
// add capabilities...
return my;
}(MODULE||{}));
在这个模式中,var表达式使必需的。注意如果MODULE还未初始化过,这句导入语句会创建MODULE。这意味着你可以用一个像LABjs的工具来并行加载你所有的模块文件,而不会被阻塞。
紧放大模式
宽放大模式非常不错,但它也会给你的模块带来一些限制。最重要的是,你不能安全地覆盖模块的属性。你也无法在初始化的时候,使用其他文件中的属性(但你可以在运行的时候用)。紧放大模式包含了一个加载的顺序序列,并且允许覆盖属性。这儿是一个简单的例子(放大我们的原始MODULE):
复制代码代码如下:
var MODULE=(function(my){
var old_moduleMethod= my.moduleMethod;
my.moduleMethod= function(){
// method override, has access to old through old_moduleMethod...
};
return my;
}(MODULE));
我们在上面的例子中覆盖了MODULE.moduleMethod的实现,但在需要的时候,可以维护一个对原来方法的引用。
克隆与继承
复制代码代码如下:
var MODULE_TWO=(function(old){
var my={},
key;
for(key in old){
if(old.hasOwnProperty(key)){
my[key]= old[key];
}
}
var super_moduleMethod= old.moduleMethod;
my.moduleMethod= function(){
// override method on the clone, access to super through super_moduleMethod
};
return my;
}(MODULE));
这个模式可能是最缺乏灵活性的一种选择了。它确实使得代码显得很整洁,但那是用灵活性的代价换来的。正如我上面写的这段代码,如果某个属性是对象或者函数,它将不会被复制,而是会成为这个对象或函数的第二个引用。修改了其中的某一个就会同时修改另一个(译者注:因为它们根本就是一个啊!)。这可以通过递归克隆过程来解决这个对象克隆问题,但函数克隆可能无法解决,也许用eval可以解决吧。因此,我在这篇文章中讲述这个方法仅仅是考虑到文章的完整性。
跨文件私有变量
把一个模块分到多个文件中有一个重大的限制:每一个文件都维护了各自的私有变量,并且无法访问到其他文件的私有变量。但这个问题是可以解决的。这里有一个维护跨文件私有变量的、宽放大模块的例子:
复制代码代码如下:
var MODULE=(function(my){
var _private= my._private= my._private||{},
_seal= my._seal= my._seal|| function(){
delete my._private;
delete my._seal;
delete my._unseal;
},
_unseal= my._unseal= my._unseal|| function(){
my._private= _private;
my._seal= _seal;
my._unseal= _unseal;
};
// permanent access to _private, _seal, and _unseal
return my;
}(MODULE||{}));
所有文件可以在它们各自的_private变量上设置属性,并且它理解可以被其他文件访问。一旦这个模块加载完成,应用程序可以调用MODULE._seal()来防止外部对内部_private的调用。如果这个模块需要被重新放大,在任何一个文件中的内部方法可以在加载新的文件前调用_unseal(),并在新文件执行好以后再次调用_seal()。我如今在工作中使用这种模式,而且我在其他地方还没有见过这种方法。我觉得这是一种非常有用的模式,很值得就这个模式本身写一篇文章。
子模块
我们的最后一种进阶模式是显而易见最简单的。创建子模块有许多优秀的实例。这就像是创建一般的模块一样:
复制代码代码如下:
MODULE.sub=(function(){
var my={};
//...
return my;
}());
虽然这看上去很简单,但我觉得还是值得在这里提一提。子模块拥有一切一般模块的进阶优势,包括了放大模式和私有化状态。
模块化设计思想与其具体做法如下:
模块化设计思想是一种将系统或产品拆分成多个独立、可重复使用的独立单元(模块),这样可以实现高效、灵活和可扩展的设计方法。并且该设计方法可以提高开发效率并改善系统的可维护性和可靠性。
以下是模块化设计思想的具体做法:
1、定义模块的边界:在设计过程中,必须明确模块的范围和功能,定义每个模块的界限。不同的模块需要拥有自己的接口,实现输入和输出的数据交换。
2、确定功能细分和层次结构:要实现模块化设计,应将原本复杂的系统或产品细分成多个小模块,同时建立宏观和微观的层次结构。通过这种层次性的设计,可以提高模块之间的灵活性和模块的通用性和复用性。
3、明确模块的职责和任务:每个模块必须有自己的独立任务、职责和功能。这需要在设计过程中对每个模块进行详细分析和研究,以确保每个模块都能够具有一定的独立性和互相独立的任务。
4、建立模块间的接口和通信机制:各个模块之间需要定义好接口,建立好通信机制,实现各个模块之间的交互。这不仅可以增强模块之间的互动,也可以方便模块的衔接和替换。
5、设计通用的模块:在设计模块时,应考虑到模块的通用性,使得它可以在多个系统和产品中被使用和重复使用。这将节约设计时间并提高产品质量,同时可以减少成本和资源的浪费。
6、进行测试和评估:设计的模块应该经过严格的测试,系统性的验证其功能的可行性和有效性。在实际的设计实践中,应不断地进行评估和改进,以期更好地提高系统的质量和性能。
模块化设计思想是一种优秀的设计方法,通过将产品或系统分解为多个互不相干、可重用和可扩展的模块单元,最终实现了高效、灵活、可维护和可扩展的产品设计过程。在实际应用中,设计师可根据实践经验开发出更加优质、具有竞争力的产品。
模块化设计的应用
1、电子行业:在电子行业中,模块化设计可以为现代产品的制造和维护带来重要好处。设计师可根据实践经验,使用成熟的技术来开发和生产可重复使用和有共同接口的模块单元,以改善产品的性能、可维修性和可扩展性。
2、机械行业:在机械行业中,模块化设计也被广泛应用于各种机器装置和机械设备的设计过程中,如汽车、飞机、发电机和工业机器人等。模块化设计可以减少生产过程中的重复性工作,降低生产成本,同时可以提高产品的可扩展性和可访问性。
3、建筑行业:在建筑工程中,模块化设计也逐渐渗透到现代设计中。如将家具和墙壁分成不同的单元,可让用户根据需求自由组合和装修,既省去了大量的细节设计工作,又使这些房间具有可配置性和高度的灵活性和可扩展性。
转载请注明:片头模版 » 模块化的方法(js的模块化编程有哪些方式)