「直交性」とは何ですか?


回答:


255

直交性は、「Aを変更してもBを変更しない」という意味の特性です。直交システムの例はラジオであり、ステーションを変更しても音量は変更されず、その逆も同様です。

非直交システムは、速度を変えると方向を変えることができるヘリコプターのようなものです。

プログラミング言語では、これは、命令を実行すると、その命令しか発生しないことを意味します(デバッグには非常に重要です)。

命令セットを参照する場合にも特定の意味があります


この答えは、信号とシステムの「重ね合わせ」理論を思い出させます。
Özgür

1
この単語のさまざまな用法についての非常に明確な説明:c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano

では、関数型プログラミングは完全に直交していますか?
corazza 2013年

それは興味深い質問です@yannbane。理論的には、理論的な関数型言語に応じて、それは本当かもしれません。実際には、いいえ、関数型言語でさえ状態を変更する方法があります。
C.ロス

1
ヘリコプターの例は「実用的なプログラマ」からのものだと思います:)
Sreekanth Karumanaghat

36

エリックS.レイモンドの「Art of UNIX programming」から

直交性は、複雑な設計でもコンパクトにするのに役立つ最も重要な特性の1つです。完全に直交する設計では、操作に副作用はありません。各アクション(API呼び出し、マクロ呼び出し、または言語操作のいずれか)は、他に影響を与えることなく1つの変更のみを行います。制御しているシステムの各プロパティを変更する方法は1つだけです。



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、2009年

LOL私はこの本を使用していて、本のオンラインクイズでこの質問を見ました。なんて偶然。多分私も最初の章を読むべきです。
AhmetB-Google、2009年

2
単に、リターンと配列を組み合わせると、より複雑になるというだけです。配列間の相互作用を考慮せずに、配列の周りでリターンを使用することはできません。理想的には、戻り値の意味と配列が何であるかを理解し、配列を返すことで何ができるかを理解しますが、実際には、Cが配列(および戻り値)の実装の詳細を公開しているため、それよりも複雑です。
リーB

この「直交」の意味は、en.wikipedia.org / wiki/ Orthogonality_( programming)でカバーされていますが、コンテンツがほとんどない新しいページです。
outis

1
これは、プログラミングの文脈における直交性についての「より正しい」答えです。「直交性」とは、プログラミング構成を他の構成と混在させることができ、そのセマンティクスは同じままであることを意味します。
treecoder、2015

11

おおまかに言って、直交性とは、相互に最小限の影響しか及ぼさない2つのものの関係です。

この用語は数学に由来しており、2つのベクトルが直角に交差する場合は直交します。

典型的な2次元のデカルト空間(X / Y軸を持つ典型的なグリッド)について考えてください。x = 1とy = 1の2つの線をプロットします。2本の線は直交しています。xを変更することでx = 1を変更できますが、これは他の行に影響を与えません。逆も同様です。

ソフトウェアでは、この用語は、互いに独立して動作するシステムの2つの部分について話している状況で適切に使用できます。


5

答えのほとんどは非常に長く、あいまいです。重要なのは、ツールが直交している場合、他のすべてを台無しにすることなく、より良いツールを優先して、追加、交換、または削除できることです。

それは、ハンマーとソーのどちらかを使用できる大工と、ハンマーやソーイングに使用できる大工と、または木材を鋸で挽いてから一緒にハンマーで叩くように設計された新しいハンマー/ソーコンボの違いです。どちらも、のこぎりと一緒にハンマーで打つために機能しますが、たたきが必要であるがハンマーではないタスクがある場合は、直交ツールのみが機能します。同様に、ハンマーの代わりにねじで締める必要がある場合、ハンマーが直交している(混ざっていない)場合は、のこぎりを捨てる必要はありません。

典型的な例はUNIXコマンドラインツールです。ディスクのコンテンツを取得するためのツール(dd)、ファイルから行をフィルタリングするためのツール(grep)、それらの行をファイルに書き込むためのツール(cat)などがあります。すべてを自由に組み合わせることができます。


2

プログラミング言語に関するプロジェクトの決定について話している間、直交性は、過去に見たものについてその言語について他のことを予測することがどれほど簡単であると見なされるかもしれません。

たとえば、ある言語では次のことが可能です。

str.split

文字列を分割し、

len(str)

長さを得るために。

より直交する言語では、常にstr.xまたはx(str)を使用します。

