随着前台开发日益受到重视,客户端代码比重日益增加的今天,如何在javascript开发里应用MVC模式,这个问题似乎会一直被提到,所以偶在这里粗略的谈一下自己的看法吧。
MVC模式的基本理念,是通过把一个application封装成model, view和controller三个部分达到降低耦合,简化开发的目的。这么说很空洞,大家可以实际看个例子:
<select id="selAnimal">
<option value="cat">cat</option>
<option value="fish">fish</option>
<option value="bird">bird</option>
</select>
<p id="whatDoesThisAnimalDo"></p>
<script type="text/javascript">
document.getElementById('selAnimal').onchange = function() {
var thisAnimalDoes;
switch ( this.value ) {
case 'cat':
thisAnimalDoes = "cat meows";
break;
case 'fish':
thisAnimalDoes = "fish swims";
break;
case 'bird':
thisAnimalDoes = "bird flies";
break;
default:
thisAnimalDoes = "wuff?";
}
document.getElementById('whatDoesThisAnimalDo').innerHTML = thisAnimalDoes;
}
26</script>
这个小程序会把你从下拉菜单"selAnimal"中选择的动物能做什么事回显到网页上。以上是没有应用任何设计模式和编成思想写出的代码。如果要在这里应用MVC模式,代码又会变成怎样的呢?
<select id="selAnimal">
<option value="cat">cat</option>
<option value="fish">fish</option>
<option value="bird">bird</option>
</select>
<p id="whatDoesThisAnimalDo"></p>
<script type="text/javascript">
// whatDoesAnimalDo 就是一个controller
var whatDoesAnimalDo = {
// 选择视图
start: function() {
this.view.start();
},
// 将用户的操作映射到模型的更新上
set: function(animalName) {
this.model.setAnimal(animalName);
},
};
// whatDoesAnimalDo的数据model
whatDoesAnimalDo.model = {
// animal的数据
animalDictionary: {
cat: "meows",
fish: "swims",
bird: "flies"
},
// 当前的animal,也就是这个application的状态
currentAnimal: null,
// 数据模型负责业务逻辑和数据存储
setAnimal: function(animalName) {
this.currentAnimal = this.animalDictionary[animalName] ? animalName : null;
this.onchange();
},
// 并且通知视图更新显示
onchange: function() {
whatDoesAnimalDo.view.update();
},
// 还需要响应视图对当前状态的查询
getAnimalAction: function() {
return this.currentAnimal ? this.currentAnimal + " " + this.animalDictionary[this.currentAnimal] : "wuff?";
}
};
// whatDoesAnimalDo的视图
whatDoesAnimalDo.view = {
// 用户输入触发onchange事件
start: function() {
document.getElementById('selAnimal').onchange = this.onchange;
},
// 该事件将用户请求发送给控制器
onchange: function() {
whatDoesAnimalDo.set(document.getElementById('selAnimal').value);
},
// 视图更新显示的方法,其中视图会向model查询当前的状态,并将其显示给用户
update: function() {
document.getElementById('whatDoesThisAnimalDo').innerHTML = whatDoesAnimalDo.model.getAnimalAction();
}
};
whatDoesAnimalDo.start();
60</script>
……突然一下代码变得好夸张e
——偶都还没有在里面实现观察者模式呢
实在太不良好了。
这样就带出了MVC模式最大的诟病:在简单的系统中应用MVC模式,会增加结构的复杂性,并且降低效率。
所以偶觉得除了少数javascript控件,比如click-anywhere-to-edit datagrid/tree control, 或者FckEditor/tinyMCE这样的支持自定义plugin的富文本编辑器非常适合应用MVC之外,在大多数的实用B/S 系统中,javascript开发只要遵循工厂模式就足够让你受益匪浅了。这是由于前端开发和后段开发的性质不同引起的。如果在ASP.net或者JSP 项目中应用MVC模式,SDK或多或少会自动生成一些view和controller的代码。但是javascript呢——javascript甚至连 个好用的SDK都没有,虽然有不少成熟的framework,但最终还是会大大增加开发量。
与开发量相比,更加令人头疼的是效率的问题。三层之间的相互通信都是额外的开销。对于服务器端,这些通信造成的开销几乎可以忽略不计。但对于 javascript这样相对低效率的语言,多几重调用和事件侦听就能明显感觉到性能的下降了。而且,因为javascrip的闭包特性,一不小心就搞出 内存泄漏,这可是正宗的偷鸡不成蚀把米了
所以,对于javascript开发,适度开发可能比应用你所学到的学术知识更重要,毕竟前端开发是以解决实际问题为基础,而不是为了炫技。当然,Dflying gg有句话叫“重构无处不在”——如果你觉得你自己的代码越来越乱,维护起来越来越困难,那么,你就该考虑是不是该用MVC重构一下了~
再额外的说一句:是不是整个前端开发就不必使用MVC了呢?no no~ 其实整个前端开发就是一个大大的MVC架构啊——
Model: HTML/XHTML中的信息
View: Style sheet
Controller: EMAScripts等等脚本
这不正是web标准的最终目的么
所以,把握好整个前端代码的结构,永远比在javascript开发中过量应用设计模重要的多!
分享到:
相关推荐
本文将详细介绍MVC模式的工作原理,并指导如何在JavaScript中实现一个简单的MVC框架。 在JavaScript中实现一个简单的MVC框架可以帮助你更好地理解MVC模式的工作原理,并为你的Web应用程序提供一个结构化的方法。通过...
本实例主要探讨如何在JSP中应用MVC模式进行开发,特别适合初学者学习。 **一、MVC模式介绍** MVC模式是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种...
在这个场景中,我们讨论的是一个基于JavaScript实现的验证框架,该框架应用了MVC模式来处理Web表单的验证。 **描述分析:** 虽然描述部分是空的,但根据提供的博客链接(https://largestone.iteye.com/blog/577323...
### MVC模式在WEB开发中的应用 #### 一、引言 随着互联网技术的快速发展,特别是Web 2.0时代的到来,Web应用变得越来越重要。这一时期不仅见证了Flash技术和JavaScript等传统技术的新应用,而且Web应用的用户体验...
本文主要介绍了基于JavaScript MVC模式的Wiki设计与实现,讨论了MVC模式的优点、Wiki系统的设计与实现,并对JavaScript在Wiki系统中的应用进行了深入分析。 知识点: 1. Wiki系统是一种超文本实现的技术,用以实现...
在本工程中,我们将深入探讨ExtJS 4.0的MVC模式,以及如何通过controller、view、model和store来构建应用。 **1. MVC模式** MVC模式是一种软件设计模式,将应用程序分为三个主要组件:模型(Model)、视图(View)...
在MVC模式中,视图通常由HTML、CSS和JavaScript组成,用于渲染页面和提供用户交互。 3. **控制器(Controller)**:控制器作为模型和视图之间的桥梁,处理用户的输入并调用模型进行数据处理,然后根据需要更新视图...
**JavaWeb MVC模式详解** JavaWeb开发中的MVC(Model-View-Controller)模式是一种...通过学习这个实例,开发者可以深入理解JavaWeb中MVC模式的运用,从而更好地掌握Web开发技能,为构建复杂的应用打下坚实的基础。
在MVC模式中,控制器生成验证码图片并将其存储到session中,同时返回给客户端。当用户提交时,服务器会检查输入的验证码是否与session中存储的匹配。 **4. MD5算法** MD5(Message-Digest Algorithm 5)是一种广泛...
对于复杂的应用程序来说,采用MVC模式能够显著提升开发效率并降低后期维护的成本。希望以上的解析能够帮助您更好地理解MVC模式及其在实际项目中的应用方式。如果所提供的“MVC模式图”存在疑问,建议结合以上介绍的...
在MVC模式中,JSP常用于创建视图。在本例中,JSP页面可能包含了用于显示计算器界面的HTML结构,以及用于处理用户点击事件的脚本let或JSP标签。 **JSP计算器的实现流程**: 1. 用户通过浏览器请求JSP页面,页面加载...
3. **Controller(控制器)**:控制器是MVC模式中的中介,它接收用户的请求,调用模型进行处理,然后将结果传递给视图。在JSP项目中,控制器通常由Servlet或JSP页面实现。例如,一个用户注册的控制器Servlet会接收...
**MVC模式** MVC(Model-View-Controller)模式是一种广泛应用在Web开发中的软件设计模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。这种分离使得代码结构清晰,易于...
通过这个项目,学习者可以深入理解MVC模式在实际Web开发中的应用,掌握JSP技术,以及如何组织和管理一个Web应用的结构。同时,这也为日后进一步学习Spring MVC、Struts等更先进的MVC框架打下基础。
总的来说,"基于MVC模式下的登录注册"项目展示了如何在Web开发中利用MVC模式来分离关注点,提高代码的可维护性和可扩展性。通过合理划分模型、视图和控制器的职责,我们可以更有效地组织和管理代码,同时提供更直观...
总的来说,【基于MVC模式的投票系统】是一个涵盖多方面技术的项目,它涉及到了Web开发的多个核心领域,包括数据库设计、前端开发、后端编程以及软件工程的实践。通过这样的项目,开发者可以提升自己的全栈开发能力,...
通过分析和学习这个项目,开发者不仅可以了解MVC模式的工作原理,还可以掌握如何在MyEclipse中进行Java Web应用的开发。此外,也可以深入研究数据库交互、表单验证、用户认证等附加功能,以提升自己的技能。