O que é "ortogonalidade"?

124

O que significa "ortogonalidade" quando se fala em linguagens de programação?

Quais são alguns exemplos de ortogonalidade?

AhmetB - Google
fonte

Respostas:

255

Ortogonalidade é a propriedade que significa "Alterar A não altera B". Um exemplo de sistema ortogonal seria um rádio, onde a mudança de estação não altera o volume e vice-versa.

Um sistema não ortogonal seria como um helicóptero, onde a mudança de velocidade pode mudar a direção.

Nas linguagens de programação, isso significa que, quando você executa uma instrução, nada além dessa instrução acontece (muito importante para a depuração).

Há também um significado específico ao se referir a conjuntos de instruções .

Cruz
fonte
Essa resposta me lembra a teoria da "superposição" de sinais e sistemas.
Özgür
1
Uma explicação muito clara das diferentes usos desta palavra: c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano
Então, a programação funcional é completamente ortogonal?
Corazza 11/10
Essa é uma pergunta interessante @yannbane. Em teoria, dependendo da linguagem funcional teórica, pode ser verdade. Na prática, não, mesmo as linguagens funcionais têm maneiras de mudar de estado.
117813 C. Ross
1
Aposto que o exemplo helicóptero é de "programador pragmático" :)
Sreekanth Karumanaghat
36

De "Arte da programação UNIX" de Eric S. Raymond

A ortogonalidade é uma das propriedades mais importantes que podem ajudar a compactar projetos complexos. Em um design puramente ortogonal, as operações não têm efeitos colaterais; cada ação (seja uma chamada de API, uma chamada de macro ou uma operação de idioma) altera apenas uma coisa sem afetar outras. Existe uma e apenas uma maneira de alterar cada propriedade de qualquer sistema que você esteja controlando.

Federico klez Culloca
fonte
16

Pense nisso: é capaz de mudar uma coisa sem ter um efeito invisível em outra parte.

Martin Beckett
fonte
12

Se você tiver um conjunto de construções. Um idioma é ortogonal se permitir que o programador misture essas construções livremente. Por exemplo, em C você não pode retornar uma matriz (matriz estática), C é considerado não-digno de nota neste caso:

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.
AraK
fonte
Na verdade, eu vi isso no meu livro e ainda não entendo o que é isso.
AhmetB - Google
LOL Estou usando este livro e vi essa pergunta no questionário on-line do livro. Que coincidência. Talvez eu devesse ler o primeiro capítulo também.
AhmetB - Google
2
É simplesmente dizer que retorno e matrizes são mais complexos quando reunidos: você não pode usar retorno em torno de matrizes sem pensar na interação entre elas. Idealmente, você saberia o que significa retorno e o que é uma matriz e, portanto, saberia o que retornaria uma matriz, mas, na verdade, é mais complexo que isso, porque C expõe detalhes de implementação sobre matrizes (e retorno).
Lee B
Esse senso de "ortogonal" é coberto por: en.wikipedia.org/wiki/Orthogonality_(programming) , mas é uma nova página com pouco conteúdo.
Outis
1
Esta é a resposta "mais correta" sobre ortogonalidade no contexto da programação. "ortogonalidade" significa que uma construção de programação pode ser misturada com qualquer outra construção e sua semântica permanecerá a mesma.
treecoder
11

Em termos gerais, a ortogonalidade é uma relação entre duas coisas, de modo que elas têm um efeito mínimo uma sobre a outra.

O termo vem da matemática, onde dois vetores são ortogonais se eles se cruzam em ângulos retos.

Pense em um espaço cartesiano bidimensional típico (sua grade típica com eixos X / Y). Plote duas linhas: x = 1 e y = 1. As duas linhas são ortogonais. Você pode alterar x = 1 alterando x, e isso não terá efeito na outra linha e vice-versa.

No software, o termo pode ser usado adequadamente em situações nas quais você está falando de duas partes de um sistema que se comportam independentemente uma da outra.

timdev
fonte
5

A maioria das respostas é muito longa e até obscura. O ponto é: se uma ferramenta é ortogonal, ela pode ser adicionada, substituída ou removida, em favor de ferramentas melhores, sem estragar tudo o resto.