オブジェクトのクローンを作成するか何かをするとき、あなたは

clone(obj)

または

obj.clone

これは、直交するプログラミング言語の主要なポイントの1つです。これにより、マニュアルを参照したり、誰かに尋ねたりする必要がなくなります。

ウィキペディアの記事では、複雑なデザインや低水準言語の直交性について詳しく説明しています。上記のコメントで誰かが提案したように、セベスタの本は直交性について明確に述べています。

私が1つの文のみを使用する場合、その未知の部分があなたが見たものに基づいて期待どおりに機能するとき、プログラミング言語は直交していると言えます。または...驚きはありません。

;)


この答えは他の人に一貫していません。これは、「より少ない結合」または「副作用なし」の線上にある他のものとは対照的に、関数呼び出しまたは全体的な構造間の一貫性を主張するだけです。
Özgür

これは私がよく聞いた使い方です。それが直交している理由は、X.ToStringとX.GetTypeがある場合、オブジェクトを変更して構文を同じにすることができるか、関数を変更して構文を同じにすることができるためだと思います。オブジェクトは機能から独立しています。
dwidel

1

ウィキペディアから:

コンピュータサイエンス

直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性は、システムのコンポーネントによって生成された技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりしないことを保証します。コンポーネントで構成されるシステムの緊急時の動作は、論理の正式な定義によって厳密に制御する必要があります。統合が不十分なために生じる副作用、つまりモジュールとインターフェースの非直交設計によって制御する必要はありません。直交性により、副作用を引き起こしたり、依存したりしない設計を検証することが容易になるため、テストと開発の時間が短縮されます。

