¿Qué es la "ortogonalidad"?


Respuestas:


255

La ortogonalidad es la propiedad que significa "Cambiar A no cambia B". Un ejemplo de un sistema ortogonal sería una radio, donde cambiar la estación no cambia el volumen y viceversa.

Un sistema no ortogonal sería como un helicóptero donde cambiar la velocidad puede cambiar la dirección.

En los lenguajes de programación, esto significa que cuando ejecuta una instrucción, no sucede nada más que esa instrucción (muy importante para la depuración).

También hay un significado específico al referirse a conjuntos de instrucciones .


Esta respuesta me recuerda la teoría de la "superposición" de la señal y los sistemas.
Özgür

1
Una explicación muy clara de los diferentes usos de esta palabra: c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano

Entonces, ¿la programación funcional es completamente ortogonal?
corazza

Esa es una pregunta interesante @yannbane. En teoría, dependiendo del lenguaje teórico funcional, puede ser cierto. En la práctica, no, incluso los lenguajes funcionales tienen formas de cambiar de estado.
C. Ross

1
Apuesto a que el ejemplo de helicóptero es de "Programador pragmático" :)
Sreekanth Karumanaghat

36

Del "Arte de la programación UNIX" de Eric S. Raymond

La ortogonalidad es una de las propiedades más importantes que pueden ayudar a hacer compactos incluso los diseños complejos. En un diseño puramente ortogonal, las operaciones no tienen efectos secundarios; cada acción (ya sea una llamada API, una invocación de macro o una operación de lenguaje) cambia solo una cosa sin afectar a otras. Hay una y solo una forma de cambiar cada propiedad de cualquier sistema que esté controlando.


16

Piense que tiene la capacidad de cambiar una cosa sin tener un efecto invisible en otra parte.


12

Si tienes un conjunto de construcciones. Se dice que un idioma es ortogonal si permite al programador mezclar estas construcciones libremente. Por ejemplo, en C no puede devolver una matriz (matriz estática), se dice que C no es ortogonal en este 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.

En realidad, vi esto en mi libro y todavía no entiendo qué es eso.
AhmetB - Google

LOL Estoy usando este libro y vi esta pregunta en el cuestionario en línea del libro. Qué casualidad. Tal vez debería leer el primer capítulo también.
AhmetB - Google

2
Simplemente dice que return y arrays son más complejos cuando se combinan: no puede usar return around arrays sin pensar en la interacción entre ellos. Idealmente, sabría lo que significa retorno y qué es una matriz, por lo que sabría qué haría una matriz, pero en realidad, es más complejo que eso, porque C expone los detalles de implementación sobre las matrices (y el retorno).
Lee B

Este sentido de "ortogonal" está cubierto por: en.wikipedia.org/wiki/Orthogonality_(programming) , pero es una página nueva con poco contenido.
outis

1
Esta es la respuesta "más correcta" sobre la ortogonalidad en el contexto de la programación. "ortogonalidad" significa que una construcción de programación se puede mezclar con cualquier otra construcción, y su semántica seguirá siendo la misma.
treecoder

11

En términos generales, la ortogonalidad es una relación entre dos cosas de tal manera que tienen un efecto mínimo entre sí.

El término proviene de las matemáticas, donde dos vectores son ortogonales si se cruzan en ángulo recto.

Piense en un espacio cartesiano bidimensional típico (cuadrícula típica con ejes X / Y). Trace dos líneas: x = 1 e y = 1. Las dos líneas son ortogonales. Puede cambiar x = 1 cambiando x, y esto no tendrá ningún efecto en la otra línea, y viceversa.

En software, el término puede usarse de manera apropiada en situaciones en las que se habla de dos partes de un sistema que se comportan de manera independiente.


5

La mayoría de las respuestas son muy largas e incluso oscuras. El punto es: si una herramienta es ortogonal, se puede agregar, reemplazar o eliminar, en favor de mejores herramientas, sin arruinar todo lo demás.

