Java是否正交?

13

我想知道Java是否是正交的。如果是,那么它的哪些特性使它是正交的?如何确定语言是否正交?例如,我在某个网站上发现C++不是正交的,但没有解释为什么。还有哪些语言是正交的?请帮帮我,因为互联网上几乎没有关于这个主题的信息。

谢谢


13
请直接解释或提供有关"orthogonal(正交)"的定义链接。 "Orthogonal"是一个术语,表示两个向量或对象之间互相垂直或彼此独立。在数学、物理学和工程学等领域中,这个术语经常被使用。 - Peter G.
正交性很少是一个布尔值(“X是否正交?”),而通常是一个(比较)程度的问题(“X比Y更正交。”)。 - Jerry Coffin
1
编程语言也可以是线性的吗? - mvds
这个问题应该被标记为作业吗? - mvds
哎呀,我还以为正交是一个编造出来的术语,意思是令人费尽口舌的代码。 - David Pulse
5个回答

28

UNIX编程艺术第4章. 模块化,正交性,第89页:

正交性

正交性是帮助使复杂设计变得紧凑的最重要的属性之一。在纯正交设计中,操作没有副作用;每个动作(无论是API调用、宏调用还是语言操作)只改变一个事物而不影响其他事物。控制你所控制的任何系统的每个属性都有一种且仅一种更改方式。

编程语言实践第6章,第228页:

正交性意味着特性可以以任何组合使用,这些组合都有意义,并且给定特性的含义是一致的,不受与其结合使用的其他特性的影响

On Lisp, 5.2 正交性:

正交语言是一种可以通过多种不同的方式组合少量运算符来表达很多内容的语言。


我认为正交编程语言应该是每个特性具有最小或无副作用的语言,因此可以在不考虑使用方式如何影响其他特性的情况下使用它们。我从正交API的定义中借鉴了这一点。

在Java中,您需要评估例如是否有一组关键字/结构可以在同时应用于标识符时互相影响。例如,在方法上应用publicstatic时,它们不会相互干扰,因此这两个是正交的(除了关键字打算执行的操作之外没有副作用)。

你需要对所有功能进行这样的操作,以证明它们之间的正交性。这是一种方法。我认为在这件事情上不存在明确的正交或非正交。


是的,我了解正交性的概念,但我无法解释为什么C++被认为不使用正交性,以及如何进行分析。我的意思是...我不能说..."是的...Java在某种程度上是正交的,因为public和static可以毫无问题地一起使用"。我试图在这些语言中找到更通用的东西,但我想不出任何东西,也没有互联网上的信息。 - mbc
1
我提供了这个例子,你不能简单地挑选两个特性,你必须对所有特性都这样做才能证明正交性。这是一种方法。我在portal.acm.org上找到了两篇论文,一篇是关于通用编程语言正交性的,另一篇是关于C++正交性的。我认为在这个问题上不存在一个清晰的“是”或“不是”正交的答案。 - bakkal

3
使用正交编程语言这个术语是不寻常的。通常,在计算机科学中,你真正谈论的是正交指令集。然而,如果我们将其扩展到语言的语法方面:“...意味着[该语言]具有相对较少的基本结构和一组组合这些结构的规则。每个结构都有一个与之关联的类型,并且对这些类型没有限制...”(请参见ALGOL),那么我们可以假设,如果语言中并非所有指令都能在所有数据类型上工作,则会产生非正交性。但这并不意味着反过来就成立,也就是说,如果所有语言指令都能在所有数据类型上工作,这并不一定意味着该语言是正交的。
更正式地说,正交语言将具有执行给定操作的确切方法。非正交语言将具有实现相同效果的多种方法。
最简单的例子:
for loop; vs. while loop;

for和while不是正交的。


然而,许多程序员忽略了for循环和while循环之间的语义区别。这不是直接与语言本身的正交性相关的问题,但在我看来,这是一个更大的潜在问题,表明了对基本抽象概念的理解上存在一定的缺陷。 - Schedler
我认为,在面向对象编程(OOP)术语中,while循环比for循环更加"超级",或者在集合方面则是"包含"。因为任何for循环都可以表示为while循环,但并非所有的while循环都可以表示为for循环。这对正交性有什么影响呢?我正在阅读维基百科上的相关内容,似乎由于有两种做for循环的方式...我不知道。 - Thufir
实际上,当谈到语言评估时,这被认为是简单的。 - Ben Sewards

2

正交性是与语言无关的设计特征。当然,某些编程语言可以更容易地使您的系统设计保持正交性,但您不应该专注于特定的编程语言,而是尽可能保持系统设计的正交性。


1
虽然罕见,但人们也会将这个术语用于编程语言。 - Peter Recore

1

正交性并不是一种语言特性,尽管有些语言具有促进正交性的特性(如注解、内置AOP等)。关于Java中的正交性:我已经写了一个小案例研究,以log4j为例:“通过示例理解正交性”-你可能会觉得这很有用。


1

C语言中缺乏正交性:

  • 数组可以包含除void之外的任何数据类型
  • 参数按值传递,但数组按引用传递

如果一个编程语言符合以下条件,则被认为是具有正交性:

  1. 存在一组相对较小的基本构造,可以以相对较少的方式结合起来构建数据和控制结构

  2. 每种可能的结构都是合法的

例如,一个具有4种基本数据类型(Int、Float、Double、Char)和两个类型运算符(Array和Pointer)的语言可以创建相对较大数量的数据结构。

因此,正交性的优点在于使语言简单且规则,因为有更少的异常情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接