Что такое "ортогональность"?

Что означает "ортогональность", когда речь идет о языках программирования?

Каковы некоторые примеры ортогональности?

20 ответов

Решение

Ортогональность - это свойство, которое означает "Изменение A не меняет B". Примером ортогональной системы может служить радио, где смена станции не меняет громкость, и наоборот.

Неортогональная система будет похожа на вертолет, где изменение скорости может изменить направление.

В языках программирования это означает, что когда вы выполняете инструкцию, ничего, кроме этой инструкции, не происходит (очень важно для отладки).

Существует также особое значение при обращении к наборам команд.

Из книги Эрика С. Раймонда "Искусство программирования в UNIX"

Ортогональность является одним из наиболее важных свойств, которые могут помочь сделать даже сложные проекты компактными. В чисто ортогональной конструкции операции не имеют побочных эффектов; каждое действие (будь то вызов API, вызов макроса или языковая операция) изменяет только одну вещь, не затрагивая другие. Существует один и только один способ изменить каждое свойство любой системы, которой вы управляете.

Подумайте о том, что он может изменить одну вещь, не оказав невидимого влияния на другую часть.

В общем, ортогональность - это отношения между двумя вещами, которые оказывают минимальное влияние друг на друга.

Термин происходит от математики, где два вектора ортогональны, если они пересекаются под прямым углом.

Подумайте о типичном двухмерном декартовом пространстве (типичная сетка с осями X/Y). Постройте две строки: x=1 и y=1. Две линии ортогональны. Вы можете изменить x = 1, изменив x, и это не повлияет на другую строку, и наоборот.

В программном обеспечении этот термин может быть надлежащим образом использован в ситуациях, когда вы говорите о двух частях системы, которые ведут себя независимо друг от друга.

Если у вас есть набор конструкций. Язык называется ортогональным, если он позволяет программисту свободно смешивать эти конструкции. Например, в 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.

Большинство ответов очень многословны и даже неясны. Суть в том, что если инструмент ортогональный, его можно добавлять, заменять или удалять в пользу более качественных инструментов, не прибегая к другим сложностям.

Это разница между плотником, имеющим молоток и пилу, который можно использовать для ковки или пиления, или наличием какого-то новомодного комбо молотка / пилы, которое предназначено для распиливания древесины, а затем для того, чтобы забивать ее вместе. Любой из них будет работать на распиловку, а затем на ударение, но если у вас есть какое-то задание, которое требует распиловки, а не вырубки, тогда будут работать только ортогональные инструменты. Точно так же, если вам нужно ввернуть вместо удара молоток, вам не нужно выбрасывать свою пилу, если она перпендикулярна (не смешана) с вашим молотком.

Классическим примером являются инструменты командной строки unix: у вас есть один инструмент для получения содержимого диска (dd), другой для фильтрации строк из файла (grep), другой для записи этих строк в файл (cat) и т. Д. все могут быть смешаны и сопоставлены по желанию.

Говоря о проектных решениях по языкам программирования, ортогональность может рассматриваться как то, как легко вам предсказать другие вещи об этом языке для того, что вы видели в прошлом.

Например, на одном языке вы можете иметь:

str.split

для расщепления строки и

Len (ул)

для получения длины.

На языке, более ортогональном, вы всегда будете использовать str.x или x(str).

Когда вы будете клонировать объект или делать что-то еще, вы будете знать, использовать ли

Клон (OBJ)

или же

obj.clone

Это один из основных моментов, когда языки программирования ортогональны. Это позволяет избежать обращения к руководству или спросить кого-то.

В статье в Википедии больше говорится об ортогональности сложных конструкций или языков низкого уровня. Как кто-то предложил выше в комментарии, книга Себесты чисто говорит об ортогональности.

Если бы я использовал только одно предложение, я бы сказал, что язык программирования является ортогональным, когда его неизвестные части действуют, как ожидается, основываясь на том, что вы видели. Или... никаких сюрпризов.

;)

В качестве примеров отсутствия ортогональности в языке высокого уровня рассмотрим следующие правила и исключения в C. Хотя C имеет два вида структурированных типов данных: массивы и записи (структуры), записи могут возвращаться из функций, но массивы не могут. Членом структуры может быть любой тип данных, кроме void или структуры того же типа. Элемент массива может быть любого типа данных, кроме void или функции. Параметры передаются по значению, если только они не являются массивами, в этом случае они, по сути, передаются по ссылке (поскольку появление имени массива без индекса в программе на языке C интерпретируется как адрес первого элемента массива)

Из википедии:

Информатика