Es la diferencia entre un carpintero que tiene un martillo y una sierra, que se puede usar para martillar o aserrar, o que tiene un combo de martillo / sierra nuevo, diseñado para aserrar madera, luego martillarlo juntos. Cualquiera de los dos funcionará para serrar y luego martillar juntos, pero si realiza alguna tarea que requiera serrar, pero no martillar, entonces solo las herramientas ortogonales funcionarán. Del mismo modo, si necesita atornillar en lugar de martillar, no necesitará tirar su sierra, si es ortogonal (no mezclado con) su martillo.

El ejemplo clásico son las herramientas de línea de comandos de Unix: tiene una herramienta para obtener el contenido de un disco (dd), otra para filtrar líneas del archivo (grep), otra para escribir esas líneas en un archivo (cat), etc. todo se puede mezclar y combinar a voluntad.


2

Al hablar sobre decisiones de proyectos sobre lenguajes de programación, la ortogonalidad puede verse como lo fácil que es para usted predecir otras cosas sobre ese lenguaje para lo que ha visto en el pasado.

Por ejemplo, en un idioma puede tener:

str.split

para dividir una cuerda y

len (str)

por conseguir la longitud

En un lenguaje más ortogonal, siempre usarías str.x o x (str).

Cuando clonarías un objeto o harías cualquier otra cosa, sabrías si usar

clon (obj)

o

obj.clone

Ese es uno de los puntos principales en los lenguajes de programación que son ortogonales. Eso evita que consultes el manual o le preguntes a alguien.

El artículo de wikipedia habla más sobre la ortogonalidad en diseños complejos o lenguajes de bajo nivel. Como alguien sugirió anteriormente en un comentario, el libro de Sebesta habla claramente sobre la ortogonalidad.

Si usara solo una oración, diría que un lenguaje de programación es ortogonal cuando sus partes desconocidas actúan como se esperaba según lo que ha visto. O ... sin sorpresas.

;)


Esta respuesta no es consistente con los demás; esto solo afirma la coherencia entre las llamadas a funciones o la estructura general en contraste con otras que están en las líneas de "menos acoplamiento" o "falta de efectos secundarios".
Özgür

Este es el uso que generalmente he escuchado. Creo que la razón por la que es ortogonal es que si tiene X.ToString y X.GetType, puede variar el objeto y la sintaxis es la misma, o puede variar la función y la sintaxis es la misma. El objeto es independiente de la función.
dwidel

1

de wikipedia :

Ciencias de la Computación

La ortogonalidad es una propiedad de diseño del sistema que facilita la viabilidad y la compacidad de los diseños complejos. La ortogonalidad garantiza que la modificación del efecto técnico producido por un componente de un sistema no crea ni propaga efectos secundarios a otros componentes del sistema. El comportamiento emergente de un sistema que consta de componentes debe controlarse estrictamente por definiciones formales de su lógica y no por los efectos secundarios resultantes de una pobre integración, es decir, diseño no ortogonal de módulos e interfaces. La ortogonalidad reduce el tiempo de prueba y desarrollo porque es más fácil verificar diseños que no causan efectos secundarios ni dependen de ellos.

Por ejemplo, un automóvil tiene componentes y controles ortogonales (por ejemplo, acelerar el vehículo no influye en nada más que en los componentes involucrados exclusivamente con la función de aceleración). Por otro lado, un diseño no ortogonal puede hacer que su dirección influya en su frenado (por ejemplo, control electrónico de estabilidad) o que su velocidad modifique su suspensión. 1 En consecuencia, se considera que este uso se deriva del uso de ortogonal en matemáticas: se puede proyectar un vector en un subespacio proyectándolo en cada miembro de un conjunto de vectores base por separado y agregando las proyecciones si y solo si los vectores base son mutuamente ortogonales.

Se dice que un conjunto de instrucciones es ortogonal si alguna instrucción puede usar cualquier registro en cualquier modo de direccionamiento. Esta terminología resulta de considerar una instrucción como un vector cuyos componentes son los campos de instrucción. Un campo identifica los registros para ser operado, y otro especifica el modo de direccionamiento. Un conjunto de instrucciones ortogonales codifica de forma única todas las combinaciones de registros y modos de direccionamiento.


