Che cos'è l '"ortogonalità"?


Risposte:


255

L'ortogonalità è la proprietà che significa "Cambiare A non cambia B". Un esempio di sistema ortogonale potrebbe essere una radio, dove cambiando stazione non si cambia il volume e viceversa.

Un sistema non ortogonale sarebbe come un elicottero in cui cambiare la velocità può cambiare la direzione.

Nei linguaggi di programmazione questo significa che quando si esegue un'istruzione, non accade nient'altro che quell'istruzione (molto importante per il debug).

C'è anche un significato specifico quando si fa riferimento ai set di istruzioni .


Questa risposta mi ricorda la teoria della "sovrapposizione" da segnali e sistemi.
Özgür

1
Una spiegazione molto chiara dei diversi usi di questa parola: c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano

Quindi la programmazione funzionale è completamente ortogonale?
corazza

Questa è una domanda interessante @yannbane. In teoria, a seconda del linguaggio funzionale teorico, potrebbe essere vero. In pratica no, anche i linguaggi funzionali hanno modi per cambiare stato.
C. Ross

1
Scommetto che l'esempio dell'elicottero proviene da "Pragmatic Programmer" :)
Sreekanth Karumanaghat

36

Da "Art of UNIX programming" di Eric S. Raymond

L'ortogonalità è una delle proprietà più importanti che può aiutare a rendere compatti anche progetti complessi. In un disegno puramente ortogonale, le operazioni non hanno effetti collaterali; ogni azione (che si tratti di una chiamata API, di una chiamata di macro o di un'operazione di linguaggio) cambia solo una cosa senza influire sugli altri. C'è un solo modo per cambiare ogni proprietà di qualunque sistema tu stia controllando.


16

Pensa che è in grado di cambiare una cosa senza avere un effetto invisibile su un'altra parte.


12

Se hai una serie di costrutti. Si dice che una lingua sia ortogonale se consente al programmatore di mescolare liberamente questi costrutti. Ad esempio, in C non è possibile restituire un array (array statico), in questo caso si dice che C non è riconosciuto:

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.

In realtà l'ho visto nel mio libro e ancora non capisco cosa sia.
AhmetB - Google

LOL Sto usando questo libro e ho visto questa domanda sul quiz online del libro. Che coincidenza. Forse dovrei leggere anche il primo capitolo.
AhmetB - Google

2
Sta semplicemente dicendo che return e array sono più complessi quando messi insieme: non puoi usare return intorno agli array senza pensare all'interazione tra loro. Idealmente, sapresti cosa significa return e cos'è un array, quindi sapresti cosa farebbe restituire un array, ma in realtà è più complesso di così, perché C espone i dettagli di implementazione sugli array (e return).
Lee B

Questo senso di "ortogonale" è coperto da: en.wikipedia.org/wiki/Orthogonality_(programming) , ma è una nuova pagina con pochi contenuti.
uscita il

1
Questa è la risposta "più giusta" sull'ortogonalità nel contesto della programmazione. "ortogonalità" significa che un costrutto di programmazione può essere mischiato con qualsiasi altro costrutto e la sua semantica rimarrà la stessa.
Treecoder

11

In generale, l'ortogonalità è una relazione tra due cose tale che hanno un effetto minimo l'una sull'altra.

Il termine deriva dalla matematica, dove due vettori sono ortogonali se si intersecano ad angolo retto.

Pensa a un tipico spazio cartesiano bidimensionale (la tipica griglia con assi X / Y). Traccia due linee: x = 1 e y = 1. Le due linee sono ortogonali. Puoi cambiare x = 1 cambiando x, e questo non avrà effetto sull'altra linea e viceversa.

Nel software, il termine può essere utilizzato in modo appropriato in situazioni in cui si parla di due parti di un sistema che si comportano indipendentemente l'una dall'altra.


5

La maggior parte delle risposte sono molto prolisse e persino oscure. Il punto è: se uno strumento è ortogonale, può essere aggiunto, sostituito o rimosso, a favore di strumenti migliori, senza rovinare tutto il resto.

