- 浏览: 1430350 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (564)
- 算法 (7)
- 流金岁月 (1)
- Javascript (30)
- actionscript (108)
- as3.0 game (14)
- flex (84)
- fms2 (27)
- 正则表达式 (7)
- 开源组件代码(as3.0) (1)
- Pv3d (13)
- Cairngorm (4)
- vbs (54)
- VB程序设计 (26)
- 计算机应用与维护 (4)
- 职场实用穿衣技巧 (3)
- 历史风云 (15)
- 淡泊明志,宁静致远 (12)
- 情感 (26)
- 杂谈 (41)
- 越南风 (14)
- DirectX (9)
- Dev-cpp (11)
- 回望百年 (2)
- 建站经验 (2)
- Python (24)
- 网络赚钱 (4)
- php (2)
- html (1)
- ob0短址网 (1)
- ob0.cn (1)
- wordpress (1)
- pandas logistic (1)
- haxe (1)
- opencv (1)
- 微信小程序 (3)
- vue (3)
- Flutter (1)
最新评论
-
GGGGeek:
第一个函数滚动监听不起作用,onPageScroll可以
微信小程序--搜索框滚动到顶部时悬浮 -
naomibyron:
解决办法:工具 -> 编译选项 -> 编译器 ...
dev-c++中编译含WINSOCK的代码出现错误的解决方法 -
haichuan11:
这个…… 代码不全真的是让人很憋屈的感觉啊
actionScript 3.0 图片裁剪及旋转 -
chenyw101:
老兄能留个QQ号吗?具体的我有些东西想请教下你
用VB制作网站登陆器 -
yantao1943:
貌似有点问题,只派发一次事件啊
使用ActionScript 2.0或ActionScript 3.0处理音频文件的提示点(cue
如果你没有看过Roger Gonzalez的Blog中关于模块(Module)的文章,那么你应该去那里了解一下Flex 2这个特性背后的细节和想法。这里我不想过多地探讨为什么要这样,而是想要给大家展示一个使用了模块(Module)的简单的Flex程序,你可以从中获得启示。
示例源码
你可以下载关于这个例子的压缩文件:点击这里下载。
模块(Modules)
模 块(Module)是创建大型Flex应用程序的一个解决方案,它允许你将你的用户接口分割成许多分散的有各自用途的小块。例如(下面出自Flex 2的文档),一个保险公司可能有数百个表单——针对于各个领域的,针对各种请求类型,以及针对各种应用等等。创建一个包含所有这些表单的Flex应用程序 将会产生一个巨大SWF文件,还会有不少问题:
•应用程序越大开发过程越复杂;
•应用程序越大测试过程越复杂;
•应用程序越大部署过程越复杂;
•SWF文件越大加载时间越长
我的示例程序基于Flex 2文档中的一个程序,但是我将它做了一些更改来说明几个常见的问题。这个例子展示了一个主程序和其它三个共享公有数据的模块(Module)。
其 中一个设计要素是一个接口的使用,这个接口实质上是接口实现者和使用者之间的一个契约。这个例子将会说明我所说的意思。模块(Module)的接口部分虽 然不是必须的但是却可以大大简化以后的开发和维护。比如,如果开发人员有一个小组负责报告部分,另一个小组负责图表部分,如果它们一开始用了接口,那么只 要有需要,接口的实现就可以做足够多的变形而不会影响到工程结果。接口在模块(Module)中还扮演另外一个角色,我在下文中将会揭示这点。
模块(Module)是以<mx:Module>代替<mx:Application>作为根标签的MXML文件(或ActionScript文件)。你可以将带有<mx:Module>标签的作为一个程序来看,但是它不能运行。
这个示例有一个主程序文件以及带有一个接口的两个模块。打开主程序文件你会看到:
程序代码<mx:Panel x="10" y="41" width="169" height="500" layout="absolute" title="Modules">
<mx:Text x="10" y="24" text="Check a module to load it; uncheck to unload it" width="129"/>
<mx:RadioButton x="10" y="97" label="None" selected="true"
click="removeModule()"/>
<mx:RadioButton x="10" y="123" label="Chart"
click="removeModule();loadModule('ChartModule.swf')"/>
<mx:RadioButton x="10" y="175" label="Table"
click="removeModule();loadModule('GridModule.swf')"/>
</mx:Panel>
<mx:Panel x="187" y="41" width="500" height="500" layout="absolute" title="Module: {moduleName}">
<mx:ModuleLoader id="currentModule" ready="readyModule(event)"
width="100%" height="100%" />
</mx:Panel>
第 一个Panel包含了控制示例中模块(Module)加载和卸载的RadioButtons。第二个Panel是使用<mx: ModuleLoader>标签加载模块(Module)的地方。注意那个id为currentModule的ModuleLoader,它有一个 关于ready事件的事件处理器。当模块SWF文件加载了足够多可以开始使用的时候,ModuleLoader 就会分派ready事件(或者说ModuleEvent.READY)。
这里有一个readyModule函数,它在<mx:Script>块中:
程序代码private function readyModule( event:ModuleEvent ) : void
{
var ml:ModuleLoader = event.target as ModuleLoader;
var ichild:IExpenseReport = ml.child as IExpenseReport;
if( ichild != null ) {
ichild.expenseReport = expenses;
}
}
注 意ModuleLoader的child属性是如何转换为IExpenseReport类的。IExpenseReport是一个所有模块 (Module)都实现了的接口。只要每个模块都实现了这个接口,它就可以很容易适应于应用程序。换句话说,想象一下当你需要创建另一个表单或者报告的时 候它的用途。并不需要更改主程序为新模块添加IF语句,你只要在新模块中实现IExpenseReport接口它就可以在程序中完美地运行。
IExpenseReport接口是:
程序代码public interface IExpenseReport
{
function set expenseReport( ac:ArrayCollection ) : void;
}
每个模块(Module)都实现这个接口,定义各自的名为expenseReport的set函数。下面是ChartModule的根标签和接口IExpenseReport的实现:
程序代码<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" implements="IExpenseReport"
layout="vertical"
percentWidth="100" percentHeight="100" >
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable] public var expenses:ArrayCollection;
public function set expenseReport( ac:ArrayCollection ) : void
{
expenses = ac;
}
]]></mx:Script>
...
</mx:Module>
让我们回到主程序,RadioButton的click事件会卸载任何当前已加载的模块然后加载一个新的模块。下面是ChartModule的RadioButton标签:
程序代码<mx:RadioButton x="10" y="123" label="Chart" click="readyModule('ChartModule.swf')"/>
这个click事件会调用上面列出的readyModule事件。
编译并运行程序
如果你使用了Flex Builder 2,请确定更改了项目的Properties将模块(Module)作为"Applications"包含进来。这样Flex Builder 2回将它们编译进SWF文件并且放进bin文件夹中。
Flex Builder注意:要创建一个使用模块(Module)的工程,请使用工程的Properties将模块文件作为"Applications"。这会使得他们被编译进SWF文件。
一旦SWF文件被创建你就可以运行主程序并点击RadioButtons在模块(Module)之间切换。
Flex Builder注意:Flex Builder并不会保存任何关于模块(Module)和主程序的从属信息。只要你对一个模块(Module)作了更改,你就可能需要重新编译主程序或其它从属的模块(Module)。
将SWF文件最优化
如果你查看一下主程序的SWF文件和模块(Module)的SWF文件的话,你会发现它们的大小差不多。这就说明,模块的SWF和主程序SWF中有很多同样的组件定义。
Flash Player并不会保存元件(symbol)的副本。例如,如果主程序有一个Button组件而一个模块(Module)也有一个Button组件,Flash Player就不会从模块中加载Button了,因为它已经在主程序中有定义了。
使用-link-report=report.xml编译主程序,这样会创建一个链接到主程序的包含所有元件信息的文件。然后在编译模块(Module)的时候会使用那个report.xml文件。
程序代码mxmlc -load-externs=report.xml ChartModule.mxml
当ChartModule 被编译的时候,所有在report.xml文件中列出的元件将会在它的SWF中省略。当我不使用report.xml文件编译 ChartModule.swf的时候,它的大小是202K。而当我使用report.xml文件的时候,SWF的大小只有68K。这大大减少了模块 (Module)的加载时间。
在文章的开始将到模块(Module)的时候,我提过接口有另一个作用。假设你没有使用接口而是在主程序中 引用模块的类。当你运行link-report的时候,你的模块类将会出现在report.xml中。当你使用使用link-report编译模块 (Module)的时候你的模块并不会包含在它自己的SWF中!起初这并不会成为一个问题,尽管主程序由于包含了模块的定义而变得很大。然而,当你更改你 的模块的时候发生了什么才是重要的。如果你没有重新编译主程序,你主程序的SWF文件将会包含模块(Module)旧的定义——而不是你已经更改过的。
程序代码mxmlc -link-report=report.xml Main.mxml
mxmlc -load-externs=report.xml ChartModule.mxml
// etc.
如果你决定使用这个技术来减小模块(Module)的大小,那么就使用接口来确保终端用户使用的总是模块(Module)的最新版本。
Flex Builder注意:Flex Builder在一个工程里没有办法做到这些。如果你确定你将要创建一个使用模块(Module)的工程,可以考虑一下将公共的类和接口(包括event 类)放到一个SWC(Flex Library Project)中然后将模块(Module)分离到它们各自的工程里。
或者,你可以将所有东西创建为一个单一的Flex工程,然后将最优化作为一个产品化前或测试前的部署步骤在Flex Builder之外进行。
总结
•将程序分割成多块并不是每个人都会使用模块(Module)。使用这种方法主程序会比平常小,而且多数用户只使用整个程序的一部分。
•使用接口来使主程序或模块(Module)来与加载的模块通信。这使维护变得容易。
•使用-link-report命令参数编译主程序来产生一个使用元件列表。
•在主程序中使用-load-externs和report.xml编译模块(Module),这样可以使它们变得更小。
示例源码
你可以下载关于这个例子的压缩文件:点击这里下载。
模块(Modules)
模 块(Module)是创建大型Flex应用程序的一个解决方案,它允许你将你的用户接口分割成许多分散的有各自用途的小块。例如(下面出自Flex 2的文档),一个保险公司可能有数百个表单——针对于各个领域的,针对各种请求类型,以及针对各种应用等等。创建一个包含所有这些表单的Flex应用程序 将会产生一个巨大SWF文件,还会有不少问题:
•应用程序越大开发过程越复杂;
•应用程序越大测试过程越复杂;
•应用程序越大部署过程越复杂;
•SWF文件越大加载时间越长
我的示例程序基于Flex 2文档中的一个程序,但是我将它做了一些更改来说明几个常见的问题。这个例子展示了一个主程序和其它三个共享公有数据的模块(Module)。
其 中一个设计要素是一个接口的使用,这个接口实质上是接口实现者和使用者之间的一个契约。这个例子将会说明我所说的意思。模块(Module)的接口部分虽 然不是必须的但是却可以大大简化以后的开发和维护。比如,如果开发人员有一个小组负责报告部分,另一个小组负责图表部分,如果它们一开始用了接口,那么只 要有需要,接口的实现就可以做足够多的变形而不会影响到工程结果。接口在模块(Module)中还扮演另外一个角色,我在下文中将会揭示这点。
模块(Module)是以<mx:Module>代替<mx:Application>作为根标签的MXML文件(或ActionScript文件)。你可以将带有<mx:Module>标签的作为一个程序来看,但是它不能运行。
这个示例有一个主程序文件以及带有一个接口的两个模块。打开主程序文件你会看到:
程序代码<mx:Panel x="10" y="41" width="169" height="500" layout="absolute" title="Modules">
<mx:Text x="10" y="24" text="Check a module to load it; uncheck to unload it" width="129"/>
<mx:RadioButton x="10" y="97" label="None" selected="true"
click="removeModule()"/>
<mx:RadioButton x="10" y="123" label="Chart"
click="removeModule();loadModule('ChartModule.swf')"/>
<mx:RadioButton x="10" y="175" label="Table"
click="removeModule();loadModule('GridModule.swf')"/>
</mx:Panel>
<mx:Panel x="187" y="41" width="500" height="500" layout="absolute" title="Module: {moduleName}">
<mx:ModuleLoader id="currentModule" ready="readyModule(event)"
width="100%" height="100%" />
</mx:Panel>
第 一个Panel包含了控制示例中模块(Module)加载和卸载的RadioButtons。第二个Panel是使用<mx: ModuleLoader>标签加载模块(Module)的地方。注意那个id为currentModule的ModuleLoader,它有一个 关于ready事件的事件处理器。当模块SWF文件加载了足够多可以开始使用的时候,ModuleLoader 就会分派ready事件(或者说ModuleEvent.READY)。
这里有一个readyModule函数,它在<mx:Script>块中:
程序代码private function readyModule( event:ModuleEvent ) : void
{
var ml:ModuleLoader = event.target as ModuleLoader;
var ichild:IExpenseReport = ml.child as IExpenseReport;
if( ichild != null ) {
ichild.expenseReport = expenses;
}
}
注 意ModuleLoader的child属性是如何转换为IExpenseReport类的。IExpenseReport是一个所有模块 (Module)都实现了的接口。只要每个模块都实现了这个接口,它就可以很容易适应于应用程序。换句话说,想象一下当你需要创建另一个表单或者报告的时 候它的用途。并不需要更改主程序为新模块添加IF语句,你只要在新模块中实现IExpenseReport接口它就可以在程序中完美地运行。
IExpenseReport接口是:
程序代码public interface IExpenseReport
{
function set expenseReport( ac:ArrayCollection ) : void;
}
每个模块(Module)都实现这个接口,定义各自的名为expenseReport的set函数。下面是ChartModule的根标签和接口IExpenseReport的实现:
程序代码<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" implements="IExpenseReport"
layout="vertical"
percentWidth="100" percentHeight="100" >
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable] public var expenses:ArrayCollection;
public function set expenseReport( ac:ArrayCollection ) : void
{
expenses = ac;
}
]]></mx:Script>
...
</mx:Module>
让我们回到主程序,RadioButton的click事件会卸载任何当前已加载的模块然后加载一个新的模块。下面是ChartModule的RadioButton标签:
程序代码<mx:RadioButton x="10" y="123" label="Chart" click="readyModule('ChartModule.swf')"/>
这个click事件会调用上面列出的readyModule事件。
编译并运行程序
如果你使用了Flex Builder 2,请确定更改了项目的Properties将模块(Module)作为"Applications"包含进来。这样Flex Builder 2回将它们编译进SWF文件并且放进bin文件夹中。
Flex Builder注意:要创建一个使用模块(Module)的工程,请使用工程的Properties将模块文件作为"Applications"。这会使得他们被编译进SWF文件。
一旦SWF文件被创建你就可以运行主程序并点击RadioButtons在模块(Module)之间切换。
Flex Builder注意:Flex Builder并不会保存任何关于模块(Module)和主程序的从属信息。只要你对一个模块(Module)作了更改,你就可能需要重新编译主程序或其它从属的模块(Module)。
将SWF文件最优化
如果你查看一下主程序的SWF文件和模块(Module)的SWF文件的话,你会发现它们的大小差不多。这就说明,模块的SWF和主程序SWF中有很多同样的组件定义。
Flash Player并不会保存元件(symbol)的副本。例如,如果主程序有一个Button组件而一个模块(Module)也有一个Button组件,Flash Player就不会从模块中加载Button了,因为它已经在主程序中有定义了。
使用-link-report=report.xml编译主程序,这样会创建一个链接到主程序的包含所有元件信息的文件。然后在编译模块(Module)的时候会使用那个report.xml文件。
程序代码mxmlc -load-externs=report.xml ChartModule.mxml
当ChartModule 被编译的时候,所有在report.xml文件中列出的元件将会在它的SWF中省略。当我不使用report.xml文件编译 ChartModule.swf的时候,它的大小是202K。而当我使用report.xml文件的时候,SWF的大小只有68K。这大大减少了模块 (Module)的加载时间。
在文章的开始将到模块(Module)的时候,我提过接口有另一个作用。假设你没有使用接口而是在主程序中 引用模块的类。当你运行link-report的时候,你的模块类将会出现在report.xml中。当你使用使用link-report编译模块 (Module)的时候你的模块并不会包含在它自己的SWF中!起初这并不会成为一个问题,尽管主程序由于包含了模块的定义而变得很大。然而,当你更改你 的模块的时候发生了什么才是重要的。如果你没有重新编译主程序,你主程序的SWF文件将会包含模块(Module)旧的定义——而不是你已经更改过的。
程序代码mxmlc -link-report=report.xml Main.mxml
mxmlc -load-externs=report.xml ChartModule.mxml
// etc.
如果你决定使用这个技术来减小模块(Module)的大小,那么就使用接口来确保终端用户使用的总是模块(Module)的最新版本。
Flex Builder注意:Flex Builder在一个工程里没有办法做到这些。如果你确定你将要创建一个使用模块(Module)的工程,可以考虑一下将公共的类和接口(包括event 类)放到一个SWC(Flex Library Project)中然后将模块(Module)分离到它们各自的工程里。
或者,你可以将所有东西创建为一个单一的Flex工程,然后将最优化作为一个产品化前或测试前的部署步骤在Flex Builder之外进行。
总结
•将程序分割成多块并不是每个人都会使用模块(Module)。使用这种方法主程序会比平常小,而且多数用户只使用整个程序的一部分。
•使用接口来使主程序或模块(Module)来与加载的模块通信。这使维护变得容易。
•使用-link-report命令参数编译主程序来产生一个使用元件列表。
•在主程序中使用-load-externs和report.xml编译模块(Module),这样可以使它们变得更小。
发表评论
-
Apache FlexJS 0.0.1 和 Apache Flex FalconJX 0.0.1发布
2015-11-01 19:44 527原文地址:http://note.sdo.com/u/634 ... -
Flash Catalyst 常用键盘快捷键
2011-03-28 15:38 1029转自:http://www.riameeting.com/ ... -
8款很实用的Actionscript写的位图(BitMap)操作类
2011-03-24 12:09 1905AS3 Scale9 Bitmap ... -
VC++ 项目中使用 FLEX
2011-03-24 09:13 19211, http://hi.baidu.com/qinpc/ ... -
flex应用开发/flash应用开发 代做flash作业/flex作业
2011-01-09 20:37 347专业承接flex应用开发/flash应用开发 ... -
脑袋里的秘密,输入姓名就可以知道你在想什么! flex版
2010-12-29 11:34 2512输入名字就可以知道她/他在想什么的工具~~ -
一个flex聊天机器人
2010-12-18 10:42 1640无聊之下所作,供大伙娱乐,随边聊聊。。。 -
Flex:基于Flex-config.xml的命令行编译
2009-07-01 09:33 1859关键字: Flex Flex2 编译 mxmlc ... -
抽出flash与java 用AMF交互代码
2009-06-30 15:09 3632最近做的一个java 与flash通讯的项目,由于项目框 ... -
BulkLoader类和PV3D
2009-06-26 17:02 1937AS3取消了movieclip的loader类,所以加 ... -
使用 Flex Builder 3.x 分析工具 Profile
2009-06-25 11:26 3374前言 关于分析工具 (原文见Flex Builder ... -
AMF3+JAVA的调用范例
2009-06-24 17:44 2526[AS3]AMF3+JAVA的调用范例 amf是Ad ... -
Flex 程序性能测试
2009-06-24 16:02 1918Flex 程序性能测试 作者:叶晖俊 yehui ... -
Flex RemoteObject类参考
2009-06-19 11:39 1213<mx:RemoteObject>标记 ... -
flex画的菱形
2009-05-11 16:19 3420package com { impo ... -
理解 Flex itemRenderer - 第 4 部分: 状态和过渡
2009-05-08 09:23 1685itemRenderer 最擅长与应用 ... -
理解 Flex itemRenderer - 第 5 部分: 效率
2009-05-08 09:21 1735如果您要显示大量 itemRenderer-无论在 Dat ... -
VO to XML converter
2009-05-04 09:00 1116private function convertToXM ... -
Flex全屏
2008-09-26 11:11 1762private function goFullScreen( ... -
ExternalInterface在Firefox下出错的bug
2008-09-16 09:28 3151使用Document Class为避免命名空间冲突,通常会取消 ...
相关推荐
使用此Gradle插件,即使它依赖于自动模块,您也可以毫不费力地创建模块化应用程序的自定义运行时映像。 该插件还允许您使用Java 14中引入的工具创建应用程序安装程序(有关用法示例,请参见 )。 :light_bulb: ...
Badass运行时插件使用此Gradle插件,您可以为非模块化应用程序创建自定义运行时映像。 该插件还允许您使用Java 14中引入的工具创建应用程序安装程序。 :light_bulb: 对于模块化应用程序,请使用。 该插件提供了一些...
它是模块化的,因此您可以将该项目用作基础并构建自己的模块。 您可以在任何基于Laravel Starter的项目中使用相同的模块。 定期添加新功能。 请让我知道您的反馈和意见。演示版检查以下演示项目。 这只是项目的直接...
LabVIEW的一种非标自动化软件通用程序框架,它提供了一种模块化的方法来快速开发应用程序。通过配置表格,可以实现逻辑判断、循环跳转、变量新建等功能,而无需修改程序代码。这种方法使得设备开发变得更加快速,从...
这个代码是一个使用Java模块化系统构建MVC应用程序的例子。MVC是Model-View-Controller的缩写,是一种常见的软件架构模式,用于将应用程序分成三个部分:模型(Model)、视图(View)和控制器(Controller)。 在这...
, 《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。...
, 《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。...
ExeBuilder 是一款利用 JDK 模块化的特性帮你把 jar 打包成独立 exe 的工具,它支持 GUI 和控制台应用程序的创建
JavaFX的模块化应用程序框架基于: OSGi : OSGi是用Java编写模块化软件的事实上的标准。 Maven(POM优先) : Drombler FX应用程序可以使用Maven构建。 构建遵循标准的POM优先方法(将为您生成OSGi元数据)。 ...
编写模块化代码几乎总是一个好主意,无论是为Windows、实时还是FPGA设备设计应用程序。子VI使代码更易于调试和故障排除,更易于记录和跟踪更改,并且通常更清晰,更易于理解,更可重用。LabVIEW FPGA子VI示例如图...
digital-maker-space:发布,创建和共享ccm组件和模块化应用程序的地方
基于PRISM-Library和MahApps.Metro工具箱的模块化应用程序的示例,该工具包用于创建都市风格的现代UI WPF应用程序。 Prism是用于在WPF中构建松耦合,可维护和可测试的XAML应用程序的框架。 Prism提供了一组设计模式...
具有DDD的模块化Monolith Java应用程序示例。 在计划中,此应用程序将移至微服务架构。 1.此应用程序的目标 具有DDD实现的模块化整体结构; 正确分离有限的上下文; 有界上下文之间的通信示例; 简单的CQRS实现...
该项目展示了使用 Django 框架创建模块化应用程序。 这是一个非常简单的 ERP 系统,包含 3 个模块:HR、销售和财务。 人力资源模块处理工作机会、申请、员工及其工资。 销售模块存储有关客户和销售给他们的产品的...
Dragonfly是一个简单的消息传递系统,可以帮助程序员快速创建模块化的分布式应用程序。 它隐藏了套接字编程和数据转换的复杂性,并且在每种受支持的编程语言(C ++,C#,Python,Matlab)和操作系统(Windows,...
《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。...
定义一系列步骤,并将它们链接在一起以创建模块化应用程序。目录完整的文档可以在这里找到: 安装在命令行中: pip install pipelayer入门步骤1:建立筛选器hello_world_filters.py from pipelayer import Filter...
动态创建模块化应用程序 自动生成RESTful资源 在新旧GrydScaffold版本之间切换 帮助菜单根据可用命令进行更改 自由修改GrydScaffold的本地安装以用于新生成的项目 安装 npm install - g gryd - cli //On first use...
1.5 我的第一个.net应用程序13 1.6 本章 小结17 第2章 visualbasic.net编程基础18 2.1 基础编程知识18 2.1.1 关键字及标识符18 2.1.2 数据类型20 .2.1.3 变量与常量24 2.1.4 自定义结构体26 2.1.5 数组27 2.1.6 ...