Oh, gracias, acabo de visitar este trozo en.wikipedia.org/wiki/Orthogonality_%28programming%29 Lo siento.
AhmetB - Google

1

De Wikipedia :

La ortogonalidad es una propiedad de diseño del sistema que facilita la viabilidad y la compacidad de los diseños complejos. La ortogonalidad garantiza que la modificación del efecto técnico producido por un componente de un sistema no crea ni propaga efectos secundarios a otros componentes del sistema. El comportamiento emergente de un sistema que consta de componentes debe controlarse estrictamente mediante definiciones formales de su lógica y no mediante efectos secundarios resultantes de una integración deficiente, es decir, diseño no ortogonal de módulos e interfaces. La ortogonalidad reduce el tiempo de prueba y desarrollo porque es más fácil verificar diseños que no causan efectos secundarios ni dependen de ellos.

Por ejemplo, un automóvil tiene componentes y controles ortogonales (por ejemplo, acelerar el vehículo no influye en nada más que en los componentes involucrados exclusivamente con la función de aceleración). Por otro lado, un diseño no ortogonal puede hacer que su dirección influya en su frenado (por ejemplo, control electrónico de estabilidad) o que su velocidad modifique su suspensión. [1] En consecuencia, se ve que este uso se deriva del uso de ortogonal en matemáticas: se puede proyectar un vector en un subespacio proyectándolo en cada miembro de un conjunto de vectores base por separado y agregando las proyecciones si y solo si los vectores base son mutuamente ortogonales

Se dice que un conjunto de instrucciones es ortogonal si alguna instrucción puede usar cualquier registro en cualquier modo de direccionamiento. Esta terminología resulta de considerar una instrucción como un vector cuyos componentes son los campos de instrucción. Un campo identifica los registros para ser operado, y otro especifica el modo de direccionamiento. Un conjunto de instrucciones ortogonales codifica de forma única todas las combinaciones de registros y modos de direccionamiento.

Para decirlo en los términos más simples posibles, dos cosas son ortogonales si cambiar una no tiene efecto sobre la otra.


1

Como ejemplos de la falta de ortogonalidad en un lenguaje de alto nivel, considere las siguientes reglas y excepciones en C. Aunque C tiene dos tipos de tipos de datos estructurados, matrices y registros (estructuras), los registros se pueden devolver de las funciones pero las matrices no. Un miembro de una estructura puede ser cualquier tipo de datos excepto nulo o una estructura del mismo tipo. Un elemento de matriz puede ser cualquier tipo de datos, excepto vacío o una función. Los parámetros se pasan por valor, a menos que sean matrices, en cuyo caso, en efecto, se pasan por referencia (porque la aparición de un nombre de matriz sin un subíndice en un programa C se interpreta como la dirección del primer elemento de la matriz)


0

En los lenguajes de programación, se dice que una característica del lenguaje de programación es ortogonal si está limitada sin restricciones (o excepciones). Por ejemplo, en Pascal las funciones no pueden devolver tipos estructurados. Esta es una restricción para devolver valores de una función. Por lo tanto, se considera como una característica no ortogonal. ;)


0

Ortogonalidad en la programación:

La ortogonalidad es un concepto importante, que aborda cómo se puede combinar un número relativamente pequeño de componentes de una manera relativamente pequeña para obtener los resultados deseados. Está asociado con la simplicidad; cuanto más ortogonal es el diseño, menos excepciones. Esto hace que sea más fácil aprender, leer y escribir programas en un lenguaje de programación. El significado de una característica ortogonal es independiente del contexto; Los parámetros clave son la simetría y la consistencia (por ejemplo, un puntero es un concepto ortogonal).

de Wikipedia


0

