Atitit.提升语言可读性原理与实践
Atitit.提升语言可读性原理与实践
表1-1 语言评价标准和影响它们的语言特性
|
标 准 |
|||
|
特性 |
可 读 性 |
可 写 性 |
可 靠 性 |
|
简单性 |
· |
· |
· |
|
正交性 |
· |
· |
· |
|
数据类型 |
· |
· |
· |
|
语法设计 |
· |
· |
· |
|
对抽象的支持 |
· |
· |
|
|
表达 |
· |
· |
|
|
类型检查 |
· |
||
|
异常处理 |
· |
||
|
有限地使用别名 |
· |
||
第三个潜在的问题是运算符重载,即一个运算符有多种意义。虽然这很有用,但是如果允许使用者创建自己的重载,并且不是按常规重载,会降低可读性。例如,重载"+"用于整数和浮点数的加法显然是可取的。事实上,这一重载减少了运算符的数目,从而简化了语言。但是假设程序员将"+"定义为计算两个一维数组中所有元素的和,由于它不同于通常的向量求和,因此对这个程序,编写程序的人与读程序的人都难以理解。使程序难以理解的一个更极端的例子是将"+"定义为计算两个向量的第一个元素之差
当然,语言的简单性也不能过分。例如,如下一节所示,大多数汇编语言语句的形式与意义都是简单性的典型体现。但是这种简单性使汇编语言程序的可读性较差。由于汇编语言程序缺乏更复杂的控制语句,所以程序结构不清晰;由于语句简单,所以与高级语言相比,同样的程序需要的语句就多得多。如果高级语言的控制结构和数据结构不适当,虽然没有上面的例子那样极端,但结论是一样的。
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
1.3.1.2 正交性
程序设计语言的正交性意味着相对较小的基本结构集合,能够以较少的组合方式来构成语言的控制结构和数据结构。而且,基本结构的任一种可能组合都是合法且有意义的。例如数据类型,假设某语言有4种基本的数据类型(整型、单精度型、双精度型和字符型)和2种运算符(数组和指针)。如果2种运算符都能够作用于自身和4种基本的数据类型,就能够定义大量的数据结构。
一个语言特性是正交的,意味着它独立于程序中出现位置的上下文("正交"来自于正交向量这
IBM的设计限制较多,因此可写性较差
正交性与简单性直接相关:语言设计越正交,语言规则需要的特例就越少,特例越少意味着设计的规范程度越高,语言就越容易学习、阅读和理解。任何学过大量英语的人可以证实,英语中的许多规则特例太难学了(例如,i总是在e前,除非在c后)
过多的正交也会产生问题。ALGOL 68语言(van Wijngaarden等,1969)可能是最具有正交性的程序设计语言了。ALGOL 68中的每一语言结构都有一个类型,这些类型没有任何限制,而且大多数结构都有值。这种自由组合可以产生极其复杂的结构,例如,只要结果是一个地址,就可以把条件语句、声明语句及其他各类语句一起放在赋值运算符的左边。这种极端的正交形式导致了不必要的复杂性。而且,由于语言需要大量的基本结构,高度的正交性将产生爆炸性的组合方式。因此,即使组合方式很简单,它们的整体数量也会导致语言的复杂性。
另一方面,过多的正交有损于可写性。当几乎任何基本结构的组合都合理时,程序中的错误会难以检测,从而导致编译器无法发现代码中的谬误。
可见,语言的简单性至少部分归因于相对少量的基本结构的组合,以及正交原理的有限应用。
有人认为,函数式语言同时具有良好的简单性和正交性。函数式语言,如LISP,主要通过将函数作用于给定参数来执行计算。相反,命令式语言,如C、C++和Java,通常用变量和赋值语句来指定如何计算。函数式语言提供了最佳的整体简单性,因为它们能够用一种结构,即函数调用(函数调用能够以简单的方式与其他函数调用组合起来)来完成任何计算。正是这种简单优美使一些语言研究者将函数式语言作为复杂的非函数式语言(如C++)的主要替代语言。但其他因素,如效率,限制了函数式语言的更广泛应用。
1.3.2.2 对抽象的支持
简而言之,抽象就是以允许忽略许多细节的方式来定义和使用复杂结构和操作的能力。抽象是当代程序设计语言设计的关键概念,这是抽象在现代程序设计方法学中扮演中心角色的反映。因此,程序设计语言所允许的抽象程度以及表达抽象的自然程度,对语言的可写性非常重要。程序设计语言支持两类不同的抽象:过程抽象和数据抽象。
过程抽象的一个简单例子,是使用子程序来实现程序中多处需要的排序算法
作为数据抽象的一个例子,请考虑一棵在其结点上存储整数的二叉树
面向数据的软件开发的最终演进开始于20世纪80年代早期,演变为面向对象的设计。面向对象的设计方法基于数据抽象,
1.3.2.3 表达性
语言的表达性涉及若干不同特性。在类似APL(Gilman和Rose,1976)的语言中,表达性意味着有若干功能强大的运算符,能够用很短的程序实现大量的运算。表达性更普遍的意义是,语言具有较为简捷而不笨重的方式来指定运算过程。例如,在C语言中,count++的形式比count=count+1更简短更方便。还有,Ada语言中的布尔运算符and then方便地表明对布尔表达式进行短路求值,Java语言中的for语句在写计数循环时比使用while语句更方便,虽然后者也能实现。以上这些都提高了语言的可写性。
由于冯·诺依曼结构,命令式语言的核心特征就是变量(内存单元的模型)、赋值语句(基于传输操作)和迭代形式的循环运算(这是在该体系结构上实现循环的最高效形式)。表达式中的操作数由内存传输到CPU,表达式的计算结果传回到赋值语句左边所代表的内存单元。迭
尽管事实上,命令式程序设计语言的结构是以计算机体系结构为模型的,而不是出于程序设计语言使用者的能力和意愿,有人仍然认为使用命令式语言比使用函数式语言在某种程度上更自然,因此许多人认为,即使函数式程序与命令式程序运行效率一样高,命令式程序设计语言的使用仍然会占据主导地位。
.6 语言设计中的权衡
l.3节介绍的程序设计语言的评价标准为语言设计提供了一个框架。可惜这个框架是自相矛盾的。Hoare在其关于语言设计的见解深刻的论文(Hoare,1973)中指出,有太多重要但相互矛盾的标准,协调并满足这些标准是一个重要的工程任务。
参考资料
1.3 语言评价标准 - 51CTO.COM.html
Atitit.提升语言可读性原理与实践的更多相关文章
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Adaboost提升算法从原理到实践
1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...
- [机器学习]-Adaboost提升算法从原理到实践
1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在”强可学习”和”弱可学习”的概念上来说就是我们通过对多个弱可学习的算法进行”组合提升或者说是强化”得到一个性能赶超强可学习算法的算 ...
- Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx
Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx 1. 大原则:分解+命名1 1.1. 命名规范1 1.2. 分层.DI和AOP是继OO1 1.3. 运算符可读性一般要比 ...
- Atitit.软件兼容性原理与实践 v5 qa2.docx
Atitit.软件兼容性原理与实践 v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...
- Atitit.异常的设计原理与 策略处理 java 最佳实践 p93
Atitit.异常的设计原理与 策略处理 java 最佳实践 p93 1 异常方面的使用准则,答案是:: 2 1.1 普通项目优先使用异常取代返回值,如果开发类库方面的项目,最好异常机制与返回值都提供 ...
- Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- Atitit.软件兼容性原理与实践 v3 q326.docx
Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api vs 修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...
随机推荐
- Wait Type:IO_COMPLETION
在等待 CXPACKET 完成的时间内,我查看 sys.dm_exec_requests ,发现Session的 Logical Read/Write, Physical Read 都没有变化.Wai ...
- 【WPF】制作自定义的列表项面板
我们在使用像ListBox的列表控件时,我们都知道可以通过其ItemsPanel的依赖项属性来自定义一个面板来放置列表控件中的列表项.除了CLR库提供的几个面板外,我们完全可以把自己写的面板作为项列表 ...
- 做小图标还用sprite图?你out了!史上最简单易懂iconfont使用教程
1.什么是iconfont? 说白了就是用图标制作而成的一套字体文件,本质是一个字体文件(扩展名是ttf\woff\svg的文件).它是用来制作网页常用小图标的一种方法.以下是天猫首页使用iconfo ...
- 绘制圆动画--重写view
/** * @FileName CircleProgressBar.java * @Package com.read.view * @Description TODO * @Author Alpha ...
- java 显示透明背景png图片
首先理由ps生成一个背景透明的png图片,然后设置JPanel面板的透明属性,也就是panel.setOpaque(false);设置为透明 class MyPanel extends JLayere ...
- 希望有兴趣的加入,共同为项目智能化管理jar包而努力 第二篇
想听听大家对于我这个想法的一些看法,喷也好,赞也罢,希望留下您宝贵的建议! 有共同想法并且想实现的请入群 2500261120 在使用autort插件时,首先要到autort服务器下载所有 ...
- C/C++:提升_头文件的使用
C/C++:提升_头文件的使用 ◇写在前面 学到现在,很多人编写程序时只会使用一个文件.这样在代码量较小的时候,更利于表达程序,但是随着代码量的逐步增加,程序的思维逻辑不是我们一下子就可以完全理清的, ...
- Elasticsearch增删改查 之 —— Get查询
GET API是Elasticsearch中常用的操作,一般用于验证文档是否存在:或者执行CURD中的文档查询.与检索不同的是,GET查询是实时查询,可以实时查询到索引结果.而检索则是需要经过处理,一 ...
- 理解SQL Server是如何执行查询的 (1/3)
查询执行的总图: 根据总图的流程,详细说明每个部分: 1. 请求(Request) SQL Server是C/S架构的平台.与它交互的唯一方式就是发送包含数据库命令的请求.应用程序和数据库之前的通信协 ...
- 使用Uploadify(UploadiFive)多文件上传控件遇到的坑
最近项目中需要实现多文件上传功能,于是结合需求最终选择了Uploadify这一款控件来实现.相比其他控件,Uploadify具有简洁的界面,功能API基本可以解决大多数需求,又是基于jquery的,配 ...