È la differenza tra un falegname che ha un martello e una sega, che può essere utilizzata per martellare o segare, o avere una combo martello / sega nuova, progettata per segare il legno, quindi martellarlo insieme. Entrambi funzioneranno per segare e poi martellare insieme, ma se ottieni qualche compito che richiede il taglio, ma non il martello, allora funzioneranno solo gli strumenti ortogonali. Allo stesso modo, se hai bisogno di avvitare invece di martellare, non avrai bisogno di gettare via la sega, se è ortogonale (non confusa con) il tuo martello.

L'esempio classico sono gli strumenti a riga di comando unix: hai uno strumento per ottenere il contenuto di un disco (dd), un altro per filtrare le righe dal file (grep), un altro per scrivere quelle righe su un file (cat), ecc. possono essere mescolati e abbinati a piacimento.


2

Mentre parli delle decisioni di progetto sui linguaggi di programmazione, l'ortogonalità può essere visto come quanto sia facile per te prevedere altre cose su quel linguaggio per ciò che hai visto in passato.

Ad esempio, in una lingua puoi avere:

str.split

per dividere una stringa e

len (str)

per ottenere la lunghezza.

In una lingua più ortogonale, useresti sempre str.x o x (str).

Quando clonereste un oggetto o fareste qualcos'altro, sapreste se usarlo

clone (obj)

o

obj.clone

Questo è uno dei punti principali del fatto che i linguaggi di programmazione siano ortogonali. Ciò ti evita di consultare il manuale o di chiedere a qualcuno.

L'articolo di wikipedia parla di più sull'ortogonalità su progetti complessi o linguaggi di basso livello. Come qualcuno ha suggerito sopra in un commento, il libro di Sebesta parla chiaramente di ortogonalità.

Se usassi solo una frase, direi che un linguaggio di programmazione è ortogonale quando le sue parti sconosciute agiscono come previsto in base a ciò che hai visto. Oppure ... nessuna sorpresa.

;)


Questa risposta non è coerente con gli altri; questo rivendica solo la coerenza tra le chiamate di funzione o la struttura complessiva in contrasto con altre che sono sulla falsariga di "meno accoppiamento" o "assenza di effetti collaterali".
Özgür

Questo è l'uso che di solito ho sentito. Penso che il motivo per cui è ortogonale è che se hai X.ToString e X.GetType, puoi variare l'oggetto e la sintassi è la stessa, oppure puoi variare la funzione e la sintassi è la stessa. L'oggetto è indipendente dalla funzione.
dwidel

1

da wikipedia :

Informatica

L'ortogonalità è una proprietà di progettazione del sistema che facilita la fattibilità e la compattezza di progetti complessi. L'ortogonalità garantisce che la modifica dell'effetto tecnico prodotto da un componente di un sistema non crea né propaga effetti collaterali ad altri componenti del sistema. Il comportamento emergente di un sistema costituito da componenti dovrebbe essere controllato rigorosamente da definizioni formali della sua logica e non da effetti collaterali derivanti da una scarsa integrazione, ad esempio un design non ortogonale di moduli e interfacce. L'ortogonalità riduce i tempi di test e sviluppo perché è più facile verificare i progetti che non causano effetti collaterali né dipendono da essi.

Ad esempio, un'auto ha componenti e comandi ortogonali (es. Accelerare il veicolo non influenza nient'altro che i componenti coinvolti esclusivamente con la funzione di accelerazione). D'altra parte, un progetto non ortogonale potrebbe avere il suo sterzo che influenza la sua frenata (ad esempio il controllo elettronico della stabilità), o la sua velocità potrebbe modificare le sue sospensioni. 1 Di conseguenza, questo uso è visto come derivato dall'uso di ortogonale in matematica: si può proiettare un vettore su un sottospazio proiettandolo su ciascun membro di un insieme di vettori di base separatamente e aggiungendo le proiezioni se e solo se i vettori di base sono reciprocamente ortogonali.

Un insieme di istruzioni si dice ortogonale se qualsiasi istruzione può utilizzare qualsiasi registro in qualsiasi modalità di indirizzamento. Questa terminologia risulta dal considerare un'istruzione come un vettore i cui componenti sono i campi dell'istruzione. Un campo identifica i registri su cui operare e un altro specifica la modalità di indirizzamento. Un set di istruzioni ortogonali codifica in modo univoco tutte le combinazioni di registri e modalità di indirizzamento.