É a diferença entre um carpinteiro que tem um martelo e uma serra, que pode ser usado para martelar ou serrar, ou ter um novo conjunto de martelo / serra novo, projetado para serrar madeira e depois martelar. Qualquer um deles funcionará para serrar e depois martelar juntos, mas se você tiver alguma tarefa que exija serrar, mas não martelar, apenas as ferramentas ortogonais funcionarão. Da mesma forma, se você precisar parafusar em vez de martelar, não precisará jogar fora sua serra, se for ortogonal (não misturado) ao seu martelo.

O exemplo clássico são as ferramentas de linha de comando unix: você tem uma ferramenta para obter o conteúdo de um disco (dd), outra para filtrar linhas do arquivo (grep), outra para gravar essas linhas em um arquivo (cat) etc. todos podem ser misturados e combinados à vontade.

Lee B
fonte
2

Ao falar sobre decisões de projeto em linguagens de programação, a ortogonalidade pode ser vista como é fácil prever outras coisas sobre essa linguagem para o que você viu no passado.

Por exemplo, em um idioma, você pode ter:

str.split

para dividir uma corda e

len (str)

para obter o comprimento.

Em um idioma mais ortogonal, você sempre usaria str.x ou x (str).

Quando você clonaria um objeto ou faria qualquer outra coisa, saberia se deveria usar

clone (obj)

ou

obj.clone

Esse é um dos pontos principais em linguagens de programação ortogonais. Isso evita que você consulte o manual ou pergunte a alguém.

O artigo da Wikipedia fala mais sobre ortogonalidade em projetos complexos ou linguagens de baixo nível. Como alguém sugeriu acima em um comentário, o livro Sebesta fala claramente sobre ortogonalidade.

Se eu usasse apenas uma frase, diria que uma linguagem de programação é ortogonal quando suas partes desconhecidas agem conforme o esperado com base no que você viu. Ou ... sem surpresas.

;)

Asrail
fonte
Esta resposta não é consistente com os outros; isso apenas reivindica consistência entre chamadas de função ou estrutura geral em contraste com outras que estão nas linhas de "menos acoplamento" ou "sem efeito colateral".
Özgür
Este é o uso que eu normalmente ouvi. Eu acho que o motivo é ortogonal é que, se você tiver X.ToString e X.GetType, poderá variar o objeto e a sintaxe é a mesma, ou a função e a sintaxe é a mesma. O objeto é independente da função.
dwidel
1

da wikipedia :

Ciência da Computação

A ortogonalidade é uma propriedade de projeto do sistema que facilita a viabilidade e a compacidade de projetos complexos. A ortogonalidade garante que a modificação do efeito técnico produzido por um componente de um sistema não crie nem propague efeitos colaterais para outros componentes do sistema. O comportamento emergente de um sistema constituído por componentes deve ser controlado estritamente por definições formais de sua lógica e não por efeitos colaterais resultantes de uma má integração, ou seja, design não ortogonal de módulos e interfaces. A ortogonalidade reduz o tempo de teste e desenvolvimento, porque é mais fácil verificar projetos que não causam efeitos colaterais nem dependem deles.

Por exemplo, um carro possui componentes e controles ortogonais (por exemplo, acelerar o veículo não influencia em nada além dos componentes envolvidos exclusivamente com a função de aceleração). Por outro lado, um design não ortogonal pode ter sua direção influenciada na frenagem (por exemplo, controle eletrônico de estabilidade) ou sua velocidade altera sua suspensão. 1 Consequentemente, esse uso é derivado do uso de ortogonais na matemática: pode-se projetar um vetor em um subespaço projetando-o em cada membro de um conjunto de vetores de base separadamente e adicionando as projeções se e somente se os vetores de base são mutuamente ortogonais.

Diz-se que um conjunto de instruções é ortogonal se alguma instrução puder usar qualquer registro em qualquer modo de endereçamento. Essa terminologia resulta da consideração de uma instrução como um vetor cujos componentes são os campos de instrução. Um campo identifica os registradores a serem operados e outro especifica o modo de endereçamento. Um conjunto de instruções ortogonais codifica exclusivamente todas as combinações de registradores e modos de endereçamento.

