一般认为函数指具有返回值的子程序,过程指没有返回值的子程序。C++中把所有子程序成为函数,其实那些返回值为void的
函数在语义上也是过程。函数与过程的区别更多是语义上的区别,而不是语法的区别。

语言纯化论者认为一个函数应该只有一个返回值,这和数学函数一样。即函数只接受输入(参数),通过参数运算返回结果

。 除此之外的效果被称为函数的副作用,比如修改全局变量。

function sum1(x, y) {
return x+y
}
function sum2(x, y) {
alert(x+y)
}
sum1是一个函数,它有输入并返回结果;sum2则是过程,接受输入,处理输入(打印输出结果),但没有返回结果。

好的子程序需要遵循以下原则

高内聚
好的命名
长度适中
合理的参数

一、高内聚性

内聚性是计算机科学里很重要的一个概念,由Larry Konstantin在1974年的一篇论文提出。它由分为以下

1. 功能内聚(Functional cohesion,最高)

最好最强的一种内聚性,即一个子程序仅执行一个操作,有的书也称“只做一件事,做好一件事”。这种子程序执行的操作

与其名称多数是相符的,如sum执行相加,deletePage删除页面。

2. 顺序上的内聚(Sequential cohesion)

指子程序内需按特定顺序执行操作,这些步骤需要共享数据,且在全部执行后才完成子程序的完整功能。比如需要先计算A,

再使用A计算B,接着取B计算C。

3. 通信上的内聚(Communicational cohesion)

是指子程序不同操作使用了相同数据,但不存在任何联系。

4. 临时的内聚性(Temporal cohesion)

是指含有一些因为需要同时执行才放到一起的操作的子程序。

5. 逻辑上的内聚性(Logical cohesion)

是指若干操作被放入同一个程序中,通过传入的控制标志选择执行其中的一项操作。

6. 偶热的内聚性(Coincidental cohesion 最低)

指子程序中各个操作直接没有可以看到的内联,也称为“无内聚性”或“混乱的内聚性”。

二、好的命名

好的命名能清晰的描述子程序所做的一切。以下是一些命名注意事项

1. 描述子程序所完成的功能

2. 避免使用无意义的、模拟或表达不清的词

3. 不要仅通过数字来区分不同的子程序名

4. 根据需要确定子程序名字的长度

5. 对返回值要有所描述

6. 一般是动词+名词形式

7. 使用对仗词,如add/remove, begin/end, first/last, get/put, up/down/, show/hide, open/close。

三、长度适中

“子程序/函数的第一要素就是短小,第二条规则还是短小”,鲍勃大叔如此说。理论上认为子程序的长度最大长度通常是一

屏代码,大约50-150行。

一项对子程序的研究发现,平均100-150行代码的子程序需要修改的几率最低(Lind and Vairavan 1989)。

IBM一项研究发现,最容易出错的是那些超过500行代码的子程序。超过500行后,子程序的出错率和代码行数成正比。在面向

对象编程中,一大部分子程序都是访问器子程序(getter),它们都非常短小。任何时候复杂算法总会导致较长的子程序,

这种情况下允许长度增加到100到200行。

四、合理的参数

子程序之间的接口是程序中最易出错的地方,Basili和Perrricone所做的一项研究发现程序中39%的错误都是属于内部接口错

误。也就是子程序间互相通信时所发生的错误。应该按以下原则处理

1. 按照输入-修改-输出的顺序排列参数。不要随机地按字母顺序排列参数,而应先列出输入参数,然后是即作为输入又作为

输出的参数,最后是输出的参数。比如Ada就要专门的关键字in,out。

procedure InvertMatrix {
originalMatrix: in Matrix;
resultMatrix: out Matrix;
}

2. 如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序一致。

dom = {
setWidth: function(elem, value) {
// ...
},

setHeight: function(elem, value) {
// ...
}
}

3. 使用所有的参数,既然定义了该参数就应该使用它,如果不用它就应该删掉它。

4. 把状态或出错的变量放在后面,状态和那些用于指示发生错误的变量应放在参数表最后。它们只是程序的附属功能且只用

于输出的参数。

5. 不要把子程序的参数用于工作变量

function process(inputVal) {
inputVal = inputVal - 10;
return inputVal
}
这段JS代码中,省略了一个变量声明,inputVal很容易让人误解,即是输入又是输出,改为如下

function process(inputVal) {
var outputVal = inputVal - 10;
return outputVal
}
  

6. 子程序的参数个数限制在7个以内。鲍勃大叔说的更极端 “最理想的参数数量是零,其次是单参数函数,再次是双参数函

数,应尽量避免三参数函数”。心理学研究发现,人类很难记住超过7个单位的信息。这一发现已应用在各个领域。

js函数设计原则的更多相关文章

  1. Vue.js组件设计原则

    页面上把每个独立可以交互的区域视为一个组件 每个组件对应一个工程目录,组件所需要的各种资源在这个目录下就近维护 页面不过是组件的容器,组件可以嵌套自由组合形成完整的页面

  2. 【JS】327- javascript 的 api 设计原则

    点击上方"前端自习课"关注,学习起来~ 前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博 ...

  3. AngularJS_01之基础概述、设计原则及MVC设计模式

    1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...

  4. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  5. 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何 ...

  6. HTML5 极简的JS函数

    页面初始化 mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括:创建子页面.关闭 ...

  7. Javascript设计原则

    Javascript设计原则 在面向对象的程序设计思想中, 我们能够遵循一些原则能够让我们开发代码时结构层次清晰, 更具说服力, 可谓是事半功倍. 做到这一点我们掌握一些程序设计原则是非常有利的, 如 ...

  8. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  9. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

随机推荐

  1. Socket 相关的知识

    1.关于PF_INET和AF_INET的区别 在写网络程序的时候,建立TCP socket: sock = socket(PF_INET, SOCK_STREAM, 0);然后在绑定本地地址或连接远程 ...

  2. 蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)

    蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材 ...

  3. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  4. 【set&&sstream||floyed判环算法】【UVa 11549】Calculator Conundrum

    CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She was bored ...

  5. kafka中处理超大消息的一些考虑

    Kafka设计的初衷是迅速处理短小的消息,一般10K大小的消息吞吐性能最好(可参见LinkedIn的kafka性能测试).但有时候,我们需要处理更大的消息,比如XML文档或JSON内容,一个消息差不多 ...

  6. 一些实用的CSS Media Query代码片段,个人采集

    CSS3的出现让响应式Web设计变得简单,CSS3提供了强大的media queries,允许你针对不同的条件设置不同的样式,可以在不修改页面内容的情况下,为不同设备提供不同的样式效果. 以下是一些C ...

  7. C#实现WinForm传值实例解析

    C#实现WinForm传值的问题经常会做为公司面试的题目,那么作为学习C#以及WinForm传值,我们需要掌握哪些方法和思路呢?下面我们就向你介绍详细的思路和实现的具体步骤,希望对你有所帮助. C#实 ...

  8. Json.Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  9. SQL case when

    jack    1tom    2anni    3poly    4 select buyer_name, ( case ' then '东' ' then '南' ' then '西' ' the ...

  10. Struts2中使用Session的两种方法

    在Struts2里,如果需要在Action中使用到session,可以使用下面两种方式: 通过ActionContext 类中的方法getSession得到 Action实现org.apache.st ...