什么是“正交性”?


Answers:


255

正交性是表示“更改A不会更改B”的属性。正交系统的一个示例是无线电,其中更改电台不会更改音量,反之亦然。

非正交系统就像是直升机,改变速度可以改变方向。

在编程语言中,这意味着当您执行一条指令时,仅发生该指令(对调试非常重要)。

引用指令集时还有一个特定的含义。


这个答案让我想起了信号和系统中的“叠加”理论。
Özgür的

1
对这个词的不同用法的非常清楚的解释:c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano

那么函数式编程是否完全正交?
corazza

这是一个有趣的问题@yannbane。从理论上讲,取决于理论上的功能语言,这可能是正确的。在实践中,甚至没有功能语言也可以更改状态。
C. Ross,

1
我敢打赌直升飞机的例子来自“实用程序员” :)
Sreekanth Karumanaghat 2015年

36

摘自Eric S. Raymond的“ UNIX编程艺术”

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



12

如果您有一组构造。如果语言允许程序员自由混合使用这些结构,则称该语言为正交的。例如,在C中,您不能返回一个数组(静态数组),在这种情况下,C被认为是非正交的:

int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the langauge allows passing arrays.
// So, it is unorthognal in case.

实际上,我在书中看到了这一点,但仍然不明白那是什么。
AhmetB-Google

大声笑我正在使用这本书,并在该书的在线测验中看到了这个问题。真是巧合 也许我也应该读第一章。
AhmetB-Google

2
简而言之,将return和array放在一起时会更复杂:您不能在数组周围使用return而不考虑它们之间的相互作用。理想情况下,您将知道return的含义,数组的含义,因此您将知道返回数组的作用,但实际上,这要复杂得多,因为C公开了有关数组(和return)的实现细节。
李B

en.wikipedia.org/wiki/Orthogonality_(programming)涵盖了这种“正交”感,但这是一个内容很少的新页面。
outis

1
这是在编程环境中有关正交性的“更正确”的答案。“正交性”是指可以将编程构造与任何其他构造混合使用,并且其语义仍将保持不变。
treecoder 2015年

11

广义上讲,正交性是两件事之间的关系,因此它们对彼此的影响最小。

该术语来自数学,其中两个向量如果成直角相交,则它们是正交的。

考虑一个典型的二维笛卡尔空间(您的典型X / Y轴网格)。绘制两行:x = 1和y = 1。两条线是正交的。您可以通过更改x来更改x = 1,这对另一行无效,反之亦然。

在软件中,该术语可以适当地用于您所谈论的系统的两个部分相互独立运行的情况。


5

大部分答案都是冗长的,甚至晦涩难懂。关键是:如果工具是正交的,则可以添加,替换或删除它,以便使用更好的工具,而无需拧紧其他所有工具。

这是木匠用锤子和锯子(可用于锤击或锯切),或用某种新型的锤子/锯子组合(其目的是先锯木然后将其锤击)区别开来。两种方法都可以进行锯切,然后将其锤打在一起,但是,如果您完成了一些需要锯切而不是锤打的任务,那么只有正交工具可以使用。同样,如果您需要拧螺丝而不是锤子,那么如果它与锤子正交(不与锤子混合),则无需扔掉锯子。

经典示例是unix命令行工具:您拥有一个用于获取磁盘内容(dd)的工具,另一个用于从文件(grep)过滤行的工具,另一个用于将这些行写入文件(cat)的工具,等等。可以随意混合和匹配。


2

在谈论有关编程语言的项目决策时,正交性可能被视为您可以轻松地预测出过去所见到的关于该语言的其他信息。

例如,使用一种语言,您可以拥有:

分裂

用于分割字符串和

len(str)

获得长度。

在更正交的语言上,您将始终使用str.x或x(str)。

当您克隆对象或执行其他任何操作时,您将知道是否要使用

克隆(obj)

要么

obj.clone

这是正交编程语言的要点之一。这样可以避免您查阅手册或询问他人。

维基百科文章更多地讨论了复杂设计或底层语言的正交性。正如上面有人在评论中所建议的那样,Sebesta书干净地谈论了正交性。

如果我只用一个句子,我会说一种编程语言是正交的,如果它的未知部分根据您所看到的来按预期运行。或者...没什么奇怪的。

;)


这个答案与其他人不一致。这只是声称函数调用或整体结构之间的一致性,而不是那些“较少耦合”或“副作用”。
Özgür的

这是我通常听到的用法。我认为这是正交的原因是,如果您具有X.ToString和X.GetType,则可以更改对象和语法相同,或者可以更改函数和语法相同。该对象与功能无关。
dwidel 2012年

1

来自维基百科

计算机科学

正交性是一种系统设计属性,可促进复杂设计的可行性和紧凑性。正交性保证修改由系统组件产生的技术效果既不会产生副作用,也不会将副作用传播到系统的其他组件。由组件组成的系统的紧急行为应严格通过其逻辑的形式定义来控制,而不应由不良集成(即模块和接口的非正交设计)引起的副作用所控制。正交性减少了测试和开发时间,因为更容易验证既不会引起副作用也不会依赖副作用的设计。

例如,一辆汽车具有正交的组件和控件(例如,对汽车进行加速不会影响任何东西,除了与加速功能有关的组件之外)。另一方面,非正交设计可能会使其转向(例如电子稳定性控制)受到影响,或者使其速度调整其悬架。1因此,可以认为这种用法是从数学中正交的使用中得出的:可以将向量投影到子空间上,方法是将向量分别投影到一组基本向量的每个成员上,并且在且仅当基本向量相加时才添加投影相互正交。

如果任何指令可以在任何寻址模式下使用任何寄存器,则该指令集被称为正交指令。该术语是通过将指令视为向量而产生的,其向量是指令字段。一个字段标识要操作的寄存器,另一个字段指定寻址模式。正交指令集唯一地编码寄存器和寻址模式的所有组合。