Ортогональность - это свойство проектирования системы, облегчающее выполнимость и компактность сложных конструкций. Ортогональность гарантирует, что изменение технического эффекта, создаваемого компонентом системы, не создает и не распространяет побочные эффекты на другие компоненты системы. Эмерджентное поведение системы, состоящей из компонентов, должно строго контролироваться формальными определениями ее логики, а не побочными эффектами, вызванными плохой интеграцией, то есть неортогональным дизайном модулей и интерфейсов. Ортогональность сокращает время тестирования и разработки, поскольку легче проверять проекты, которые не вызывают побочных эффектов и не зависят от них.

Например, автомобиль имеет ортогональные компоненты и элементы управления (например, ускорение транспортного средства ни на что не влияет, кроме компонентов, связанных исключительно с функцией ускорения). С другой стороны, неортогональная конструкция может влиять на управление тормозом (например, электронное управление устойчивостью) или регулировать скорость подвески. 1 Следовательно, считается, что это использование происходит от использования ортогональности в математике: можно проецировать вектор на подпространство, проецируя его на каждого члена набора базовых векторов отдельно и добавляя проекции тогда и только тогда, когда базисные векторы взаимно ортогональны.

Набор команд называется ортогональным, если любая инструкция может использовать любой регистр в любом режиме адресации. Эта терминология является результатом рассмотрения команды как вектора, компонентами которого являются поля команд. Одно поле идентифицирует регистры, с которыми нужно работать, а другое - режим адресации. Набор ортогональных команд уникальным образом кодирует все комбинации регистров и режимов адресации.

Из Википедии:

Ортогональность - это свойство проектирования системы, облегчающее выполнимость и компактность сложных конструкций. Ортогональность гарантирует, что изменение технического эффекта, создаваемого компонентом системы, не создает и не распространяет побочные эффекты на другие компоненты системы. Эмерджентное поведение системы, состоящей из компонентов, должно строго контролироваться формальными определениями ее логики, а не побочными эффектами, вызванными плохой интеграцией, то есть неортогональным дизайном модулей и интерфейсов. Ортогональность сокращает время тестирования и разработки, поскольку легче проверять проекты, которые не вызывают побочных эффектов и не зависят от них.

Например, автомобиль имеет ортогональные компоненты и элементы управления (например, ускорение транспортного средства ни на что не влияет, кроме компонентов, связанных исключительно с функцией ускорения). С другой стороны, неортогональная конструкция может влиять на управление тормозом (например, электронное управление устойчивостью) или регулировать скорость подвески.[1] Следовательно, считается, что это использование происходит от использования ортогональности в математике: можно проецировать вектор на подпространство, проецируя его на каждого члена набора базисных векторов отдельно и добавляя проекции тогда и только тогда, когда базисные векторы взаимно ортогональны.

Набор команд называется ортогональным, если любая инструкция может использовать любой регистр в любом режиме адресации. Эта терминология является результатом рассмотрения команды как вектора, компонентами которого являются поля команд. Одно поле идентифицирует регистры, с которыми нужно работать, а другое - режим адресации. Набор ортогональных команд уникальным образом кодирует все комбинации регистров и режимов адресации.

Проще говоря, две вещи ортогональны, если изменение одного не влияет на другое.

Ортогональность означает степень, в которой язык состоит из набора независимых примитивных конструкций, которые могут быть объединены при необходимости для выражения программы. Функции являются ортогональными, если нет ограничений на то, как они могут быть объединены

Example : non-orthogonality

PASCAL: функции не могут возвращать структурированные типы. Функциональные языки высоко ортогональны.

Из книги Майкла С. Фезерса «Эффективная работа с устаревшим кодом»:

Если вы хотите изменить существующее поведение в своем коде и есть ровно одно место, где вам нужно сделать это изменение, у вас есть ортогональность.

Реальные примеры ортогональности в языках программирования

Уже есть много ответов, которые объясняют, что вообще такое ортогональность, с указанием некоторых выдуманных примеров. Например, этот ответ хорошо это объясняет. Я хотел предоставить (и собрать) несколько реальных примеров ортогональных или неортогональных функций в языках программирования:

Ортогонально: модули и пространства имен C++20

На cppreference-странице о новой системе модулей в C++20 написано:

Модули ортогональны пространствам имен

В этом случае они пишут, что модули ортогональны пространствам имен, потому что такие утверждения, как import foo не будет импортировать пространство имен модуля, связанное с foo:

import foo;            // foo exports foo::bar()
bar ();                // Error
foo::bar ();           // Ok
using namespace foo;
bar ();                // Ok

(адаптировано из modules-cppcon2017 слайд 9)

Ортогональность в программировании:

