欢迎进入教育资讯网!
当前页面: 首页 > 电脑IT培训 > Web前端 > 敲黑板!JavaScript的API设计原则你必须要知道!

敲黑板!JavaScript的API设计原则你必须要知道!

来源:教育资讯网 25 2021-07-27

  本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时的原则,总共包含了七个大块。接下来我们来一起看一下吧!

  一、接口的流畅性

  好的接口是流畅易懂的,他主要体现如下几个方面:

  1.简单

  操作某个元素的css属性,下面是原生的方法:

  document.querySelectorAll('#id').style.color='red';

  封装之后

  functiona(selector,color){

  document.querySelectorAll(selector)[0].style.color=color

  }

  a('#a','red');

  从几十个字母长长的一行到简简单单的一个函数调用,体现了api简单易用

  2.可阅读性

  a(‘#a’,

  ‘red’)是个好函数,帮助我们简单实用地改变某个元素,但问题来了,如果***次使用改函数的人来说会比较困惑,a函数是啥函数,没有人告诉他。开发接口有必要知道一点,人都是懒惰的,从颜色赋值这个函数来说,虽然少写了代码,但是增加了记忆成本。每次做这件事情的时候都需要有映射关系。

  a—->color.如果是简单的几个无所谓,但是通常一套框架都有几十甚至上百的api,映射成本增加会使得程序员哥哥崩溃。

  我们需要的就是使得接口有意义,下面我们改写一下a函数:

  functionletSomeElementChangeColor(selector,color){

  document.querySelectorAll(selector,color);

  }

  letSomeElementChangeColor相对于a来说被赋予了语言意义,任何人都会知道它的意义

  3.减少记忆成本

  我们刚刚的函数也是这样的它太长了letSomeElementChangeColor虽然减少了映射成本,但是增加了记忆成本。要知道,包括学霸在内,任何人都不喜欢被单词。原生获取dom的api也同样有这个问题

  document.getElementsByClassName;document.getElementsByName;

  document.querySelectorAll;这些api给人的感觉就是单词太长了,虽然他给出的意义是很清晰,然而这种做法是建立在**简易性的基础上进行的。于是我们又再次改写这个之前函数

  functionsetColor(selector,color){

  xxxxxxxxxxxx

  }

  在意义不做大的变化前提下,缩减函数名称。使得它易读易记易用;

  4.可延伸

  所谓延伸就是指函数的使用像流水一样按照书写的顺序执行形成执行链条:

  document.getElementById('id').style.color='red';

  document.getElementById('id').style.fontSize='12px';

  document.getElementById('id').style.backgourdColor='pink';

  用我们之前的之前的方法是再次封装两个函数setFontSize,setbackgroundColor;然后执行它们setColor(‘id’,

  ‘red’);setFontSiez(‘id’,’12px’);setbackgroundColor(‘id’,‘pink’);

  显然,这样的做法没有懒出境界来;id元素每次都需要重新获取,影响性能,失败;每次都需要添加新的方法失败

  每次还要调用这些方法,还是失败。下面我们将其改写为可以延伸的函数首先将获取id方法封装成对象,然后再对象的每个方法中返回这个对象:

  functiongetElement(selector){

  this.style=document.querySelecotrAll(selector).style;

  }

  getElement.prototype.color=function(color){

  this.style.color=color;

  returnthis;

  }

  getElement.prototype.background=function(bg){

  this.style.backgroundColor=color;

  returnthis;

  }

  getElement.prototype.fontSize=function(size){

  this.style.fontSize=size;

  returnthis;

  }

  //调用

  varel=newgetElement('#id')

  el.color('red').background('pink').fontSize('12px');

  简单、流畅、易读后面我们会在参数里面讲到如何继续优化。所以,大家都比较喜欢用jquery的api,虽然一个$符号并不**任何现实意义,但简单的符号有利于我们的使用。它体现了以上的多种原则,简单,易读,易记,链式写法,多参处理。

  nightmare:

  document.getElementById('id').style.color='red';

  document.getElementById('id').style.fontSize='12px';

  document.getElementById('id').style.backgourdColor='pink';

  dream:

  $('id').css({color:'red',fontSize:'12px',backgroundColor:'pink'})

  二、一致性

  1.接口的一致性

  相关的接口保持一致的风格,一整套API如果传递一种熟悉和舒适的感觉,会**减轻开发者对新工具的适应性。

  命名这点事:既要短,又要自描述,**重要的是保持一致性“在计算机科学界只有两件头疼的事:缓存失效和命名问题”—PhilKarlton

  选择一个你喜欢的措辞,然后持续使用。选择一种风格,然后保持这种风格。

  Nightware:

  setColor,

  letBackGround

  changefontSize

  makedisplay

  dream:

  setColor;

  setBackground;

  setFontSize

  set.........

  尽量地保持代码风格和命名风格,使人读你的代码像是阅读同一个人写的文章一样。

  三、参数的处理

  1.参数的类型

  判断参数的类型为你的程序提供稳定的保障

  //我们规定,color接受字符串类型

  functionsetColor(color){

  if(typeofcolor!=='string')return;

  dosomething

  }

  2.使用json方式传参

  使用json的方式传值很多好处,它可以给参数命名,可以忽略参数的具**置,可以给参数默认值等等比如下面这种糟糕的情况:

  functionfn(param1,param2...............paramN)

  你必须对应地把每一个参数按照顺序传入,否则你的方法就会偏离你预期去执行,正确的方法是下面的做法。

  functionfn(json){

  //为必须的参数设置默认值

  vardefault=extend({

  param:'default',

  param1:'default'

  ......

  },json)

  }

  这段函数代码,即便你不传任何参数进来,他也会预期运行。因为在声明的时候,你会根据具体的业务决定参数的缺省值。

  四、可扩展性

  软件设计**重要的原则之一:永远不修改接口,指扩展它!可扩展性同时会要求接口的职责单一,多职责的接口很难扩展。举个栗子:

  //需要同时改变某个元素的字体和背景

  //Nightmare:

  functionset(selector,color){

  document.querySelectroAll(selector).style.color=color;

  document.querySelectroAll(selector).style.backgroundColor=color;

  }

  //无法扩展改函数,如果需要再次改变字体的大小的话,只能修改此函数,在函数后面填加改变字体大小的代码

  //Dream

  functionset(selector,color){

  varel=document.querySelectroAll(selector);

  el.style.color=color;

  el.style.backgroundColor=color;

  returnel;

  }

  //需要设置字体、背景颜色和大小

  functionsetAgain(selector,color,px){

  varel=set(selector,color)

  el.style.fontSize=px;

  returnel;

  }

  以上只是简单的添加颜色,业务复杂而代码又不是你写的时候,你就必须去阅读之前的代码再修改它,显然是不符合开放-封闭原则的。修改后的function是返回了元素对象,使得下次需要改变时再次得到返回值做处理。

  this的运用

  可扩展性还包括对this的以及call和apply方法的灵活运用:

  functionsayBonjour(){

  alert(this.a)

  }

  obj.a=1;

  obj.say=sayBonjour;

  obj.say();//1

  //or

  sayBonjour.call||apply(obj);//1

  五、对错误的处理

  1.预见错误

  可以用类型检测typeof或者try…catch。typeof会强制检测对象不抛出错误,对于未定义的变量尤其有用。

  2.抛出错误

  大多数开发者不希望出错了还需要自己去找带对应得代码,比较好方式是直接在console中输出,告诉用户发生了什么事情。我们可以用到浏览器的输出api:console.log/warn/error。你还可以为自己的程序留些后路:

  try…catch。

  functionerror(a){

  if(typeofa!=='string'){

  console.error('paramamustbetypeofstring')

  }

  }

  functionerror(){

  try{

  //somecodeexcuceteheremaybethrowwrong

  }catch(ex){

  console.wran(ex);

  }

  }

  六、可预见性

  可预见性味程序接口提供健壮性,为保证你的代码顺利执行,必须为它考虑到非正常预期的情况。我们看下不可以预见的代码和可预见的代码的区别用之前的setColor

  //nighware

  functionset(selector,color){

  document.getElementById(selector).style.color=color;

  }

  //dream

  zepto.init=function(selector,context){

  vardom

  //Ifnothinggiven,returnanemptyZeptocollection

  if(!selector)returnzepto.Z()

  //Optimizeforstringselectors

  elseif(typeofselector=='string'){

  selector=selector.trim()

  //Ifit'sahtmlfragment,createnodesfromit

  //Note:InbothChrome21andFirefox15,DOMerror12

  //isthrownifthefragmentdoesn'tbeginwith<

  if(selector[0]=='<'&&fragmentRE.test(selector))

  dom=zepto.fragment(selector,RegExp.$1,context),selector=null

  //Ifthere'sacontext,createacollectiononthatcontextfirst,andselect

  //nodesfromthere

  elseif(context!==undefined)return$(context).find(selector)

  //Ifit'saCSSselector,useittoselectnodes.

  elsedom=zepto.qsa(document,selector)

  }

  //Ifafunctionisgiven,callitwhentheDOMisready

  elseif(isFunction(selector))return$(document).ready(selector)

  //IfaZeptocollectionisgiven,justreturnit

  elseif(zepto.isZ(selector))returnselector

  else{

  //normalizearrayifanarrayofnodesisgiven

  if(isArray(selector))dom=compact(selector)

  //WrapDOMnodes.

  elseif(isObject(selector))

  dom=[selector],selector=null

  //Ifit'sahtmlfragment,createnodesfromit

  elseif(fragmentRE.test(selector))

  dom=zepto.fragment(selector.trim(),RegExp.$1,context),selector=null

  //Ifthere'sacontext,createacollectiononthatcontextfirst,andselect

  //nodesfromthere

  elseif(context!==undefined)return$(context).find(selector)

  //Andlastbutnoleast,ifit'saCSSselector,useittoselectnodes.

  elsedom=zepto.qsa(document,selector)

  }

  //createanewZeptocollectionfromthenodesfound

  returnzepto.Z(dom,selector)

  }

  以上是zepto的源码,可以看见,作者在预见传入的参数时做了很多的处理。其实可预见性是为程序提供了若干的入口,无非是一些逻辑判断而已。zepto在这里使用了很多的是非判断,同时导致了代码的冗长,不适合阅读。总之,可预见性真正需要你做的事多写一些对位置实物的参数。把外部的检测改为内部检测。是的使用的人用起来舒心放心开心。呐!做人嘛**重要的就是海森啦。

  七、注释和文档的可读性

  一个比较好的接口是不需要文档我们也会使用它,但是往往接口量一多和业务增加,接口使用起来也会有些费劲。所以接口文档和注释是需要认真书写的。注释遵循简单扼要地原则,给多年后的自己也给后来者看:

  //注释接口,为了演示PPT用

  functioncommentary(){

  //如果你定义一个没有字面意义的变量时,比较好为它写上注释:a:没用的变量,可以删除

  vara;

  //在关键和有歧义的地方写上注释,犹如画龙点睛:路由到hash界面后将所有的数据清空结束函数

  returngo.Navigate('hash',function(){

  data.clear();

  });

  }

  **后

  推荐markdown语法书写API文档,github御用文档编写语法。简单、快速,代码高亮。

