1 名词解释

桐花万里丹山路,雏凤清于老凤声——唐·李商隐《韩冬郎既席为诗相送因成二绝》

作为一种有别传统的前端编程方法,雏风名之。
面向数据的编程方法,避开繁琐的ui代码,直接针对前端数据模型编程,你的程序就能更加清晰简单。清音名之。

2 从实例开始

避免过于枯燥的陈述,我们从实例开始,我们以百度 WebIM分组管理为例。

这里面,我们需要对用户分组列表执行:添加、删除、修改、保存、取消、排序等六种功能。

这算是一个比较常见的需求,那么,我们通常在前段实现这种功能,一般如何设计?多少代码?多长时间?

思考时间……………………….

===================================================

好了现在我们来展示一中简单的实现方式:

程序代码:

  1. var data = {    "list": [    {        "id": 1,        "name": "我的分组1"    },    {        "id": 2,        "name": "我的分组2"    },    {        "id": 3,        "name": "我的分组3"    },    {        "id": 4,        "name": "我的分组4"    }    ]  } var action = {    sort: function(list, inc) {        $("sort").className = inc ? "down": "up";        list.sort(function(a, b) {            return (inc ? 1: -1) * a.name.localeCompare(b.name);         });        render(data);     },    create: function(name) {        data.list.push({            id: +new Date(),            name: name        });        render(data);     },    edit: function(id) {        each(data.list,        function(value, i) {            data.list[i].state = value.id == id ? "edit": "normal";         });        render(data);     },    del: function(id) {        each(data.list,        function(value, i) {            if (value.id == id) {                data.list.splice(i, 1);             }         })        render(data);     },    save: function(id) {        each(data.list,        function(value, i) {            if (value.id == id) {                value.name = $("g_" + id).value;                value.state = "normal";             }         });        render(data);     },    cancel: function(id) {        each(data.list,        function(value, i) {            data.list[i].state = "normal";         });        render(data);     }  } function $(id) {    return document.getElementById(id);  } function each(obj, fn) {    for (var i = 0; i < obj.length; i++) {        fn.call(obj[i], obj[i], i);     }  } function render(data) {    $("container").innerHTML = teamList(data);  }

模板代码:

  1. <div class="${item.state}"> <div class="cell1"><input id="g_${item.id}" value="${item.name}" /></div><div class="cell2"><button onclick="action.submit(${item.id})">提交</button></div><div class="cell3"><button onclick="action.cancel(${item.id})">取消</button></div>   <div class="cell1">${item.name}</div><div class="cell2"><img onclick="action.edit(${item.id})" src="data:images/edit.gif" alt="" /></div><div class="cell3"><img onclick="action.del(${item.id})" src="data:images/delete.gif" alt="" /></div>  </div>

以传统的编程方法不同,我们没有直接操作html,或者说文档对象模型,而是抽象出一个更加简单的数据模型–一个JavaScript 数组对象。

我们所有的操作都是从这个简单的原始数据开始,数据模型被修改后,调用模板渲染函数,重新前端局部刷新展现UI。操作即可完成。

我们所有的操作都是从这个简单的原始数据开始,数据模型被修改后,调用模板渲染函数,重新前端局部刷新展现UI。操作即可完成。

这种方法能给我们简化多少代码呢?大家可以去翻翻那些比较出名的JavaScript图书,里面通常会花一个小节的篇幅去讲解一个话题,那就是表格排序。

对照这里的表格排序,7行代码,需要一个章节去解释吗?

3 核心思想

3.1 一切从源头开始

传统的编程方法有一个问题,那就是他修改的对象是文档对象模型,但是,当您的程序足够复杂的时候,这种文档对象模型往往不够简单,有太多冗余,或者夹杂着太多的静态展示逻辑,我们控制它非常麻烦。好了,我们没有必要迁就文档对象模型,我们要设计更加简单的没有冗余的前端模型。