TheVillageIdiot
fonte
Oh, obrigado. Acabei de visitar este esboço. En.wikipedia.org/wiki/Orthogonality_%28programming%29 Desculpe.
AhmetB - Google
1

Da Wikipedia :

A ortogonalidade é uma propriedade de projeto do sistema que facilita a viabilidade e a compacidade de projetos complexos. A ortogonalidade garante que a modificação do efeito técnico produzido por um componente de um sistema não crie nem propague efeitos colaterais para outros componentes do sistema. O comportamento emergente de um sistema constituído por componentes deve ser controlado estritamente por definições formais de sua lógica e não por efeitos colaterais resultantes de uma má integração, ou seja, design não ortogonal de módulos e interfaces. A ortogonalidade reduz o tempo de teste e desenvolvimento, porque é mais fácil verificar projetos que não causam efeitos colaterais nem dependem deles.

Por exemplo, um carro possui componentes e controles ortogonais (por exemplo, acelerar o veículo não influencia em nada além dos componentes envolvidos exclusivamente com a função de aceleração). Por outro lado, um design não ortogonal pode ter sua direção influenciada na frenagem (por exemplo, controle eletrônico de estabilidade), ou sua velocidade altera sua suspensão. [1] Consequentemente, esse uso é derivado do uso da ortogonal na matemática: pode-se projetar um vetor em um subespaço projetando-o em cada membro de um conjunto de vetores de base separadamente e adicionando as projeções se e somente se os vetores de base forem mutuamente ortogonais.

Diz-se que um conjunto de instruções é ortogonal se alguma instrução puder usar qualquer registro em qualquer modo de endereçamento. Essa terminologia resulta da consideração de uma instrução como um vetor cujos componentes são os campos de instrução. Um campo identifica os registradores a serem operados e outro especifica o modo de endereçamento. Um conjunto de instruções ortogonais codifica exclusivamente todas as combinações de registradores e modos de endereçamento.

Para colocá-lo da forma mais simples possível, duas coisas são ortogonais se a alteração de uma não tiver efeito sobre a outra.

Laurence Gonsalves
fonte
1

Como exemplos da falta de ortogonalidade em uma linguagem de alto nível, considere as seguintes regras e exceções em C. Embora C tenha dois tipos de tipos de dados estruturados, matrizes e registros (estruturas), os registros podem ser retornados das funções, mas as matrizes não. Um membro de uma estrutura pode ser qualquer tipo de dado, exceto nulo ou uma estrutura do mesmo tipo. Um elemento da matriz pode ser qualquer tipo de dado, exceto nulo ou uma função. Os parâmetros são passados ​​por valor, a menos que sejam matrizes e, nesse caso, são passados ​​por referência (porque a aparência de um nome de matriz sem um índice subscrito em um programa C é interpretada como o endereço do primeiro elemento da matriz)

Imaginação
fonte
0

Nas linguagens de programação, um recurso da linguagem de programação é ortogonal se for delimitado sem restrições (ou exceções). Por exemplo, nas funções Pascal não é possível retornar tipos estruturados. Esta é uma restrição ao retornar valores de uma função. Portanto, é considerado um recurso não ortogonal. ;)

Dil
fonte
0

Ortogonalidade na Programação:

A ortogonalidade é um conceito importante, abordando como um número relativamente pequeno de componentes pode ser combinado em um número relativamente pequeno de maneiras de obter os resultados desejados. Está associado à simplicidade; quanto mais ortogonal o design, menos exceções. Isso facilita a aprendizagem, leitura e gravação de programas em uma linguagem de programação. O significado de uma característica ortogonal é independente do contexto; os principais parâmetros são simetria e consistência (por exemplo, um ponteiro é um conceito ortogonal).

da Wikipedia

Majid
fonte
0