免责声明

非本网作品均来自互联网,转载目的在于传递更多信息,并不**本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其他问题,请及时与本网联系,我们将及时删除内容。

猜你喜欢

热点排行榜

教育部即将调整中小学上课时间,学生真的高兴坏了!
教育,是任何一个国家和民族的未来。如果没有了教育,那么这个国家和民族未来也会以前黑暗。随着知识在社会中的作用越来越大,人们也越来越重视教育。尤其是家长,为了能让孩子学习好,对于教育的投资可以说是不计代价!在许多人都越来越注重学习成绩的同时,孩子的学习压力却是越来越大,有的时候甚至孩子的睡眠时间都会严重不足。 如此一来虽然看似是孩子的学习成绩进步了,但是却严重影响了孩子的正常健康发育。如此
来看看在双减政策后,到底公立学校和私立学校有什么差距?
大部分的中小学生,都会选择在公立学校接受义务教育,但是随着教育“内卷”的情况越来越严重,不少学生家长会选择将孩子送到私立学校去上学,在这样的情况之下,中小学生的学习压力也越来越大,因此中小学生在上学的过程中,也会觉得非常疲惫。这种状态不仅不利于学生们提高学习成绩,更不利于学生们成长,因此相关部门也是引起了高度重视。 随着“双减”政策的实行,学生们的学习压力也在逐渐减小,“双减”实行后,公
为了推行三胎,课本的封面也变成三胎了,来看看人社部怎么说的~
开学没几天,网络上就开始流传着热心家长们对语文课本的“新发现”:一年的时间,课本封面由二胎变成了三胎,妈妈也不打扮了,头发随便一扎,衣服还是去年那件,只是旧了。多了个娃,爸爸也不在家下棋了,估计为了养家加班挣钱去了。家长们口中的两个封面分别是统编语文教材五年级上册、六年级上册封面。这段“看图说话”因为贴近“三胎”的社会热点,迅速引发了众多网友的共鸣、转发。人民教育出版社在其公众号上进行了“辟谣”:
清华北大亚洲**新排名来啦!泰晤士公布了2022世界大学排名结果!
综合报道,当地时间2日,泰晤士高等教育特刊(Times Higher Education,简称THE)更新了**新2022年THE世界大学排名。中国高校排名再次上升,首次有两所大学进入前20名,创下亚洲**佳纪录。根据新发布的排名,北大和清华并列第16名,这是首次中国有两所大学进入前20名,也亚洲国家迄今为止的**高排名。此外,中国内地共有10所大学进入前200名。根据排名,牛津大学连续6年位列***。美
怎么选择美国留学中介?选的时候一定要清醒!
此篇文章会把下面很多问题中的内容阐述的逻辑层次更简单分明一些,假使同学们如果没有太多时间,不妨粗略阅读下面的问题,大概了解下!我计划去美国留学入读硕士,想请教一下如何选择美国留学中介机构呢?美国留学中介选择策略:衡量自己的消费者心理选择美国留学中介机构请务必要依据你的需求进行相关选择。首先你需要询问自己,你申请是要干什么呢?这个问题就像是购买衣服和鞋,你买运动鞋,就不会去西装店。美国留学作为一个很
英语的单词怎么写才好看?学会这几个小习惯,你也能写的好看!
英语学习重视听说读写,其中的写作涉及标准的写作规范。以下是英语单词写法的介绍,供参考。1.倾斜。每个字母稍微向右倾斜,大约在5°~20°之间,但每个字母的倾斜必须一致,所以很漂亮。2.大写字母。大写字母都一样高,占上面的两个格子,顶部面向***条线。3.小写字母。中间一格小写字母a、c、e、m、n、o、r、s、u、v、w、x、z写在中间一格中,上下抵抗,但不及格。小写字母B、D、H、K、L上端顶一线
乐读推出一年级20人在线小班:通过小班教学 建构积极有效的师生互动
随着全国各地中小学和幼儿园秋季开学时间的确定,幼小、初小衔接又成了热点话题,但究竟要如何“衔接”,并不是每位家长都有科学的认识。乐读20人在线小班面向一年级孩子,激发兴趣、培养习惯,希望科学有效地帮助孩子适应小学学习生活,实现从幼儿教育阶段到小学教育阶段的顺利过渡。从孩子喜闻乐见的事物入手,培养学习的兴趣小学生活泼好动,注意力持续时间短,不少孩子初入小学课堂可能会出现发呆、坐不住的情况。据此,家长
学而思网校的线下校区即将关闭,只因房租成本过高!
9月27日消息,据媒体报道,学而思老师群内告知家长,因运营成本过高,不足以支撑面授班运营,所有面授课转为在线班。并统一在10月9日中午12:00开启转线上功能。此外,多名学而思工作人员均表示线下校区将会关闭。业内人士指出,在高额的房租下,退租关店也许是**理智的做法。目前线下教培机构在节假日、休息日及寒暑假的营收能占到全年收入的一半以上,但是现在不让上课,商业模型该怎么搭,目前很多线下机构恐怕还没想
教育部又来消息了,以后这类竞赛要被管理了!速来看看!
9月23日,教育部举行新闻通气会,介绍规范校外培训机构管理制度建设有关情况。会上,教育部校外教育培训监管司负责人介绍,“双减”工作是一项长期性复杂性系统性的工程,必须注重当前和长远相统一,研究修订竞赛管理办法,将治理打着“国际”旗号的各类竞赛。教育部校外教育培训监管司负责人表示,加快预收费监管、加强培训机构党建等其他配套政策法规的制订进度。同时完善“营改非”流程,进一步明确过程中的公示期限、资产确
各大高校开学了,清华大学开学典礼的主题演讲走红了,这个主题真不错!
9月是开学季,很多人带着对大学的憧憬迈入校园。在清华大学开学典礼上,一段开学演讲走红。教师**梅赐琪没有讲成功,而是讲失败。在他看来,与成功相比,失败能带给人更多可能性。以下是演讲全文:首先请允许我**我的同事们向今天(9月2日)入学的2021级同学们表示**热烈的祝贺!每一级的清华人都是特殊的,但是你们还是要更特殊一些。在人类和七种冠状病毒的遭遇之中,你们中的绝大多数见证了其中**危险的两次,一次懵