La ortogonalidad en un lenguaje de programación significa que un conjunto relativamente pequeño de construcciones primitivas puede combinarse en un número relativamente pequeño de formas de construir el control y las estructuras de datos del lenguaje. Además, toda combinación posible de primitivas es legal y significativa. Por ejemplo, considere los tipos de datos. Supongamos que un lenguaje tiene cuatro tipos de datos primitivos (entero, flotante, doble y carácter) y dos operadores de tipo (matriz y puntero). Si los dos operadores de tipo se pueden aplicar a sí mismos y a los cuatro tipos de datos primitivos, se puede definir una gran cantidad de estructuras de datos. El significado de una característica del lenguaje ortogonal es independiente del contexto de su aparición en un programa. (La palabra ortogonal proviene del concepto matemático de vectores ortogonales, que son independientes entre sí. ) La ortogonalidad se deriva de una simetría de las relaciones entre las primitivas. La falta de ortogonalidad conduce a excepciones a las reglas del lenguaje. Por ejemplo, en un lenguaje de programación que admite punteros, debería ser posible definir un puntero para apuntar a cualquier tipo específico definido en el lenguaje. Sin embargo, si no se permite que los punteros apunten a matrices, muchas estructuras de datos definidas por el usuario potencialmente útiles no se pueden definir. Podemos ilustrar el uso de la ortogonalidad como concepto de diseño al comparar un aspecto de los lenguajes de ensamblaje de las computadoras mainframe de IBM y la serie de minicomputadoras VAX. Consideramos una situación simple: agregar dos valores enteros de 32 bits que residen en la memoria o en los registros y reemplazar uno de los dos valores con la suma. Los mainframes de IBM tienen dos instrucciones para este propósito,

A Reg1, memory_cell
AR Reg1, Reg2

donde Reg1 y Reg2 representan registros. La semántica de estos son

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

La instrucción de adición de VAX para valores enteros de 32 bits es

ADDL operand_1, operand_2

cuya semántica es

operand_2 ← contents(operand_1) + contents(operand_2)

En este caso, cualquier operando puede ser un registro o una celda de memoria. El diseño de la instrucción VAX es ortogonal porque una sola instrucción puede usar registros o celdas de memoria como operandos. Hay dos formas de especificar operandos, que se pueden combinar de todas las formas posibles. El diseño de IBM no es ortogonal. Solo dos de las cuatro posibilidades de combinaciones de operandos son legales, y las dos requieren instrucciones diferentes, A y AR. El diseño de IBM es más restringido y, por lo tanto, menos grabable. Por ejemplo, no puede agregar dos valores y almacenar la suma en una ubicación de memoria. Además, el diseño de IBM es más difícil de aprender debido a las restricciones y la instrucción adicional. La ortogonalidad está estrechamente relacionada con la simplicidad: cuanto más ortogonal es el diseño de un idioma, menos excepciones requieren las reglas del idioma. Menos excepciones significan un mayor grado de regularidad en el diseño, lo que hace que el lenguaje sea más fácil de aprender, leer y comprender. Cualquiera que haya aprendido una parte significativa del idioma inglés puede dar testimonio de la dificultad de aprender sus numerosas excepciones de reglas (por ejemplo, i antes e, excepto después de c).


0

La ortogonalidad significa el grado en que el lenguaje consiste en un conjunto de construcciones primitivas independientes que se pueden combinar según sea necesario para expresar un programa. Las características son ortogonales si no hay restricciones sobre cómo se pueden combinar

Example : non-orthogonality

PASCAL: las funciones no pueden devolver tipos estructurados. Los lenguajes funcionales son altamente ortogonales.


0

La idea básica de la ortogonalidad es que las cosas que no están relacionadas conceptualmente no deberían estar relacionadas en el sistema. Las partes de la arquitectura que realmente no tienen nada que ver con la otra, como la base de datos y la interfaz de usuario, no deberían cambiarse juntas. Un cambio en uno no debería causar un cambio en el otro.


-5

Verificar la ortogonalidad de las matrices:

La ortogonalidad también puede ser con respecto a las matrices,

Matrix *(transpose of matrix)= identity matrix. 

Haga clic en el enlace a continuación para ver un video de YouTube sobre ortogonalidad.
https://youtu.be/tNekLaxnfW8


La pregunta es obviamente acerca de la programación.
aggsol
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.