Co to jest „ortogonalność”?

124

Co oznacza „ortogonalność”, gdy mówimy o językach programowania?

Jakie są przykłady ortogonalności?

AhmetB - Google
źródło

Odpowiedzi:

255

Ortogonalność to właściwość, która oznacza, że ​​„Zmiana A nie zmienia B”. Przykładem systemu ortogonalnego może być radio, w którym zmiana stacji nie powoduje zmiany głośności i odwrotnie.

System nieortogonalny byłby jak helikopter, w którym zmiana prędkości może zmienić kierunek.

W językach programowania oznacza to, że podczas wykonywania instrukcji nie dzieje się nic oprócz tej instrukcji (bardzo ważne przy debugowaniu).

W odniesieniu do zestawów instrukcji istnieje również określone znaczenie .

Krzyż
źródło
Ta odpowiedź przypomina mi teorię „superpozycji” z sygnału i systemów.
Özgür
1
Bardzo jasne wyjaśnienie różnych zastosowań tego słowa: c2.com/cgi/wiki?DefinitionOfOrthogonal
Lorenzo Solano
Czy więc programowanie funkcjonalne jest całkowicie ortogonalne?
corazza
To ciekawe pytanie @yannbane. W teorii, w zależności od teoretycznego języka funkcjonalnego, może to być prawda. W praktyce nie, nawet języki funkcjonalne mają sposoby na zmianę stanu.
C. Ross,
1
Założę się, że ten przykład helikoptera pochodzi z "Pragmatic Programmer" :)
Sreekanth Karumanaghat
36

Z książki „Art of UNIX Programming” Erica S. Raymonda

Ortogonalność to jedna z najważniejszych właściwości, która może pomóc w uzyskaniu zwartości nawet złożonych projektów. W czysto ortogonalnym projekcie operacje nie mają skutków ubocznych; każda akcja (czy to wywołanie API, wywołanie makra czy operacja językowa) zmienia tylko jedną rzecz bez wpływu na inne. Istnieje jeden i tylko jeden sposób zmiany każdej właściwości systemu, który kontrolujesz.

Federico klez Culloca
źródło
16

Pomyśl o tym, że jest w stanie zmienić jedną rzecz bez niewidocznego wpływu na inną.

Martin Beckett
źródło
12

Jeśli masz zestaw konstrukcji. Mówi się, że langauge jest ortogonalny, jeśli pozwala programiście dowolnie mieszać te konstrukcje. Na przykład w C nie można zwrócić tablicy (tablicy statycznej), mówi się, że C jest nieortogenalne w tym przypadku:

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
źródło
Właściwie widziałem to w mojej książce i nadal nie rozumiem, co to jest.
AhmetB - Google
LOL Używam tej książki i widziałem to pytanie w internetowym quizie książki. Co za zbieg okoliczności. Może powinienem też przeczytać pierwszy rozdział.
AhmetB - Google
2
Mówi się po prostu, że powrót i tablice są bardziej złożone, gdy są połączone: nie można używać funkcji powrotu wokół tablic bez myślenia o interakcji między nimi. Idealnie byłoby, gdybyś wiedział, co oznacza zwrot i czym jest tablica, a więc wiedziałbyś, co spowodowałoby zwrócenie tablicy, ale w rzeczywistości jest to bardziej złożone, ponieważ C ujawnia szczegóły implementacji dotyczące tablic (i powrotu).
Lee B
To poczucie „ortogonalności” obejmuje: en.wikipedia.org/wiki/Orthogonality_(programming) , ale jest to nowa strona z niewielką zawartością.
outis
1
To jest „bardziej poprawna” odpowiedź na temat ortogonalności w kontekście programowania. „ortogonalność” oznacza, że ​​konstrukcja programistyczna może być mieszana z dowolną inną konstrukcją, a jej semantyka pozostanie taka sama.
treecoder
11

Mówiąc ogólnie, ortogonalność to relacja między dwiema rzeczami, która ma na siebie minimalny wpływ.

Termin pochodzi z matematyki, w której dwa wektory są ortogonalne, jeśli przecinają się pod kątem prostym.

Pomyśl o typowej dwuwymiarowej przestrzeni kartezjańskiej (typowa siatka z osiami X / Y). Narysuj dwie linie: x = 1 iy = 1. Te dwie linie są ortogonalne. Możesz zmienić x = 1, zmieniając x, co nie będzie miało wpływu na drugą linię i odwrotnie.

W oprogramowaniu termin ten może być odpowiednio używany w sytuacjach, gdy mówisz o dwóch częściach systemu, które zachowują się niezależnie od siebie.

timdev
źródło
5