たとえば、自動車には直交するコンポーネントとコントロールがあります(たとえば、車両の加速は、加速機能にのみ関連するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ(電子安定性制御など)に影響を与えたり、速度がサスペンションを微調整したりする場合があります。1その結果、この使用法は数学での直交の使用から派生していると考えられます:基底ベクトルのセットの各メンバーに個別に投影し、基底ベクトルの場合に限り投影を追加することにより、ベクトルを部分空間に投影できます相互に直交しています。

任意の命令が任意のアドレッシングモードで任意のレジスタを使用できる場合、命令セットは直交しているといいます。この用語は、命令をその構成要素が命令フィールドであるベクトルと見なすことから生じます。1つのフィールドは操作対象のレジスターを識別し、もう1つのフィールドはアドレッシングモードを指定します。直交命令セットは、レジスタとアドレッシングモードのすべての組み合わせを一意にエンコードします。


ああありがとう私はこのスタブen.wikipedia.org/wiki/Orthogonality_%28programming%29にアクセスしたところ です。
AhmetB-2009年

1

ウィキペディアから:

直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性は、システムのコンポーネントによって生成された技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりしないことを保証します。コンポーネントで構成されるシステムの緊急時の動作は、論理の正式な定義によって厳密に制御する必要があります。統合が不十分なために生じる副作用、つまりモジュールとインターフェースの非直交設計によって制御する必要はありません。直交性により、副作用を引き起こしたり、依存したりしない設計を検証することが容易になるため、テストと開発の時間が短縮されます。

たとえば、自動車には直交するコンポーネントとコントロールがあります(たとえば、車両の加速は、加速機能にのみ関連するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ(電子安定制御など)に影響を与えたり、速度がサスペンションを微調整したりする場合があります[1]。その結果、この使用法は数学での直交の使用から派生していると見なされます。1つは基底ベクトルのセットの各メンバーに個別に投影し、基底ベクトルが相互に直交します。

任意の命令が任意のアドレッシングモードで任意のレジスタを使用できる場合、命令セットは直交しているといいます。この用語は、命令をその構成要素が命令フィールドであるベクトルと見なすことから生じます。1つのフィールドは操作対象のレジスターを識別し、もう1つのフィールドはアドレッシングモードを指定します。直交命令セットは、レジスタとアドレッシングモードのすべての組み合わせを一意にエンコードします。

可能な限り簡単に言えば、一方を変更しても他方に影響がない場合、2つのことが直交します。


1

高水準言語での直交性の欠如の例として、Cの次の規則と例外を検討してください。Cには2種類の構造化データ型、配列とレコード(構造体)がありますが、レコードは関数から返すことができますが、配列はできません。構造体のメンバーは、voidまたは同じ型の構造体を除く任意のデータ型にすることができます。配列要素は、voidまたは関数を除く任意のデータ型にすることができます。パラメータは、配列である場合を除いて、値によって渡されます。その場合、実際には、参照によって渡されます(Cプログラムで添え字のない配列名の出現は、配列の最初の要素のアドレスと解釈されるため)。


0

プログラミング言語では、制限(または例外)なしで制限されている場合、プログラミング言語機能は直交していると言われます。たとえば、Pascalでは、関数は構造型を返すことができません。これは、関数からの戻り値の制限です。したがって、これは非直交機能と見なされます。;)


0

プログラミングにおける直交性:

直交性は重要な概念であり、比較的少数のコンポーネントを比較的少数の方法で組み合わせて目的の結果を得る方法に対処します。それは単純さに関連しています。設計がより直交するほど、例外は少なくなります。これにより、プログラミング言語でのプログラムの学習、読み取り、および書き込みが容易になります。直交特徴の意味は、コンテキストに依存しません。重要なパラメーターは対称性と一貫性です(たとえば、ポインターは直交する概念です)。

ウィキペディアから


0

プログラミング言語の直交性とは、比較的少数のプリミティブコンストラクトのセットを比較的少数の方法で組み合わせて、言語の制御およびデータ構造を構築できることを意味します。さらに、可能なすべてのプリミティブの組み合わせは合法で意味があります。たとえば、データ型について考えます。言語に4つのプリミティブデータ型(整数、浮動小数点、倍精度浮動小数点数、および文字)と2つの型演算子(配列とポインター)があるとします。2つの型演算子をそれ自体と4つのプリミティブデータ型に適用できる場合、多数のデータ構造を定義できます。直交言語機能の意味は、プログラムでのその出現のコンテキストとは無関係です。(直交という言葉は、互いに独立している直交ベクトルの数学的概念に由来します。)直交性は、プリミティブ間の関係の対称性から生じます。直交性の欠如は、言語の規則の例外につながります。たとえば、ポインターをサポートするプログラミング言語では、その言語で定義されている特定の型を指すポインターを定義できるはずです。ただし、ポインターが配列を指すことが許可されていない場合、多くの潜在的に有用なユーザー定義データ構造を定義できません。IBMのメインフレームコンピュータとVAXシリーズのミニコンピュータのアセンブリ言語の1つの側面を比較することにより、設計概念としての直交性の使用を説明できます。単一の単純な状況を考慮します。メモリまたはレジスタにある2つの32ビット整数値を追加し、2つの値の1つを合計に置き換えます。IBMメインフレームには、この目的のために2つの指示があります。

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命令の設計は直交しており、1つの命令でレジスタまたはメモリセルをオペランドとして使用できます。オペランドを指定するには2つの方法があり、すべての可能な方法で組み合わせることができます。IBMの設計は直交ではありません。4つのオペランドの組み合わせのうち2つだけが有効であり、2つは異なる命令AおよびARを必要とします。IBMの設計はより制限されているため、書き込みが少なくなっています。たとえば、2つの値を加算して合計をメモリ位置に保存することはできません。さらに、制限と追加の指示があるため、IBMの設計を学ぶのはより困難です。直交性は単純さと密接に関連しています。言語の設計が直交的であるほど、言語ルールで必要な例外は少なくなります。例外が少ないほど、デザインの規則性が高くなり、言語の学習、読み取り、理解が容易になります。英語のかなりの部分を学んだ人なら誰でも、その多くの規則の例外(たとえば、cの後を除いてiの前にe)を学ぶことの難しさを証明することができます。


0

直交性とは、プログラムを表現するために必要に応じて組み合わせることができる一連の独立したプリミティブ構造から言語が構成される度合いを意味します。機能を組み合わせる方法に制限がない場合、機能は直交します。

Example : non-orthogonality

PASCAL:関数は構造型を返すことができません。関数型言語は非常に直交しています。


0

直交性の基本的な考え方は、概念的に関連していないものはシステムで関連してはならないということです。データベースやUIなど、他のものとまったく関係のないアーキテクチャの部分は、一緒に変更する必要はありません。一方を変更しても、もう一方は変更されません。


-5

行列の直交性をチェックします。

直交性は行列に関しても可能です。

Matrix *(transpose of matrix)= identity matrix. 

直交性に関するYouTubeビデオを表示するには、以下のリンクをクリックしてください。
https://youtu.be/tNekLaxnfW8


問題は明らかにプログラミングです。
aggsol 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.