一切从源头开始,不仅是为了操作上更加简单,更重要的一点是,避免数据不一致和错误累加的危害。

如果是传统的文档数据模型,不仅他本身带有大量冗余。我们前段操作代码也容易有大量的冗余。如上例,传统的方法中,初次展现的分组列表和后来编辑,添加的分组,可能生成方法都不一样,分布在不同的代码中,一单涉及到展现风格的修改,都得多次同步编辑,这在编程上的大忌。而我们上面介绍的方法中,我们只有一处展现逻辑,那就是完整覆盖。 仍外,传统方法是对UI做增量的修改操作,但是加加减减的多了,难免不出点小问题,而且,这种问题只能被累加起来,但是在我们新的编程方法中,因为我们每次都是整体覆盖,这样就不会有错误累加的问题了。

3.2 表现层没有上下文

既然我们有自己的数据模型,就不要随便在文档对象模型上保留任何状态了,任何修改,都反映到数据模型中去吧,状态改变了,同步数据模型,再从数据模型开始,完全覆盖前端展示。

4 性能的问题

上例中的联系人分组管理,能承受多大的数据呢?

我们得先解释一下我们的统计方法。

人的视觉停留时间是0.1秒,或者说100毫秒。也就是说,100毫秒间隔人类是无法感知的。而我们的网页操作。是一种延迟,不是间隔,人类能感知的时间延迟有多少呢?我们没有权威的数据,一般认为是300毫秒。300毫秒内的延迟,我们是无法感知的。

那么300毫秒内,我们能渲染多少数据呢?IE8,FF3(不打开Firebug,打开firebug能渲染400次)上能支持1000条左右,Chrome上能支持3000次左右。

另外,在某些情况下,面向数据的编程方法,性能可能还具有一定的优势。比如,百度工具栏widget列表的设计中,我们一次装载了较多的widget数据,但是我们每次只展示一小部分,这样,面向数据边车呢个方法中DOM节点明显比传统方式少一个数量级。要知道,DOM节点是非常消耗内存的。。。。

说点不足

动画,对,我们不应该采用这种方式做网页动画,因为动画的刷性要求太高,模板这种重头开始的方式不再适用。

所以,真要使用js动画效果的时候,你还是应脚本库去辅助。

同时提一点个人看法,用户体验的提高并不是动画这样吸引 眼球的效果。更多考虑应该是让用户操作更方便,不要被扣分。

5 如何体验?

1. 运行JSide调试服务器:http://www.xidea.org/webstart/JSide.jnlp

一个webstart程序,JSide 启动之后会在窗口右侧出现一个彩色的浮层(无边框窗口,如果是Java6u10+,这个窗口会透明显示)

2. 下载测试程序并解压。 http://lite.googlecode.com/files/Example-20091219.zip

下载之后随便解压缩到一个目录里面吧。

3. 设置调试网站目录。

测试服务器就是为了测试方便而设计的,你只要把刚才解压缩的目标目录拖放到JSide浮层上,测试服务器自动切换网站目录。

4. 查看测试程序。

每次切换网站目录后,程序会提示您打开网站首页,你打开就是了。首页默认是一个文件列表。选择你看着顺眼的文件点击吧(*.s.js是一种用JavaScript编写的服务端小程序,可以在JSide测试服务器上运行)

5.修改程序代码。

在JSide浮层上右键,浏览文件,修改吧。

【本文首发于:百度泛用户体验】http://www.baiduux.com/blog/2010/01/14/data_oriented_programing_in_web_frontend/
【关注百度技术沙龙】
本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/747004,如需转载请自行联系原作者