Ortogonalidade em uma linguagem de programação significa que um conjunto relativamente pequeno de construções primitivas pode ser combinado em um número relativamente pequeno de maneiras de construir as estruturas de controle e dados da linguagem. Além disso, toda combinação possível de primitivas é legal e significativa. Por exemplo, considere tipos de dados. Suponha que uma linguagem tenha quatro tipos de dados primitivos (número inteiro, flutuante, duplo e caractere) e dois operadores de tipo (matriz e ponteiro). Se os dois operadores de tipo puderem ser aplicados a si mesmos e os quatro tipos de dados primitivos, um grande número de estruturas de dados poderá ser definido. O significado de um recurso de linguagem ortogonal é independente do contexto de sua aparência em um programa. (a palavra ortogonal vem do conceito matemático de vetores ortogonais, que são independentes um do outro. ) A ortogonalidade decorre de uma simetria das relações entre os primitivos. A falta de ortogonalidade leva a exceções às regras da linguagem. Por exemplo, em uma linguagem de programação que suporta ponteiros, deve ser possível definir um ponteiro para apontar para qualquer tipo específico definido na linguagem. No entanto, se os ponteiros não puderem apontar para matrizes, muitas estruturas de dados definidas pelo usuário potencialmente úteis não poderão ser definidas. Podemos ilustrar o uso da ortogonalidade como um conceito de design, comparando um aspecto das linguagens assembly dos computadores mainframe IBM e a série VAX de minicomputadores. Consideramos uma situação simples: adicionar dois valores inteiros de 32 bits que residem na memória ou nos registradores e substituir um dos dois valores pela soma. Os mainframes da IBM têm duas instruções para esse fim,

A Reg1, memory_cell
AR Reg1, Reg2

onde Reg1 e Reg2 representam registros. A semântica destes são

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

A instrução de adição do VAX para valores inteiros de 32 bits é

ADDL operand_1, operand_2

cuja semântica é

operand_2 ← contents(operand_1) + contents(operand_2)

Nesse caso, qualquer operando pode ser um registro ou uma célula de memória. O design da instrução VAX é ortogonal, pois uma única instrução pode usar registradores ou células de memória como operandos. Existem duas maneiras de especificar operandos, que podem ser combinados de todas as maneiras possíveis. O design da IBM não é ortogonal. Apenas duas das quatro possibilidades de combinação de operandos são legais e as duas requerem instruções diferentes, A e AR. O design da IBM é mais restrito e, portanto, menos gravável. Por exemplo, você não pode adicionar dois valores e armazenar a soma em um local de memória. Além disso, o design da IBM é mais difícil de aprender devido às restrições e às instruções adicionais. A ortogonalidade está intimamente relacionada à simplicidade: quanto mais ortogonal o design de um idioma, menos exceções as regras de idioma exigem. Menos exceções significam um maior grau de regularidade no design, o que facilita o aprendizado, a leitura e a compreensão do idioma. Qualquer pessoa que tenha aprendido uma parte significativa da língua inglesa pode testemunhar a dificuldade de aprender suas muitas exceções de regras (por exemplo, i antes de e exceto depois de c).

Imaginação
fonte
0

Ortogonalidade significa o grau em que a linguagem consiste em um conjunto de construções primitivas independentes que podem ser combinadas conforme necessário para expressar um programa. Os recursos são ortogonais se não houver restrições sobre como eles podem ser combinados

Example : non-orthogonality

PASCAL: funções não podem retornar tipos estruturados. Idiomas funcionais são altamente ortogonais.

mali
fonte
0

A idéia básica da ortogonalidade é que coisas que não estão relacionadas conceitualmente não devem estar relacionadas no sistema. Partes da arquitetura que realmente não têm nada a ver com a outra, como o banco de dados e a interface do usuário, não precisam ser alteradas juntas. Uma alteração em um não deve causar uma alteração no outro.

acohen
fonte
-5

Verifique a ortogonalidade das matrizes:

A ortogonalidade também pode ser em relação a matrizes,

Matrix *(transpose of matrix)= identity matrix. 

Clique no link abaixo para assistir a um vídeo do YouTube sobre Ortogonalidade.
https://youtu.be/tNekLaxnfW8

Roopesh
fonte
A questão é obviamente sobre programação.
aggsol