`
hax
  • 浏览: 962653 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

论KISSY中一则API的设计

    博客分类:
  • UX
阅读更多


这次D2上,玉伯介绍KISSY。我听下来,KISSY有不少设计和我断断续续做的PIES框架的设计是类似的(或许现在的JS类库在许多设计思路上必然会有许多共识)。但是seed、meta之类的概念就不容易理解。后来我看了一下,原来这些概念是爱民给加上的,嘿嘿。当然,即使不看爱民的解说,我们也可以了解大概思路,是系统可从seed动态演化出来。但是meta这样的抽象就有些学院派,特别是不像爱民的QoBean项目本来就是要做元编程,在KISSY内,这个抽象只对内,不对外,也不直接解决实践中构建系统的关键问题,比如namespace和module。meta的作用其实只是使得内核具有一个更加精巧的核心。所以这样过于“务虚”的抽象对于听众来说无疑是天书。

好吧,这个起头有点长,其实本篇blog想要讨论的只是KISSY中的一个很小的点:DOM.attr的API设计。

这个API(我稍作了简化)是这样滴:

attr ( element, attrName )
获取元素的属性值。

attr ( element, attrName, value )
给元素设置属性值。

你可以注意到,这里其实是函数重载(overload),两个参数是返回属性值,而三个参数是设置属性值。KISSY中有不少API都是类似的。

然而这种API设计我认为大有问题。原因很简单,重载方法(函数)的参数虽然不同,但是同样名字的方法(函数)干的事情应该是相同的。而在这里,两个重载方法(函数)做的事情却正好相反!

我们考虑一下实际编程的情况,许多时候参数本身就是一些方法调用的结果,因此整个调用序列可能就比较长。在这种情况下,你很难一眼看出这个调用到底是几个参数,因此当然也不知道这里到底是取值还是赋值。

所以这种API可能导致程序可读性的严重下降。

那么在什么情况下,相同名字而相反意义才是可行的?属性就是这样一个例子。因为a和a=(赋值)的区别还是非常明显的。然而即使如此,我们还经常遇到a=1和a==1的混淆。

另一个可行的案例有些语言是用a()和a(v)来作为getter/setter的写法。因为“没有参数”的调用和带有一个参数的调用,其区分还是相当明显的,况且这些语言中很可能允许省略无参调用的括号,那么a和a(v)的差异就更一目了然了(而且还不会有a=1和a==1的混淆)。但是,有一个参数和有两个参数的区分就不那么明显了,而像attr这个例子是两个参数和三个参数,那就更难分辨了。

所以回到最普遍的情形,对于方法(函数)的重载来说,应该坚守这个原则:重载方法(函数)干的事情应该是相同的。相比attr,setAttr和getAttr虽然多了几个字符,但是能确保程序的可读性。






6
8
分享到:
评论
2 楼 lifesinger 2010-12-24  
考虑 api 的分层,最开始的设计里,是这样的:

DOM.getAttr(elem, name)
DOM.setAttr(elem, name, val)

然后函数变换到

Node.attr(name)
Node.attr(name, val)

DOM 属于中级 api,Node 属于高级 api

但现实总让人无奈,有不少开发人员不喜欢 Node,同时又想用 attr 这种简洁方法,于是目前就有了:

DOM.attr(elem, name)
DOM.attr(elem, name, val)

并且把 getAttr/setAttr 去掉鸟

近期又再将 attr 等方法分拆,成为:

Meta.DOM.getAttr
1 楼 Army 2010-12-24  
我开始也不大喜欢这种overload的方式,但是目前大多数人都受jq影响吧,这个思维都已经快成为js中的定势了。

相关推荐

    Web常用UI库 kissy.zip

    Kissy 是一个由淘宝开发并开源的JavaScript库,它的设计目标是为Web开发者提供一套全面、强大且易用的UI组件。Kissy 的出现旨在简化Web应用的开发过程,提高开发效率,尤其在构建复杂的前端界面时表现出强大的优势。...

    kissy学习教程

    而KISSY框架则针对这些问题提供了一个全新的解决方案,它致力于模块化、跨终端支持以及易用性,特别适合于开发电子商务网站等复杂交互的Web应用。 KISSY框架的适用场景主要包括Web页面开发,尤其是电商平台的页面,...

    提示补全组件:Kissy Suggest

    标题中的“Kissy Suggest”是指Kissy框架中的一个组件,Kissy是一个轻量级的JavaScript库,专注于前端开发,提供了丰富的组件化功能。Suggest组件则是Kissy中用于实现自动提示、补全功能的部分,常见于搜索框或...

    kissy 学习

    Kissy 是一个由淘宝开发的前端JavaScript库,它旨在简化Web开发,提高代码质量和性能。Kissy 提供了一种模块化的解决方案,使得开发者能够更好地组织和管理他们的代码,同时提供了丰富的组件来支持日常的Web开发任务...

    Kissy Suggest 自动提示例子

    Kissy Suggest 是一个基于 JavaScript 的开源库,专为实现自动提示功能而设计。本文将深入探讨 Kissy Suggest 的工作原理、使用方法以及其在实际项目中的应用。 Kissy Suggest 是 Kissy 项目的一个组件,Kissy 是一...

    修改的Kissy富文本编辑器

    Kissy是一个轻量级的JavaScript库,专注于前端开发,而Kissy富文本编辑器则将这种轻量级的优势带入了内容编辑领域。 Kissy Editor的核心特点包括但不限于以下几点: 1. **模块化设计**:Kissy Editor遵循Kissy框架...

    KISSY 小巧灵活、简洁实用的 UI 类库.zip

    KISSY,一个在前端开发领域中被广泛使用的轻量级UI类库,以其小巧、灵活和实用的特点,赢得了众多开发者们的青睐。本篇文章将深入探讨KISSY的核心特性、应用场景以及如何有效地利用它来提升开发效率。 首先,我们来...

    js编辑器KISSY和TinyEditor

    在实际使用中,KISSY可以作为项目的基石,提供底层的模块管理和UI组件,而TinyEditor可以作为其中的一个模块,用于实现页面内的文本编辑功能。两者结合,既能享受到KISSY带来的强大功能和可扩展性,又能利用...

    基于KISSY的动画导航.zip

    KISSY是一个轻量级、模块化的JavaScript库,尤其适合中国开发者,因为它内置了对中文字符集的支持,并且提供了丰富的组件和API,便于构建复杂的Web应用。下面我们将深入探讨这个项目可能涉及的关键知识点。 1. **...

    使用KISSY实现视差滚动效果

    在本文中,我们将深入探讨如何使用KISSY框架来实现视差滚动效果。KISSY是一个轻量级的JavaScript库,旨在提供一个简洁且强大的工具集,帮助开发者快速构建复杂Web应用。视差滚动是一种增强网页用户体验的视觉技巧,...

    新增KISSY图片裁剪插件.zip

    KISSY 是一个轻量级的JavaScript库,旨在简化前端开发工作,它提供了丰富的组件和API,可以方便地进行各种前端任务,包括图片裁剪。"新增KISSY图片裁剪插件.zip"这个压缩包文件就是一个利用KISSY实现的图片裁剪功能...

    imagezoom:KISSY 图像放大

    "imagezoom: KISSY 图像放大"是一个基于JavaScript库KISSY的插件,用于实现网页中的图像放大功能。KISSY是一个轻量级、模块化的前端开发框架,它提供了一种简单的方式来组织和管理JavaScript代码,尤其适用于大型Web...

    digitalScroll:基于 KISSY 和 Layer-anim 的 javascript 数字滚动小部件

    Layer-anim则是KISSY的一个扩展,专门用于实现动画效果。它提供了丰富的动画API,开发者可以通过简单的调用来创建出各种复杂的动画,包括平移、旋转、缩放等。Layer-anim与KISSY的结合,使得digitalScroll能够实现...

    top:返回顶部的kissy组件

    Kissy是一个轻量级、模块化的JavaScript库,它允许开发者通过简单的API来构建复杂的Web应用。 在JavaScript编程中,这样的组件通常实现为一个小型的插件或者函数,它可以被绑定到页面的某个元素上,如一个按钮或...

    bui后台示例

    【BUI后台示例】是基于BUI和Kissy框架构建的一个管理页面示例,它主要展示了如何在后台系统中实现高效、易用的交互功能,包括文件上传和表单表格的处理。在这个项目中,BUI(Business UI)作为前端用户界面库,提供...

    淘宝在线编辑器JAVA版_带文件上传

    淘宝在线编辑器JAVA版是一款基于KISSY Editor的富文本编辑器,专为Java开发者设计,支持文件上传功能。KISSY Editor是阿里巴巴开源的一款强大的JavaScript富文本编辑器,而这个JAVA版则提供了与服务器端交互的能力,...

    draggable.js源码分析

    首先,draggable.js是基于KISSY框架实现的,KISSY是一个开源的JavaScript组件库,提供了丰富的DOM和事件操作API,为构建复杂Web应用提供了便利。在draggable.js中,主要利用了浏览器的事件模型和DOM操作,实现了拖拽...

    淘宝的HTML5实践.pdf

    - **背景**:考虑到淘宝用户中仍有一定比例使用老旧浏览器的情况,淘宝团队开发了KISSY库,旨在提供一个兼容性强且功能丰富的前端框架。 - **解决方案**:KISSY库针对不同的浏览器环境提供了不同的实现方案。例如,...

Global site tag (gtag.js) - Google Analytics