Większość odpowiedzi jest bardzo rozwlekła, a nawet niejasna. Chodzi o to, że jeśli narzędzie jest ortogonalne, można je dodać, wymienić lub usunąć na korzyść lepszych narzędzi, bez skręcania wszystkiego innego.

To jest różnica między stolarzem posiadającym młotek i piłę, której można używać do kucia lub piłowania, a posiadaniem nowego zestawu młotek / piła, który jest przeznaczony do piłowania drewna, a następnie wbijania go razem. Albo będą pracować przy piłowaniu, a następnie młotkowaniu, ale jeśli dostaniesz jakieś zadanie, które wymaga piłowania, ale nie młotkowania, będą działać tylko narzędzia ortogonalne. Podobnie, jeśli musisz wkręcać zamiast młotkiem, nie musisz wyrzucać piły, jeśli jest prostopadła (nie pomieszana) z młotkiem.

Klasycznym przykładem są narzędzia wiersza poleceń unix: masz jedno narzędzie do pobierania zawartości dysku (dd), drugie do filtrowania wierszy z pliku (grep), drugie do zapisywania tych wierszy do pliku (cat) itd. wszystkie można dowolnie mieszać i dopasowywać.

Lee B.
źródło
2

Mówiąc o decyzjach projektowych dotyczących języków programowania, ortogonalność może być postrzegana jako to, jak łatwo jest przewidzieć inne rzeczy dotyczące tego języka w odniesieniu do tego, co widziałeś w przeszłości.

Na przykład w jednym języku możesz mieć:

str.split

do dzielenia łańcucha i

len (str)

za uzyskanie długości.

W języku bardziej ortogonalnym zawsze używałbyś str.x lub x (str).

Gdybyś sklonował obiekt lub zrobił cokolwiek innego, wiedziałbyś, czy użyć

klon (obj)

lub

obj.clone

To jeden z głównych punktów dotyczących ortogonalności języków programowania. To pozwala uniknąć zajrzenia do instrukcji lub zadawania pytań.

Artykuł w Wikipedii mówi więcej o ortogonalności w złożonych projektach lub językach niskiego poziomu. Jak ktoś zasugerował powyżej w komentarzu, książka Sebesta mówi wyraźnie o ortogonalności.

Gdybym użył tylko jednego zdania, powiedziałbym, że język programowania jest ortogonalny, gdy jego nieznane części działają zgodnie z oczekiwaniami na podstawie tego, co widziałeś. Albo ... bez niespodzianek.

;)

Asrail
źródło
Ta odpowiedź nie jest zgodna z innymi; to tylko domaga się spójności między wywołaniami funkcji lub ogólną strukturą w przeciwieństwie do innych, które są na linii „mniejszego sprzężenia” lub „bezskuteczności ubocznej”.
Özgür
To jest użycie, które zwykle słyszałem. Myślę, że powodem, dla którego jest ortogonalny, jest to, że jeśli masz X.ToString i X.GetType, możesz zmieniać obiekt, a składnia jest taka sama lub możesz zmieniać funkcję i składnię jest taka sama. Obiekt jest niezależny od funkcji.
dwidel
1

z wikipedii :

Informatyka

Ortogonalność to właściwość projektu systemu, która ułatwia wykonalność i zwartość złożonych projektów. Ortogonalność gwarantuje, że modyfikacja efektu technicznego wytwarzanego przez komponent systemu nie powoduje ani nie propaguje skutków ubocznych na inne komponenty systemu. Wyłaniające się zachowanie systemu składającego się z komponentów powinno być ściśle kontrolowane przez formalne definicje jego logiki, a nie przez skutki uboczne wynikające ze słabej integracji, tj. Nieortogonalnego projektu modułów i interfejsów. Ortogonalność skraca czas testowania i opracowywania, ponieważ łatwiej jest zweryfikować projekty, które nie powodują skutków ubocznych ani nie są od nich zależne.

Na przykład samochód ma ortogonalne komponenty i elementy sterujące (np. Przyspieszenie pojazdu nie wpływa na nic innego, jak tylko na komponenty związane wyłącznie z funkcją przyspieszania). Z drugiej strony, nieortogonalna konstrukcja może mieć wpływ na układ kierowniczy na hamowanie (np. Elektroniczna kontrola stabilności) lub regulować prędkość zawieszenia. 1 W konsekwencji, to użycie jest postrzegane jako wyprowadzone z użycia ortogonalności w matematyce: można rzutować wektor na podprzestrzeń, rzutując go na każdy element zbioru wektorów bazowych oddzielnie i dodając rzuty wtedy i tylko wtedy, gdy wektory bazowe są wzajemnie ortogonalne.

