`
ruilin215
  • 浏览: 1103808 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Qomolangma实现篇(四):基本特性增强与多投事件系统

阅读更多

================================================================================
Qomolangma OpenProject v1.0


类别 :Rich Web Client
关键词 :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component,
DOM,DTHML,CSS,JavaScript,JScript

项目发起:aimingoo (aim@263.net)
项目团队:aimingoo, leon(pfzhou@gmail.com)
有贡献者:JingYu(zjy@cnpack.org)
================================================================================


一、Qomolangma对JS基本特性的增强
~~~~~~~~~~~~~~~~~~

为了实现更为丰富的OOP特性,Qomo增强了JavaScript的一些基础特性。这主要表现在:
- 对JS基本类型系统(的方法)的增强
- 支持多投事件

这其中,对基本类型系统的增强,将严格恪守一条原则:不修改Object()对象原型。

除了array.indexOf()、array.remove()、string.trim() 等常见的增强之外,Qomo有
几项特性是与其它可能(可能)不一致的。这几项内容随后列一专题来讲述:
- Array.prototype.insert
- String.prototype.format
- Function.prototype.toString

此外,因为Qomo以后将提供与Altas相同的、基于vs.net的可视编辑特性,因此一些基
本的特性扩展参考或者拷贝了Altas的代码。但这些代码目前只是留在了JSEnhance.js
中而未被启用。你可以不关注它们。

在Mozilla系列的浏览器环境中,提供了一个uneval()函数,这个函数用于序列化脚本
对象,在今后的开发中很有价值。但它被放在了Compat\common_ie6.js中。这里也只提
及它,而不分析它的实现。


二、JSEnhance.js中部分增强特性
~~~~~~~~~~~~~~~~~~

首先,请记住JSEnhance.js最主要的特性是“它可以脱离Qomo framework使用”。这个
单元不依赖于Qomo的任何特性。它使用自然的、原始的JavaScript方法来扩展JS特性。
因此它可以用于任何的Framework。

Array.prototype.insert
----------
Qomo中为array.insert()提供了更强大的能力,使得它可以向任意位置插入数组、单
个或多个元素。这与一些其它的框架不同:它们通常只提供插入单个元素的能力。

String.prototype.format
----------
Qomo中的string.format()是参考Delphi实现的。因此你会到匹配符是“%s”和“%n”。
这里的“s(大小写均可)”用于指代一个被替换元,而“n(0..n)”用于指代第n个替换元。

由于在JS中没有明确的类型,因此没有"%d"之类的匹配符。

作为习惯,我提供了一个全局的函数:format()。

关于string.format()的使用,参见DOCUMENTs/TestCase/T_StringFormat.html。

Function.prototype.toString
----------
在JavaScript中,匿名函数(立即值)声明、函数对象构造、函数的标准语法声明等都
可以声明一个有效的函数。但这些函数的toString()并不一致。为了解决对函数名的依
赖性问题,并使得下面的语法总有确定的含义:
function func() { /* ... */ };
foo = eval(func.toString());
Qomo复写了function.toString()。使得它总是返回一个匿名函数的字符串。如(上例):
function () { /* ... */ };


三、JSEnhance.js中的多投事件系统
~~~~~~~~~~~~~~~~~~

首先,最重要的一点是:Qomo的多投事件系统对任何框架来说,是“完全透明”的!因
此,它可以在其它任何框架中,象一个普通的事件函数(响应句柄)一样地加入被植入。
事实上,Qomo的多投事件与Qomo OOP框架完全地脱离开,不利用任何的OOP特性、框架特
性。——这种设计思路完整地体现了Qomo的目标与宗旨,以及,我们对OOP的认知。

下面的代码展示Qomo中的多投事件系统的特性:
----------
e = new MuEvent();

document.writeln(typeof e, '<BR>');
for (i in e)
document.writeln(' - ', i, '<BR>');
----------

输出结果:
----------
function
- add
- addMethod
- clear
- reset
- close
----------

这表明“多投事件对象,实际上是一个函数”,它提供“add()等五个方法”。

由于“多投事件对象是函数”,因此下面的代码是成立的:
----------
func1 = func2 = function() { /* ... */ };

function MyObject() {
this.OnExec = new MuEvent();

this.run = function() {
// do somethings
this.OnExec();
}
}

var obj = new MyObject();
obj.OnExec.add(func1);
obj.OnExec.addMethod(window, func2);
obj.run();
----------

这个例子用最简的代码演示了多投事件对象的使用。你看到我们最终仍然要通
过某种方式来使OnExec()被执行。只不过它被执行的时候,将同时触发func1和
func2两种行为。


1. add(), addMethod()
----------
在多投事件对象的方法中,addMethod()第一个不容易理解的东西。但我们需
要了解到:使用add()加入的func1,执行期拿到的this对象会是obj本身;而使
用addMethod()加入的func2,执行期拿到的this对象将是window对象。

这有什么意义呢?

例如setTimeout()这样的函数在执行期只允许传入函数,而不能传入对象方法。
这就使得定时执行一个对象方法的代码只能这样写:
----------
function doTimer() {
obj1.call();
obj2.call();
}
setTimeout(doTimer, 1000);
----------

在使用MuEvent()的情况下,上面的代码就可以很简单了:
----------
var e = new MuEvent();
e.addMethod(obj1, obj1.call);
e.addMethod(obj2, obj2.call);

setTimeout(e, 1000);
----------

addMethod()在Atlas里被称为addAction()。这两者的含义是一致的。成熟的多
投事件系统通常都会提供这种特性。


2. clear()与reset()
----------
Qomo提供clear()方法来清除与该多投事件对象绑定的“事件句柄列表”。而
reset()则在清除之后再添加一个“事件句柄”。由于MuEvent对象也是函数,因
此下面的代码也可以添加一个事件投送列表:
----------
var e1 = new MuEvent();
var e2 = new MuEvent();

// ...
// add somethings to e1

e2.add(func1);
e2.add(func2);
e2.add(func3);

// clear e1, and add a list(e2)
e1.reset(e2);
----------


3. close()
----------
Qomo提供一种非常特殊的“关闭多投特性”的机制。——注意这在其它的框架
上都没有实现。

Qomo的多投事件对象是一个普通的函数,只不过它多了add()、addMethod()等等
方法。如果我们清除掉这些方法,那么该对象的外在表现就与一个普通函数完全
无异。这种情况下,一个第三方的框架根本无法识别这个“关闭多投特性的‘多
投事件对象’”,而当成一个普通函数处理。

因此Qomo的多投特性可以完全透明地嵌入一个第三方框架。甚至象DOM这样的浏览
器基础系统。例如下例:
----------
var loading = new MuEvent();

loading.add(loadPicture1);
loading.add(loadPicture2);
loading.add(loadPicture3);
// ...
loading.add(loadPicture1000);

loading.close();
window.onload = loading;
----------
这种情况下,浏览器的DOM框架完全感觉不到loading(作为一个函数)有什么不同。

Qomo提供的close()特性的作用远不至此。事实上,close()特性真正的价值在于对
系统设计层面的考量。例如我们做一个TLabledEdit对象,也就是将一个Lable与一
个Edit绑在一起。那么我们发现,我们事实上对Lable.onclick的行为的理解,肯定
是“选中Edit并置输入焦点”。这种行为特征在设计之初就被确定了,根本不应该
被更改。——当然,如果你的设计就是要更改,那另论。

而原始的TLable的设计中,TLable.onclick是一个公开的方法,并且是多投事件。
那么即使我们写下下面的代码:
----------
FLabled.onclick.addMethod(FEdit, FEdit.onclick);
----------
在其后的、用户的代码中仍然可以改变FLabled.onclick的行为。例如add/clear()。

这显然是这个TLabledEdit组件的原始设计者所不希望的。因此,在提供了close()
特性的情况下,它就可以在上面的代码中这样写:
----------
// 当创建结束调用
this.DoCreate = function() {
FLabled.onclick.addMethod(FEdit, FEdit.onclick);
FLabled.onclick.close();
}
----------
这样就可以保证onclick()的特性不被变更。而且,如果FEdit.onclick被变量(例
如add/reset),FLabled.onclick可以正常地感知到。


4. 为什么不提供del()
----------
Qomo的多投事件不提供del()特性。基于两个原因:
- del()可能导致事件的激活顺序被破坏
- del()需要执有内部“事件句柄列表”中的事件方法的引用,这破坏了封装性

因此,(在目前的版本中,)作为一项框架设计层面上的考量,Qomo不提供del()。但
是,由于atlas的多投事件有del()方法,因此在将来实现嵌入vs.net的代码时,Qomo
是可能会提供del()方法的。


四、多投事件系统的实现分析
~~~~~~~~~~~~~~~~~~

1. 基本的多投事件系统
----------
最基本的多投事件系统实现方法是这样:
----------
function MuEvent() {
// this is a new obj instance
var all = this;
all.length = 0;

function add(foo) { /* ... */ }
function addMethod(obj, foo) { /* ... */ }
function clear() { /* ... */ }
function reset(foo) { /* ... */ }
function run() { /* ... */ }

var e = function() { return run.call(this, arguments) }
e.add = add;
e.addMethod = addMethod;
e.clear = clear;
e.reset = reset;

return e;
}
----------

这样实现的看起来很简单、自然。而且由new()关键字构造的对象实例this已经被
内部变量all执有了一个引用,用以建立事件列表。避免了不必要的开销。看起来
是不错的。——自然close()方法的实现也很容易,不成问题。

但是这种情况下,我们对比多个事件对象,会发现一个不可接受的事实:
----------
var e1 = new MuEvent();
var e2 = new MuEvent();

alert(e1.add === e2.add)
----------
你会发现结果是false,也就是说:有多少个事件对象,就会有多少个add、clear
方法。其开销极其巨大:n * 5。


2. Qomo中多投事件系统的实现基础
----------
在Qomo里,这一切被巧妙地避免了。我为每一个事件对象建立了一个handle。它
是一个索引。
----------
function _MuEvent() {
// get a handle and init MuEvent Object
var handle = all.length++;

//...
----------
为了让add()等方法成为“唯一实例”,我将它放在了_MuEvent()之外来实现。但
这种情况下,对象执有的handle对add()方法就是不可见的了。因此我们还需要一
种机制,来使对象可以向add()等方法暴露handle。这里,我们选用了valueOf()。

对于函数(多投事件对象)ME来说,它的valueOf()的结果指向自身:ME。在大多数
的情况下,这是没有意义的。因此我们这样来实现valueOf():
----------
ME.valueOf = function() {
return handle
};
----------

而在add()中,我们这样来使用valueOf():
----------
var all2 = []; // all ME() object for recheck.

function add(foo) {
var i=this.valueOf(), e=all[i];
if (e && e==all2[i]) {
// add...
}
}
----------

由于我们使用了第二个数组all2来复核,因此可以避免用户使用这样的代码来套
取、破坏多投事件列表:
----------
// if e1's handle is 10, and hide into a Object/System
var e1 = new MuEvent();

// 套取用的函数
f = function(){};

// 指定欲套取的句柄
f.valueOf = function() { return 10 }

// 重置(注意所有的多投事件对象的方法是相同的)
f.clear = (new MuEvent()).clear;

// 破解e1的事件列表(利用valueOf()返回10的特性)
f.clear();
----------

所以这样来看,加入数组all2[]来复核是必须的。


3. “强壮”与“快”是两难的
----------
但接下来,我们也发现这个“多投事件系统”是不“强壮”的。为什么呢?因为
valueOf()仍然可以被外部代码改写。——这将导致依赖它来获取handle的add()
等方法失效。事实上,由于我们重定义了valueOf()的含义,也使得Qomo与一些第
三方的框架、系统中可能出现不兼容。

Qomo应当是一个强壮的系统。由于valueOf()的存在,影响了强壮性,也使“透明”
成为空话。

我们回到前面这个all2[]。事实上,由于复核的必要,我们已经存放了一份所有对
象的列表。因此,不通过handle来查找ME和事件列表对象,是可能的:
----------
function add(foo) {
var e = all.search(this);
if (e) {
// ...
}
}
----------
在这个代码中,我们需要在all.search()其实被设计成一个算法,用于在all2[]中
查找this对象(也就是ME()函数)。而search()返回的,则是“使用all2[]中this对象
的索引”,在all[]中查找到的“投送事件列表”。——这个索引其实就是handle。

这样,就不需要重写ME().valueOf()来公布handle了。但是,由于每次add()等操作
都将查找all2[],使得系统会相对慢一些。——简单的说:强壮了,但慢了。

所以整个MuEvent的实现代码是这样:
----------
var MuEvent = function (fast) {

var all = {
length : 0,
strong : !fast, // ^.^
// ...
}

return _MuEvent;
}(true);
----------

简单地说,上面的一行代码真实的反映了:强壮就不快,快就不强壮。


4. 真的不快吗?
----------
简单地分析一下我们在使用事件系统时候的一些特点,我们会发现:
- 事实上通常我们会成批地添加一个事件,或者一个对象的一组事件
- 事实上相关的对象、事件总是被“在临近时间上”被处理的

例如我们通常会在对象初始化的时候写这样的代码:
----------
obj.onclick.add(foo1);
obj.onclick.add(foo2);
obj.onmouseout.add(foo3);
----------

而在多投事件体系中,同一对象的OnXXXXX事件通常是连续被创建的,而且刚刚完成
创建的事件对象可能会被赋以一些初值。简单的讲,这些使用习惯表现为:
- 最近创建的事件总是可能会被很快操作到
- 最近操作的事件附近的(同一对象的)事件总是可能会被很快操作到

基于这两个原理。Qomo设计了一个在all2[]中查找事件对象的方法:总是从上一次
添加或查找到的事件对象的附近,开始前向、后向检索。具体的算法参见all.search().

加入检索算法使得add等行为的速度大大的加快。当然,这是基于开发人员的代码行
为分析的,而真正的“在数组中检索对象”的方法的效率并没有办法提高。这是JS自
身无可回避的问题。

但是,如果引用hash或者使用对象属性名来检测,则必然要给ME()对象一个“可在外
部访问的key/name值”。这又回到了前面提供handle的“fast方法”同样的问题上。
因此这样的问题,是不必要再讨论的。

Qomo的JSEnhance.js中,默认采用"fast = false"的配置,以提供一套强壮的系统。但
如果你确信你的系统是封闭的、不会导致第三方的框架的影响的,那么你可以在JSEnhance
中开启下面这个开关:
----------
var MuEvent = function (fast) {
// ...

return _MuEvent;
}(false); // <-- here, set to true
----------

最后,最重要的一点提示,是Qomo在这个多投事件系统上的效率牺牲,只会表现在add
等方法的调用上。并不会对ME()事件的执行构成任何的影响。因为在代码上:
----------
function _MuEvent() {
// get a handle and init MuEvent Object
var handle = all.last = all.length++;

var ME = function() {
if (all[handle].length > 0) // <--- 直接使用handle
return run.call(this, handle, arguments)
}

//...
}
----------
由于ME()的执行可以直接使用内部的handle变量,根本就不会调用all.search()。因此
Qomo只是在“维护事件投送列表(add/reset等)”时有一些search()的性能开销。“执行
投送事件”时,是性能最优化的。

分享到:
评论

相关推荐

    英语人教八年级下册UnitaQomolangmaPPT课件.pptx

    英语人教八年级下册UnitaQomolangmaPPT课件.pptx

    大学生创新创业训练计划经验分享.zip

    大学生创新创业训练计划(以下简称为“大创计划”)是一项旨在提升大学生创新能力和创业精神的实践活动。通过这项计划,学生可以在导师的指导下,自主开展研究性学习和创业实践。下面我将分享一些关于大创计划的经验和建议。

    node-v12.22.3-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    毕业设计-The coding solutions of Leetcode and 剑指Offer using .zip

    这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、文件或源码,可以用于毕业设计、课程设计的应用、参考和学习需求,请放心下载。 祝愿你在这个毕业设计项目中取得巨大进步,顺利毕业! 但还需强调一下,这些项目源码仅供学习和研究之用。在使用这些资源时,请务必遵守学术诚信原则和相关法律法规,不得将其用于任何商业目的或侵犯他人权益的行为。对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦!

    【微信小程序毕业设计】宠物店商城系统开发项目(源码+演示视频+说明).rar

    【微信小程序毕业设计】宠物店商城系统开发项目(源码+演示视频+说明).rar 【项目技术】 微信小程序开发工具+java后端+mysql 【演示视频-编号:282】 https://pan.quark.cn/s/cb634e7c02b5 【实现功能】 本系统实现的是和宠物相关的信息管理和发布,加入了商品销售的功能。操作角色为管理员和用户、商家,管理员的功能为用户管理、商家管理、宠物分类管理、宠物信息管理、商品分类管理、宠物用品管理、项目类型管理、服务项目管理、宠物日志管理、订单管理等;用户的功能为购买宠物、商品、预约服务发表日志管理订单等。商家功能为提供宠物、宠物用品、宠物服务,管理订单和服务预约等。

    雷迪森的工具包(95分以上课程大作业).zip

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    node-v9.10.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于B2C的网上拍卖系统_秒杀与竞价.zip

    基于B2C的网上拍卖系统主要用于帮助人们应用互联网方便快捷买到自己所中意的商品,并参与到秒杀与竞拍当中。 主要功能包括: 1.前台模块 (1)普通用户登录/注册。 (2)分类查看商品(普通商品与促销商品) (3)查看商品详细信息 (4)查看秒杀商品 (5)查看竞拍商品 (6)将商品加入购物车 (7)购买,结算功能 (8)留言 2.后台模块 (1)修改密码 (2)商品管理: -- 编辑/删除 -- 设置/取消促销 (3)秒杀商品:设置/取消秒杀 (4)竞拍商品:设置/取消竞拍 (5)订单管理:查看订单 (5)留言管理:查看/删除留言 项目访问路径: 前台:http://localhost:8080/sale 后台:http://localhost:8080/sale/user/adminlogin

    【前端素材】大数据-政务大数据共享交换平台.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    【前端素材】大数据-气象预报大数据平台.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    数学模型算法多目标决策分析方法.pptx

    数学模型算法

    ############ 光电传感器的描述

    光电传感器

    node-v12.17.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Web开发工具和方法课程的学术项目Java、Spring、Hibernate、Angular

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    云计算基础课件—云安全dr.pptx

    云计算基础课件—云安全dr.pptx

    jizu3.cod

    jizu3.cod

    线性规划模型及应用中的整数规划讲义.pptx

    数学模型算法

    JAVA毕业设计之医疗挂号管理系统(springboot+mysql)完整源码.zip

    医疗挂号管理系统是一款基于Spring Boot和MySQL的Java毕业设计项目,旨在为医院提供一个高效、便捷的挂号管理解决方案。该系统采用了当下流行的微服务架构,通过Spring Boot框架实现快速开发和部署,同时使用MySQL数据库进行数据存储和管理。 在技术方面,本项目主要使用了以下技术: Spring Boot:一个基于Spring框架的快速开发工具,可以简化项目的搭建、配置和部署过程,提高开发效率。 MySQL:一款开源的关系型数据库管理系统,用于存储和管理医疗挂号管理系统中的数据。 MyBatis:一款优秀的持久层框架,用于实现Java对象与数据库之间的映射关系,简化数据库操作。 Redis:一款高性能的键值对缓存数据库,用于缓存系统中的热点数据,提高系统性能。 Bootstrap:一款前端UI框架,用于构建响应式的用户界面,提高用户体验。 jQuery:一款轻量级的JavaScript库,用于简化前端开发,实现动态效果和Ajax交互。 在功能方面,医疗挂号管理系统主要包括以下模块: 用户注册与登录:用户可以注册并登录系统,创建个人账户。 医生信息管理:管理员可以添加、修改和删除医生信息,包括姓名、职称、科室等。 挂号管理:用户可以选择医生和就诊时间进行挂号,支持在线支付挂号费用。 挂号记录查询:用户可以查看自己的挂号记录,包括挂号时间、医生信息等。 取消挂号:用户可以在规定时间内取消挂号,系统将退还挂号费用。 预约提醒:系统会在预约就诊前通过短信或邮件提醒用户。 统计报表:管理员可以查看系统的挂号统计数据,包括每日挂号人数、各科室挂号人数等。 通过这些功能,医疗挂号管理系统为医院提供了一个便捷、高效的挂号管理解决方案,有助于提高医疗服务质量和患者满意度。

    基于C++ QT的航空订票系统 .zip

    基于QT的系统

    线性规划模型及应用中的单纯形方法讲义.pptx

    数学模型算法

Global site tag (gtag.js) - Google Analytics