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 ...
随机推荐
- MSSQL Server数据库的四种连接方法和sql连接字符串
MSSQL Server数据库的四种连接方法和sql连接字符串 分类: [ 03 ] C#(131) [ 07 ] SQL Server(68) [ 01 ] .NET(189) 今天用SQL Ser ...
- 浅谈iOS版本号
作者:Travis FIR.im 一直在尽量兼容不同使用习惯的版本号形式, 但是在使用中我们发现好多开发者对怎么更好的用版本号来标示应用很陌生. 这是篇基础文章, 简单介绍 iOS 的版本号. 名词解 ...
- 异步委托(APM)使用Func异步操作,处理耗时操作
使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染
在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...
- Iframe去掉滚动条
<html><head><title></title></head><body STYLE='OVERFLOW:SCROLL;OVER ...
- JS生成1000个数字加字母的不重复的随机字符串
周五,快下班了,正收拾东西准备走人,项目经理突然让我给他做个Excel,1000个数字加字母组合的密码,不重复,下班前给. 我直接懵了,Excel不会,估计是要写个什么命令才能生成出来,于是想着有没有 ...
- WPF中实现验证码功能
其实和winform中的实现差不多,只是由于WPF中控件使用的库与winform中的有区别,大体上还是差不多的,直接看代码: 产生验证码的类:ValidCode.cs public class Val ...
- ZOJ 3804 YY's Minions (简单模拟)
/* 题意:一个矩阵中有 n*m个宠物,每一个宠物都有一个状态, 1醒着的,0睡着的 X离开的!如果这个宠物(醒着的)的周围醒着的个数>3 || <2它就会睡着, 如果这个宠物(睡着的)的 ...
- TFS简介
Team Foundation Server(TFS)是一种为 Microsoft 产品提供 源代码管理.数据收集.报告和项目跟踪,而为协作软件开发的项目.可作为独立的软件,或 Visual Stud ...
- 【Java基础】方法
Num1:检查参数的有效性 绝大多数的方法和构造器对于传递给它们的参数值都会有某些限制.比如:索引值必须是非负数,对象引用不能为null等等.这些都很常见,你应该在文档中清楚地指明所有这些限制,并在方 ...