在谈论编程语言时,“正交性”是什么意思?
正交性的一些例子是什么?
答案 0 :(得分:240)
Orthogonality是指“改变A不会改变B”的属性。正交系统的一个例子是无线电,其中改变电台不改变音量,反之亦然。
非正交系统就像直升机,改变速度可以改变方向。
在编程语言中,这意味着当您执行指令时,除了该指令之外什么都不会发生(对于调试非常重要)。
引用instruction sets时还有一个特定的含义。
答案 1 :(得分:33)
来自Eric S. Raymond的"Art of UNIX programming"
正交性是最重要的特性之一,可以帮助使复杂的设计紧凑。在纯粹的正交设计中,操作没有副作用;每个动作(无论是API调用,宏调用还是语言操作)只改变一件事而不影响其他动作。有一种方法可以改变你控制的任何系统的每个属性。
答案 2 :(得分:13)
想想它能够在不对另一部分产生看不见的影响的情况下改变一件事。
答案 3 :(得分:11)
从广义上讲,正交性是两种事物之间的关系,它们对彼此的影响很小。
该术语来自数学,如果两个向量以直角相交,则它们是正交的。
考虑典型的二维笛卡尔空间(您使用X / Y轴的典型网格)。绘制两条线:x = 1,y = 1。两条线是正交的。你可以通过改变x来改变x = 1,这对另一条线没有影响,反之亦然。
在软件中,该术语可以适用于您谈论系统的两个部分彼此独立的情况。
答案 4 :(得分:9)
如果你有一组结构。如果langauge允许程序员自由地混合这些结构,则称其为正交。例如,在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.
答案 5 :(得分:4)
大多数答案都很冗长,甚至模糊不清。关键是:如果工具是正交的,可以添加,替换或删除工具,以支持更好的工具,而不会搞砸其他所有工具。
具有锤子和锯子的木匠之间的区别,可以用于锤击或锯切,或者有一些新的锤子/锯子组合,其设计用于锯木头,然后锤击它们。两者都可以用于锯切然后锤击在一起,但是如果你得到一些需要锯切而不是锤击的任务,那么只有正交工具才能工作。同样地,如果你需要拧螺丝而不是锤击,你就不需要扔掉你的锯子,如果它与你的锤子正交(没有混合)。
经典的例子是unix命令行工具:你有一个用于获取磁盘内容的工具(dd),另一个用于过滤文件中的行(grep),另一个用于将这些行写入文件(cat),这些都可以随意混合和匹配。
答案 6 :(得分:2)
来自wikipedia:
计算机科学
Orthogonality是一种系统设计属性,有助于复杂设计的可行性和紧凑性。正交性保证修改系统组件产生的技术效果既不会创建也不会将副作用传播到系统的其他组件。由组件组成的系统的紧急行为应严格按其逻辑的形式定义来控制,而不是由不良集成产生的副作用控制,即模块和接口的非正交设计。正交性减少了测试和开发时间,因为更容易验证既不会产生副作用也不依赖于它们的设计。
例如,汽车具有正交部件和控制(例如,加速车辆不会影响除了仅涉及加速功能的部件之外的任何其他部件)。另一方面,非正交设计可能会使其转向影响其制动(例如电子稳定性控制),或其速度调整其悬架。1因此,这种用法可以看作是使用正交在数学中:可以将一个向量投影到一个子空间上,将它分别投影到一组基础向量的每个成员上,并且当且仅当基础向量相互正交时才添加投影。如果任何指令可以在任何寻址模式下使用任何寄存器,则称指令集是正交的。该术语是将指令视为向量,其组件是指令字段。一个字段标识要操作的寄存器,另一个字段指定寻址模式。正交指令集唯一地编码寄存器和寻址模式的所有组合。
答案 7 :(得分:2)
来自Wikipedia:
正交性是一种系统设计 财产促进可行性和 复杂设计的紧凑性。 正交性保证了这一点 修改技术效果 由系统的组件产生 既不创造也不传播 对其他组成部分的影响 系统。 a的紧急行为 由组件组成的系统应该 严格控制正式 它的逻辑定义而不是 由于贫穷导致的副作用 积分,即非正交 模块和接口的设计。 正交性减少了测试和 开发时间因为它更容易 验证既不会导致的设计 副作用也不依赖于它们。
例如,汽车具有正交性 组件和控件(例如 加速车辆没有 影响除了之外的任何事情 专门涉及的组件 加速功能)。在 另一方面,非正交设计 可能有它的转向影响力 制动(例如电子稳定性 控制),或其速度调整它 悬浮液。[1]因此,这 用法被认为是源于 在数学中使用正交:一 可以将矢量投影到子空间上 通过将其投射到a的每个成员上 分别设置基础向量和 当且仅当时添加投影 基础向量是相互的 正交的。
据说是指令集 正交,如果任何指令可以使用 任何寻址模式的任何寄存器。 这个术语来自于 将指令视为向量 其组成部分是指令 领域。一个字段标识了 寄存器操作,和 另一个指定寻址模式。 唯一的正交指令集 编码所有寄存器组合 和寻址模式。
用最简单的术语来说,如果改变一个对另一个没有影响,那么两个是正交的。
答案 8 :(得分:1)
在谈论有关编程语言的项目决策时,正交性可能被视为对于您过去所看到的内容,您可以轻松地预测该语言的其他内容。
例如,您可以使用一种语言:
str.split
用于分割字符串和
LEN(STR)
获得长度。
在更正交的语言中,您总是使用str.x或x(str)。
当您克隆对象或执行其他任何操作时,您将知道是否使用
克隆(OBJ)
或
obj.clone
这是编程语言正交的要点之一。这可以避免您查阅手册或询问某人。
维基百科文章更多地讨论了复杂设计或低级语言的正交性。 正如上面有人在评论中提出的那样,Sebesta书中谈到了正交性。
如果我只使用一个句子,我会说当编程语言的未知部分根据您所看到的内容按预期运行时,它是正交的。 或者......没有惊喜。
)
答案 9 :(得分:1)
编程中的正交性:
正交性是一个重要的概念,解决了如何以相对较少的方式组合相对较少数量的组件以获得所需结果。它与简单相关;设计越正交,异常越少。这使得用编程语言更容易学习,读写程序。正交特征的含义与上下文无关;关键参数是对称性和一致性(例如,指针是正交概念)。
答案 10 :(得分:1)
已经有很多答案可以解释正交性,同时又给出一些示例。例如。 this answer explains it well。我想提供(并收集)一些编程语言中正交或非正交特征的现实示例:
在c ++ 20中的cppreference-page about the new Modules system上写着:
模块与namespaces正交
在这种情况下,他们写道模块与名称空间正交,因为类似import foo
的语句不会导入与foo
相关的模块命名空间:
import foo; // foo exports foo::bar()
bar (); // Error
foo::bar (); // Ok
using namespace foo;
bar (); // Ok
(改编自modules-cppcon2017幻灯片9)
答案 11 :(得分:0)
在编程语言中,如果编程语言特征没有限制(或例外),则称其为正交。 例如,在Pascal函数中不能返回结构化类型。这是对函数返回值的限制。因此,我们将其视为非正交特征。 ;)
答案 12 :(得分:0)
正交性是指语言由一组独立的原始构造组成的程度,这些构造可以根据需要进行组合以表达程序。 如果对它们的组合方式没有限制,则特征是正交的
Example : non-orthogonality
PASCAL:函数无法返回结构化类型。 功能语言高度正交。
答案 13 :(得分:0)
正交性的基本思想是,在概念上不相关的事物不应该与系统相关。实际上与另一个无关的架构部分,例如数据库和UI,不需要一起更改。更改为一个不应该导致另一个更改。
答案 14 :(得分:0)
正交性是指概念上不相关的事物不应在系统中相关联,因此体系结构中彼此无关的部分(如数据库和UI)不应一起更改。对系统某一部分的更改不应导致对另一部分的更改。
例如,如果您在屏幕上更改了几行并导致数据库模式发生更改,则这称为耦合。通常,您通常希望使几乎无关的事物之间的耦合最小化,因为它会增长,而且从长远来看,它可能成为维护噩梦的一个噩梦。
答案 15 :(得分:-5)
检查矩阵的正交性:
正交性也可以与矩阵有关,
Matrix *(transpose of matrix)= identity matrix.
点击以下链接查看有关正交性的YouTube视频 https://youtu.be/tNekLaxnfW8