O zestawie instrukcji mówi się, że jest ortogonalny, jeśli jakakolwiek instrukcja może wykorzystywać dowolny rejestr w dowolnym trybie adresowania. Terminologia ta wynika z rozważania instrukcji jako wektora, którego składowymi są pola instrukcji. Jedno pole identyfikuje rejestry, na których mają być obsługiwane, a inne określa tryb adresowania. Zestaw instrukcji ortogonalnych w unikalny sposób koduje wszystkie kombinacje rejestrów i trybów adresowania.

TheVillageIdiot
źródło
Och, dzięki, właśnie odwiedziłem ten skrót en.wikipedia.org/wiki/Orthogonality_%28programming%29 Przepraszamy.
AhmetB - Google
1

Z Wikipedii :

Ortogonalność to właściwość projektu systemu, która ułatwia wykonalność i zwartość złożonych projektów. Ortogonalność gwarantuje, że modyfikacja efektu technicznego wytwarzanego przez komponent systemu nie powoduje ani nie propaguje skutków ubocznych na inne komponenty systemu. Wyłaniające się zachowanie systemu składającego się z komponentów powinno być ściśle kontrolowane przez formalne definicje jego logiki, a nie przez skutki uboczne wynikające ze słabej integracji, tj. Nieortogonalnego projektu modułów i interfejsów. Ortogonalność skraca czas testowania i opracowywania, ponieważ łatwiej jest zweryfikować projekty, które nie powodują skutków ubocznych ani nie są od nich zależne.

Na przykład samochód ma ortogonalne komponenty i elementy sterujące (np. Przyspieszenie pojazdu nie wpływa na nic innego, jak tylko na komponenty związane wyłącznie z funkcją przyspieszania). Z drugiej strony, nieortogonalna konstrukcja może mieć wpływ na układ kierowniczy na hamowanie (np. Elektroniczna kontrola stabilności) lub jego prędkość modyfikować zawieszenie. [1] W konsekwencji, to użycie jest postrzegane jako wyprowadzone z użycia ortogonalności w matematyce: można rzutować wektor na podprzestrzeń, rzutując go na każdy element zbioru wektorów bazowych oddzielnie i dodając rzutowanie wtedy i tylko wtedy, gdy wektory bazowe są wzajemnie ortogonalne.

O zestawie instrukcji mówi się, że jest ortogonalny, jeśli jakakolwiek instrukcja może wykorzystywać dowolny rejestr w dowolnym trybie adresowania. Terminologia ta wynika z rozważania instrukcji jako wektora, którego składowymi są pola instrukcji. Jedno pole identyfikuje rejestry, na których mają być obsługiwane, a inne określa tryb adresowania. Zestaw instrukcji ortogonalnych w unikalny sposób koduje wszystkie kombinacje rejestrów i trybów adresowania.

Mówiąc najprościej z możliwych, dwie rzeczy są ortogonalne, jeśli zmiana jednej nie ma wpływu na drugą.

Laurence Gonsalves
źródło
1

Jako przykłady braku ortogonalności w języku wysokiego poziomu, rozważ następujące reguły i wyjątki w C. Chociaż C ma dwa rodzaje ustrukturyzowanych typów danych, tablice i rekordy (struktury), rekordy mogą być zwracane z funkcji, ale tablice nie. Elementem struktury może być dowolny typ danych, z wyjątkiem void lub struktury tego samego typu. Element tablicy może być dowolnym typem danych z wyjątkiem void lub funkcji. Parametry są przekazywane przez wartość, chyba że są to tablice, w którym to przypadku są w efekcie przekazywane przez referencję (ponieważ pojawienie się nazwy tablicy bez indeksu w programie C jest interpretowane jako adres pierwszego elementu tablicy)

Wyobraźnia
źródło
0

W językach programowania mówi się, że funkcja języka programowania jest ortogonalna, jeśli jest ograniczona bez ograniczeń (lub wyjątków). Na przykład w funkcji Pascal funkcje nie mogą zwracać typów strukturalnych. To jest ograniczenie dotyczące zwracania wartości z funkcji. Dlatego uważamy, że jest to cecha nieortogonalna. ;)

Dil
źródło
0

Ortogonalność w programowaniu:

Ortogonalność to ważna koncepcja, która dotyczy tego, jak stosunkowo niewielką liczbę elementów można połączyć na stosunkowo niewielką liczbę sposobów, aby uzyskać pożądane wyniki. Kojarzy się z prostotą; im bardziej ortogonalny projekt, tym mniej wyjątków. Ułatwia to naukę, czytanie i pisanie programów w języku programowania. Znaczenie cech ortogonalnych jest niezależne od kontekstu; kluczowe parametry to symetria i spójność (na przykład wskaźnik jest pojęciem ortogonalnym).

z Wikipedii

Majid
źródło
0