Ортогональность является важной концепцией, касающейся того, как относительно небольшое количество компонентов может быть объединено относительно небольшим количеством способов для получения желаемых результатов. Это связано с простотой; чем более ортогональный дизайн, тем меньше исключений. Это облегчает изучение, чтение и запись программ на языке программирования. Значение ортогонального признака не зависит от контекста; Ключевыми параметрами являются симметрия и согласованность (например, указатель является ортогональным понятием).

из Википедии

Ортогональность — это идея о том, что вещи, которые концептуально не связаны, не должны быть связаны в системе, поэтому части архитектуры, не имеющие ничего общего друг с другом, такие как база данных и пользовательский интерфейс, не должны изменяться вместе. Изменение одной части вашей системы не должно привести к изменению другой.

Если, например, вы меняете несколько строк на экране и вызываете изменение в схеме базы данных, это называется сцеплением. Обычно вы хотите свести к минимуму связь между вещами, которые в основном не связаны, потому что она может расти, и система может стать кошмаром для обслуживания в долгосрочной перспективе.

Впервые слышу слово, но в Википедии, похоже, есть что-то на нем:

http://en.wikipedia.org/wiki/Orthogonality

В языках программирования функция языка программирования называется ортогональной, если она ограничена без ограничений (или исключений). Например, в Паскале функции не могут возвращать структурированные типы. Это ограничение на возврат значений из функции. Поэтому мы это рассматриваем как неортогональная особенность.;)

Основная идея ортогональности заключается в том, что вещи, которые не связаны концептуально, не должны быть связаны в системе. Части архитектуры, которые на самом деле не имеют ничего общего с другими, такие как база данных и пользовательский интерфейс, не должны изменяться вместе. Изменение одного не должно вызывать изменения другого.

Ортогональность в языке программирования означает, что относительно небольшой набор примитивных конструкций можно комбинировать относительно небольшим количеством способов для построения структур управления и данных языка. Кроме того, любая возможная комбинация примитивов является законной и значимой. Например, рассмотрим типы данных. Предположим, что язык имеет четыре примитивных типа данных (целое число, число с плавающей запятой, двойное и символьное) и два оператора типа (массив и указатель). Если операторы двух типов могут быть применены к самим себе и к четырем примитивным типам данных, можно определить большое количество структур данных. Значение свойства ортогонального языка не зависит от контекста его появления в программе. (Слово ортогональное происходит от математического понятия ортогональных векторов, которые не зависят друг от друга.) Ортогональность следует из симметрии отношений между примитивами. Отсутствие ортогональности приводит к исключениям из правил языка. Например, в языке программирования, который поддерживает указатели, должна быть возможность определить указатель для указания на любой определенный тип, определенный в языке. Однако если указателям не разрешено указывать на массивы, многие потенциально полезные пользовательские структуры данных не могут быть определены. Мы можем проиллюстрировать использование ортогональности в качестве концепции проектирования, сравнив один аспект языков ассемблера мэйнфреймов IBM и серии миникомпьютеров VAX. Мы рассмотрим одну простую ситуацию: добавление двух 32-разрядных целочисленных значений, которые находятся либо в памяти, либо в регистрах, и замена одного из двух значений на сумму. В мейнфреймах IBM есть две инструкции для этой цели, которые имеют формы

A Reg1, memory_cell
AR Reg1, Reg2

где Reg1 и Reg2 представляют регистры. Семантика этих

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

Инструкция сложения VAX для 32-битных целых значений

ADDL operand_1, operand_2

чья семантика

operand_2 ← contents(operand_1) + contents(operand_2)

В этом случае любой операнд может быть регистром или ячейкой памяти. Конструкция команды VAX является ортогональной в том смысле, что одна команда может использовать регистры или ячейки памяти в качестве операндов. Существует два способа указания операндов, которые можно комбинировать всеми возможными способами. Дизайн IBM не является ортогональным. Только два из четырех возможных сочетаний операндов являются законными, и для двух требуются разные инструкции, A и AR . Дизайн IBM более ограничен и поэтому менее доступен для записи. Например, вы не можете добавить два значения и сохранить сумму в ячейке памяти. Кроме того, дизайн IBM труднее изучать из-за ограничений и дополнительных инструкций. Ортогональность тесно связана с простотой: чем больше ортогональность дизайна языка, тем меньше исключений требуют правила языка. Меньшее количество исключений означает более высокую степень регулярности в дизайне, что облегчает изучение, чтение и понимание языка. Любой, кто выучил значительную часть английского языка, может свидетельствовать о сложности изучения многих исключений из правил (например, я до е, кроме как после с).

Проверьте ортогональность матриц:

Ортогональность также может быть в отношении матриц,

Matrix *(transpose of matrix)= identity matrix. 

Нажмите на ссылку ниже, чтобы просмотреть видео на YouTube об ортогональности.
https://youtu.be/tNekLaxnfW8

Другие вопросы по тегам