噢,谢谢,我刚刚访问了此存根en.wikipedia.org/wiki/Orthogonality_%28programming%29 对不起。
AhmetB-Google

1

维基百科

正交性是一种系统设计属性,可促进复杂设计的可行性和紧凑性。正交性保证修改由系统组件产生的技术效果既不会产生副作用,也不会将副作用传播到系统的其他组件。由组件组成的系统的紧急行为应严格通过其逻辑的形式定义来控制,而不应由不良集成(即模块和接口的非正交设计)引起的副作用所控制。正交性减少了测试和开发时间,因为更容易验证既不会引起副作用也不会依赖副作用的设计。

例如,一辆汽车具有正交的组件和控件(例如,对汽车进行加速不会影响任何东西,除了与加速功能有关的组件之外)。另一方面,非正交设计可能会影响其转向(例如电子稳定性控制)的转向,或者会影响其悬架的速度。[1] 因此,可以认为这种用法是从数学中正交的使用中得出的:可以将向量投影到子空间上,方法是将其分别投影到一组基本向量的每个成员上,并且在且仅当基本向量为相互正交。

如果任何指令可以在任何寻址模式下使用任何寄存器,则该指令集被称为正交指令。该术语是通过将指令视为向量而产生的,其向量是指令字段。一个字段标识要操作的寄存器,另一个字段指定寻址模式。正交指令集唯一地编码寄存器和寻址模式的所有组合。

简而言之,如果改变一项对另一项没有影响,则两件事是正交的。


1

作为高级语言中缺乏正交性的示例,请考虑C中的以下规则和例外。尽管C具有两种结构化数据类型,即数组和记录(结构),但是可以从函数返回记录,而数组则不能。结构的成员可以是除void或相同类型的结构以外的任何数据类型。数组元素可以是除void或函数以外的任何数据类型。参数是通过值传递的,除非它们是数组,否则实际上是通过引用传递的(因为在C程序中出现没有下标的数组名称的情况被解释为数组第一个元素的地址)


0

在编程语言中,如果编程语言功能不受任何限制(或例外)的限制,则可以说它是正交的。例如,在Pascal中,函数不能返回结构化类型。这是对从函数返回值的限制。因此,我们将其视为非正交特征。;)


0

编程中的正交性:

正交性是一个重要的概念,致力于解决如何以相对较少的方式组合相对较少的组件以获得所需结果的问题。它与简单有关。设计越正交,例外就越少。这使得以编程语言学习,读取和编写程序变得更加容易。正交特征的含义与上下文无关。关键参数是对称性和一致性(例如,指针是正交的概念)。

来自维基百科


0

编程语言中的正交性意味着可以以相对较少的几种方式组合相对少量的原始构造,以构建该语言的控制和数据结构。此外,原语的所有可能组合都是合法且有意义的。例如,考虑数据类型。假设一种语言具有四种原始数据类型(整数,浮点,双精度和字符)和两种类型运算符(数组和指针)。如果可以将两种类型的运算符应用于自身以及四种原始数据类型,则可以定义大量的数据结构。正交语言功能的含义与其在程序中出现的上下文无关。(正交一词来自正交矢量的数学概念,正交矢量彼此独立。正交性源自本构关系之间的对称关系。缺乏正交性会导致语言规则的例外。例如,在支持指针的编程语言中,应该可以定义一个指针,以指向该语言中定义的任何特定类型。但是,如果不允许指针指向数组,则无法定义许多潜在有用的用户定义数据结构。通过比较IBM大型机和VAX系列小型计算机的汇编语言的一个方面,我们可以说明正交性作为一种设计概念的使用。我们考虑一种简单的情况:将两个32位整数值(驻留在存储器或寄存器中)相加,然后用和替换两个值之一。IBM大型机为此有两个说明,

A Reg1, memory_cell
AR Reg1, Reg2

其中Reg1和Reg2代表寄存器。这些的语义是

Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)

用于32位整数值的VAX加法指令为

ADDL operand_1, operand_2

其语义是

operand_2 ← contents(operand_1) + contents(operand_2)

在这种情况下,操作数都可以是寄存器或存储单元。VAX指令设计是正交的,因为一条指令可以使用寄存器或存储单元作为操作数。有两种指定操作数的方式,可以以所有可能的方式进行组合。IBM设计不是正交的。在四种操作数组合可能性中,只有两种是合法的,并且两种需要不同的指令A和AR。IBM设计受到更多限制,因此可写性更差。例如,您不能将两个值相加并将总和存储在存储位置中。此外,由于这些限制和附加说明,IBM设计更加难以学习。正交性与简单性密切相关:语言的设计越正交,语言规则要求的例外就越少。更少的例外意味着设计中的规则性更高,这使得语言更易于学习,阅读和理解。任何学习过英语重要内容的人都可以证明难以学习其许多规则异常(例如,i在e之前的e,在c之后的除外)。


0

正交性是指语言由一组独立的原始构造组成的程度,这些构造可以根据需要组合在一起以表示程序。如果要素的组合方式不受限制,则要素是正交的

Example : non-orthogonality

PASCAL:函数无法返回结构化类型。功能语言是高度正交的。


0

正交性的基本思想是,在概念上不相关的事物不应在系统中相关。架构中实际上与其他无关的部分,例如数据库和UI,不需要一起更改。对一个进行更改不应导致对另一个进行更改。


-5

检查矩阵的正交性:

正交性也可以与矩阵有关,

Matrix *(transpose of matrix)= identity matrix. 

点击下面的链接,观看有关正交性的YouTube视频。
https://youtu.be/tNekLaxnfW8


问题显然与编程有关。
aggsol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.