Oh grazie ho appena visitato questo stub en.wikipedia.org/wiki/Orthogonality_%28programming%29 Scusa.
AhmetB - Google

1

Da Wikipedia :

L'ortogonalità è una proprietà di progettazione del sistema che facilita la fattibilità e la compattezza di progetti complessi. L'ortogonalità garantisce che la modifica dell'effetto tecnico prodotto da un componente di un sistema non crea né propaga effetti collaterali ad altri componenti del sistema. Il comportamento emergente di un sistema costituito da componenti dovrebbe essere controllato rigorosamente da definizioni formali della sua logica e non da effetti collaterali derivanti da una scarsa integrazione, ad esempio un design non ortogonale di moduli e interfacce. L'ortogonalità riduce i tempi di test e sviluppo perché è più facile verificare i progetti che non causano effetti collaterali né dipendono da essi.

Ad esempio, un'auto ha componenti e comandi ortogonali (es. Accelerare il veicolo non influenza nient'altro che i componenti coinvolti esclusivamente con la funzione di accelerazione). D'altra parte, un design non ortogonale potrebbe avere il suo sterzo che influenza la sua frenata (ad esempio il controllo elettronico della stabilità), o la sua velocità potrebbe modificare le sue sospensioni. [1] Di conseguenza, questo uso è visto come derivato dall'uso di ortogonale in matematica: si può proiettare un vettore su un sottospazio proiettandolo su ciascun membro di un insieme di vettori di base separatamente e aggiungendo le proiezioni se e solo se i vettori di base sono mutuamente ortogonali.

Un insieme di istruzioni si dice ortogonale se qualsiasi istruzione può utilizzare qualsiasi registro in qualsiasi modalità di indirizzamento. Questa terminologia risulta dal considerare un'istruzione come un vettore i cui componenti sono i campi dell'istruzione. Un campo identifica i registri su cui operare e un altro specifica la modalità di indirizzamento. Un set di istruzioni ortogonali codifica in modo univoco tutte le combinazioni di registri e modalità di indirizzamento.

Per dirla nei termini più semplici possibili, due cose sono ortogonali se cambiare l'una non ha effetto sull'altra.


1

Come esempi della mancanza di ortogonalità in un linguaggio di alto livello, considerare le seguenti regole ed eccezioni in C. Sebbene C abbia due tipi di tipi di dati strutturati, array e record (struct), i record possono essere restituiti dalle funzioni ma gli array no. Un membro di una struttura può essere qualsiasi tipo di dati tranne void o una struttura dello stesso tipo. Un elemento array può essere qualsiasi tipo di dati tranne void o una funzione. I parametri vengono passati per valore, a meno che non siano array, nel qual caso sono, in effetti, passati per riferimento (perché l'aspetto del nome di un array senza pedice in un programma C è interpretato come l'indirizzo del primo elemento dell'array)


0

Nei linguaggi di programmazione si dice che una caratteristica del linguaggio di programmazione è ortogonale se è limitata senza restrizioni (o eccezioni). Ad esempio, in Pascal le funzioni non possono restituire tipi strutturati. Questa è una restrizione sulla restituzione di valori da una funzione. Pertanto è considerato come una caratteristica non ortogonale. ;)


0

Ortogonalità nella programmazione:

L'ortogonalità è un concetto importante, che riguarda il modo in cui un numero relativamente piccolo di componenti può essere combinato in un numero relativamente piccolo di modi per ottenere i risultati desiderati. È associato alla semplicità; più ortogonale è il design, meno eccezioni. Ciò rende più facile imparare, leggere e scrivere programmi in un linguaggio di programmazione. Il significato di una caratteristica ortogonale è indipendente dal contesto; i parametri chiave sono la simmetria e la coerenza (ad esempio, un puntatore è un concetto ortogonale).

da Wikipedia


0