雏凤清音——面向数据的前端编程方法相关推荐

  1. 用C++实现网络编程---抓取网络数据包的实现方法

    From: http://blog.csdn.net/zjl_1026_2001/article/details/2191311 做过网管或协议分析的人一般都熟悉sniffer这个工具,它可以捕捉流经 ...

  2. js面向数据编程(DOP)一点分享(转载)

    js面向数据编程(DOP)一点分享 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...

  3. 面向数据编程的编程语言_面向数据科学家的10个很棒的编程项目

    面向数据编程的编程语言 Practice is an essential part of learning. But in my experience learning programming, fi ...

  4. 游戏设计模式——面向数据编程思想

    前言:随着软件需求的日益复杂发展,远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想. 当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象,热衷于研究如何更加优雅地抽象出对象. 然 ...

  5. c语言编程大体难度较高的,面向初学者的C语言编程方法研究

    李欣潼 摘要:C语言是一门十分重要但对初学程序设计的同学来说又是相对难学的一门计算机语言.从初学者的角度出发,按照分析问题,算法设计,编码实现及程序运行几个步骤,说明了学习C语言的方法.论文以二元一次 ...

  6. 2017WOT全球软件开发技术峰会:面向数据的思维模式和R语言编程

    跨界知识聚会系列文章,"知识是用来分享和传承的",各种会议.论坛.沙龙都是分享知识的绝佳场所.我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果.从听众到演讲 ...

  7. 数据分析师的编程之旅——Python爬虫预备篇(2)前端设计

    作者:李禹锋,重庆芝诺大数据分析有限公司数据挖掘工程师. 有一个程序猿的岗位叫做前端工程师,当前市场需求量也不小,主要是以HTML5框架(H5).CSS3样式表和JavaScript语言(简称JS)为 ...

  8. Java 中的面向数据编程

    近年来, Amber项目为 Java 带来了许多新特性-- 局部变量类型推断. 文本块. 记录类. 封印类. 模式匹配 等等.虽然这些特性都是独立的,但也可以组合在一起使用.具体地说,记录类.封印类和 ...

  9. 前端js调用后端API获取数据的三种方法(2022.7.25)

    前端js调用后台API获取数据的三种方法(2022.7.25) 前言 需求分析 一个Get实例 浏览器请求 SoapUI软件请求 一个Post实例 浏览器请求 SoapUI软件请求 1.Http简介( ...

最新文章

  1. jquery动态生成SKU表格
  2. python语言程序设计基础第二版第六章答案-python语言程序设计基础(第二版)第五章答案随笔...
  3. TIOBE 9 月排行榜:C++ 式微,第 3 名被 Python 拿下
  4. mysql 入门命令
  5. Gateway internal_length debug with Sara Zhang
  6. 算法题复习(快排、链表、二分、哈希、双指针)
  7. linux 挂载san存储,新手看招:Linux操作系统下挂载SAN资源
  8. mall-applet小程序项目是一套电商系统
  9. 15. 3 Sum (C,Python)
  10. 【正则表达式】正则表达式匹配SQL中的函数名
  11. 重启机器后挂载盘丢失
  12. xpage 传参_jQuery iScroll.js 移动端滚动条美化插件第1/5页
  13. android 卷帘动画,Android卷帘门动画实践
  14. servlet实现登陆注册
  15. Python 持久存储
  16. java后台处理跨域问题_用cros解决前后端分离的跨域问题
  17. 2014年物联网Internet of Things应用简介
  18. windows与ubuntu Centos系统下载站点整理(自用)
  19. html 幻灯片原理,js幻灯片
  20. Arduino 水质检测仪(浊度、TDS、温度、电导率、吸光度、硬度)带18b20温度补偿。

热门文章

  1. 分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程
  2. linux so sndbuf大小,了解set / getsockopt SO_SNDBUF大小加倍
  3. 盈一指风华,浅梦一程。生命的美丽
  4. data=*(vu32*)addr;的理解?
  5. LoadLibrary下错误返回126错误码排查过程
  6. 智能家居现状是什么,主要面临哪些挑战
  7. 标准光源与色温对应关系
  8. 魏兴国:深入浅出DDoS攻击防御
  9. 说说我在机场碰上的那些大家喜闻乐见的事
  10. 【Linux 将普通用户改为root用户】并授予某个目录或文件的所有权限