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 ...
随机推荐
- atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx 1.1. V3 新特性1 1.2. V2 新特性1 2. Token的归类1 3. Token的用途 ...
- 关于Thread.currentThread()和this的差异
重新来看多线程时,被这结果搞懵逼了.不多说,直接上代码: public class MyThread02 extends Thread { public MyThread02() { System.o ...
- TTAS Lock C++11 实现
template<class Lock> class Lock_guard{ private: Lock lock; public: explicit Lock_guard(Lock&am ...
- Jetty集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录.购物车等. Se ...
- 在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
这是我辅导的一个项目开发中的例子,他们是用WPF做界面开发,在学习了如何使用MVVM来实现界面与逻辑的分离,并且很好的数据更新之后,有一个疑问就是,这种双向的数据更新确实很不错,但如果我们希望用户可以 ...
- Java多线程系列--“JUC原子类”01之 框架
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...
- [Node.js] 基于Socket.IO 的私聊
原文地址:http://www.moye.me/2015/01/02/node_socket-io/ 引子 最近听到这么一个问题:Socket.IO 怎么实现私聊?换个提法:怎么定位到人(端),或者说 ...
- Javascript: 从prototype漫谈到继承(2)
本文同时也发表在我另一篇独立博客 <Javascript: 从prototype漫谈到继承(2)>(管理员请注意!这两个都是我自己的原创博客!不要踢出首页!不是转载!已经误会三次了!) 上 ...
- SQL SERVER 内存分配及常见内存问题 DMV查询
内存动态管理视图(DMV): 从sys.dm_os_memory_clerks开始. SELECT [type] , SUM(virtual_memory_reserved_kb) AS [VM R ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...