L'ortogonalità in un linguaggio di programmazione significa che un insieme relativamente piccolo di costrutti primitivi può essere combinato in un numero relativamente piccolo di modi per costruire il controllo e le strutture dati del linguaggio. Inoltre, ogni possibile combinazione di primitive è legale e significativa. Ad esempio, considera i tipi di dati. Supponiamo che un linguaggio abbia quattro tipi di dati primitivi (intero, float, double e carattere) e due operatori di tipo (array e puntatore). Se i due operatori di tipo possono essere applicati a se stessi e ai quattro tipi di dati primitivi, è possibile definire un gran numero di strutture di dati. Il significato di una caratteristica del linguaggio ortogonale è indipendente dal contesto della sua comparsa in un programma. (la parola ortogonale deriva dal concetto matematico di vettori ortogonali, che sono indipendenti l'uno dall'altro. ) L'ortogonalità deriva da una simmetria di relazioni tra primitive. Una mancanza di ortogonalità porta a eccezioni alle regole della lingua. Ad esempio, in un linguaggio di programmazione che supporta i puntatori, dovrebbe essere possibile definire un puntatore che punti a qualsiasi tipo specifico definito nel linguaggio. Tuttavia, se i puntatori non sono autorizzati a puntare a array, molte strutture di dati definite dall'utente potenzialmente utili non possono essere definite. Possiamo illustrare l'uso dell'ortogonalità come concetto di progettazione confrontando un aspetto dei linguaggi assembly dei computer mainframe IBM e della serie VAX di minicomputer. Consideriamo un'unica semplice situazione: aggiungendo due valori interi a 32 bit che risiedono nella memoria o nei registri e sostituendo uno dei due valori con la somma. I mainframe IBM hanno due istruzioni per questo scopo,

A Reg1, memory_cell
AR Reg1, Reg2

dove Reg1 e Reg2 rappresentano i registri. La semantica di questi sono

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

L'istruzione di aggiunta VAX per i valori interi a 32 bit è

ADDL operand_1, operand_2

la cui semantica è

operand_2 ← contents(operand_1) + contents(operand_2)

In questo caso, uno degli operandi può essere un registro o una cella di memoria. Il design dell'istruzione VAX è ortogonale in quanto una singola istruzione può utilizzare registri o celle di memoria come operandi. Esistono due modi per specificare gli operandi, che possono essere combinati in tutti i modi possibili. Il design IBM non è ortogonale. Solo due delle quattro possibilità di combinazione di operandi sono legali e le due richiedono istruzioni diverse, A e AR. Il design IBM è più limitato e quindi meno scrivibile. Ad esempio, non è possibile aggiungere due valori e memorizzare la somma in una posizione di memoria. Inoltre, il design IBM è più difficile da apprendere a causa delle restrizioni e delle istruzioni aggiuntive. L'ortogonalità è strettamente correlata alla semplicità: più ortogonale è il design di una lingua, meno eccezioni richiedono le regole del linguaggio. Meno eccezioni significano un più alto grado di regolarità nel design, che rende la lingua più facile da imparare, leggere e capire. Chiunque abbia appreso una parte significativa della lingua inglese può testimoniare la difficoltà di apprendere le sue numerose eccezioni alle regole (ad esempio, i prima e tranne dopo c).


0

Per ortogonalità si intende il grado in cui il linguaggio è costituito da un insieme di costrutti primitivi indipendenti che possono essere combinati secondo necessità per esprimere un programma. Le caratteristiche sono ortogonali se non ci sono restrizioni su come possono essere combinate

Example : non-orthogonality

PASCAL: le funzioni non possono restituire tipi strutturati. I linguaggi funzionali sono altamente ortogonali.


0

L'idea di base dell'ortogonalità è che le cose che non sono concettualmente correlate non dovrebbero essere correlate nel sistema. Parti dell'architettura che in realtà non hanno nulla a che fare con l'altra, come il database e l'interfaccia utente, non dovrebbero essere modificate insieme. Un cambiamento in uno non dovrebbe causare un cambiamento nell'altro.


-5

Verifica ortogonalità delle matrici:

L'ortogonalità può essere anche rispetto alle matrici,

Matrix *(transpose of matrix)= identity matrix. 

Fare clic sul collegamento sottostante per visualizzare un video di YouTube sull'ortogonalità.
https://youtu.be/tNekLaxnfW8


La domanda è ovviamente sulla programmazione.
aggsol
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.