Ortogonalność w języku programowania oznacza, że ​​stosunkowo niewielki zestaw konstrukcji prymitywnych można łączyć na stosunkowo niewielką liczbę sposobów, aby zbudować kontrolę i struktury danych języka. Co więcej, każda możliwa kombinacja prymitywów jest legalna i znacząca. Na przykład rozważ typy danych. Załóżmy, że język ma cztery pierwotne typy danych (liczba całkowita, zmiennoprzecinkowa, podwójna i znakowa) oraz dwa operatory typu (tablica i wskaźnik). Jeśli dwa operatory typu można zastosować do siebie i czterech pierwotnych typów danych, można zdefiniować dużą liczbę struktur danych. Znaczenie funkcji języka ortogonalnego jest niezależne od kontekstu jej pojawienia się w programie. (słowo ortogonalne pochodzi z matematycznej koncepcji wektorów ortogonalnych, które są od siebie niezależne. ) Ortogonalność wynika z symetrii relacji między pierwotnymi. Brak ortogonalności prowadzi do wyjątków od reguł języka. Na przykład w języku programowania, który obsługuje wskaźniki, powinno być możliwe zdefiniowanie wskaźnika wskazującego na dowolny określony typ zdefiniowany w języku. Jeśli jednak wskaźniki nie mogą wskazywać tablic, nie można zdefiniować wielu potencjalnie przydatnych struktur danych zdefiniowanych przez użytkownika. Możemy zilustrować użycie ortogonalności jako koncepcji projektowej, porównując jeden aspekt języków asemblera komputerów mainframe IBM i serii minikomputerów VAX. Rozważamy jedną prostą sytuację: dodanie dwóch 32-bitowych wartości całkowitych, które znajdują się w pamięci lub rejestrach i zastąpienie jednej z dwóch wartości sumą. Komputery mainframe IBM mają do tego celu dwie instrukcje,

A Reg1, memory_cell
AR Reg1, Reg2

gdzie Reg1 i Reg2 reprezentują rejestry. Ich semantyka to

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

Instrukcja dodawania VAX dla 32-bitowych wartości całkowitych to

ADDL operand_1, operand_2

którego semantyka jest

operand_2 ← contents(operand_1) + contents(operand_2)

W tym przypadku operand może być rejestrem lub komórką pamięci. Konstrukcja instrukcji VAX jest ortogonalna, ponieważ pojedyncza instrukcja może używać albo rejestrów, albo komórek pamięci jako argumentów. Istnieją dwa sposoby określania operandów, które można łączyć na wszystkie możliwe sposoby. Projekt IBM nie jest ortogonalny. Tylko dwie z czterech możliwości kombinacji operandów są dozwolone, a dwie wymagają różnych instrukcji, A i AR. Projekt IBM jest bardziej ograniczony, a zatem mniej zapisywalny. Na przykład nie można dodać dwóch wartości i przechowywać sumy w lokalizacji pamięci. Ponadto projekt IBM jest trudniejszy do nauczenia z powodu ograniczeń i dodatkowych instrukcji. Ortogonalność jest ściśle związana z prostotą: im bardziej ortogonalny jest projekt języka, tym mniej wyjątków wymagają reguły językowe. Mniejsza liczba wyjątków oznacza wyższy stopień regularności w projekcie, co ułatwia naukę, czytanie i zrozumienie języka. Każdy, kto nauczył się istotnej części języka angielskiego, może zaświadczyć o trudnościach w nauce wielu wyjątków od jego reguł (np. I przed e, z wyjątkiem po c).

Wyobraźnia
źródło
0

Ortogonalność oznacza stopień, w jakim język składa się z zestawu niezależnych konstrukcji pierwotnych, które można łączyć w razie potrzeby w celu wyrażenia programu. Funkcje są ortogonalne, jeśli nie ma ograniczeń co do sposobu ich łączenia

Example : non-orthogonality

PASCAL: funkcje nie mogą zwracać typów strukturalnych. Języki funkcjonalne są wysoce ortogonalne.

mali
źródło
0

Podstawową ideą ortogonalności jest to, że rzeczy, które nie są powiązane koncepcyjnie, nie powinny być powiązane w systemie. Części architektury, które tak naprawdę nie mają nic wspólnego z innymi, takie jak baza danych i interfejs użytkownika, nie powinny być zmieniane razem. Zmiana na jedną nie powinna powodować zmiany w drugiej.

acohen
źródło
-5

Sprawdź ortogonalność macierzy:

Ortogonalność może również odnosić się do macierzy,

Matrix *(transpose of matrix)= identity matrix. 

Kliknij poniższy link, aby obejrzeć film z YouTube na temat ortogonalności.
https://youtu.be/tNekLaxnfW8

Roopesh
źródło
Pytanie dotyczy oczywiście programowania.
aggsol