Ортогональность — важнейшая концепция при создании систем, которые легко проектировать, создавать, тестировать и расширять [1]. Ортогональность исходит из геометрии, где две линии ортогональны, если они пересекаются под углом 90 градусов, что делает их подходящими для размещения на осях графика. С точки зрения векторов они независимы друг от друга. Хотя эта концепция не нова в мире информатики [3][6], она остается весьма актуальной.

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

Эта статья основана на книге Программист-прагматик, поэтому, если она вам понравилась, настоятельно рекомендую приобрести.

(Первоначально опубликовано на испанском языке для Linkedin: 1 мая 2023 г.)

Индекс:

  1. Неортогональная система
  2. Преимущества
  3. Способы применения ортогональности
  4. Тестирование
  5. Жизнь с ортогональностью
  6. Библиографические ссылки

1. Неортогональная система

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

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

Органы управления вертолетом не являются ортогональными.

2. Преимущества

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

Когда компоненты изолированы друг от друга, известно, что изменение одного компонента не требует беспокойства об остальных. У разработки ортогональных систем есть два основных преимущества: повышение производительности и снижение риска.

Производительность. Изменения локализованы, что сокращает время разработки и тестирования. Кроме того, этот подход способствует повторному использованию компонентов и их сочетанию.

Риск. «Болезненные» участки кода изолированы, что делает систему менее хрупкой, а также ускоряет и упрощает тестирование с несвязанными компонентами.

3. Способы применения ортогональности

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

  • Держите свой код несвязанным: пишите скромный код, который не раскрывает ненужные детали другим модулям и не зависит от реализации других модулей (закон Деметры [4]).
  • Избегайте глобальных данных.При любой ссылке на глобальные данные код привязывается к другим компонентам, которые используют эти данные. В общем, ваш код легко понять и поддерживать, если любой требуемый контекст передается явно. Шаблон Singleton [5] — это способ гарантировать, что существует только один экземпляр объекта определенного класса.
  • Избегайте похожих функций. Мы часто сталкиваемся с похожими функциями с разными центральными алгоритмами в начале и в конце их кода. Дублированный код является признаком структурных проблем. Сделайте привычкой постоянно критиковать свой код, находить возможности реорганизовать его структуру и ортогональность, другими словами: рефакторинг.

4. Тестирование

Написание модульных тестов само по себе является интересной проверкой ортогональности. Что нужно для подготовки и выполнения модульного теста? Вам нужно импортировать большую часть остального кода системы? Если это так, вы только что нашли модуль, который плохо отделен от остальной системы.

Устранение ошибок — хорошее время для оценки ортогональности системы.

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

5. Жизнь с ортогональностью

Ортогональность тесно связана с принципом DRY (не повторяйся). Целью DRY является минимизация дублирования в системе, а ортогональность направлена ​​на уменьшение взаимозависимости компонентов системы.

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

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

6. Библиографические ссылки

[1] Томас Д. и Хант А. (2019). Прагматичный программист, выпуск к 20-летию. Аддисон-Уэсли Профессионал. ISBN: 9780135957059.

[2] Компактность и ортогональность. http://www.catb.org/~esr/writings/taoup/html/ch04s02.html#orthogonality (по состоянию на 30 апреля 2023 г.).

[3] Денвир, Б. Т. (1979). Об ортогональности в языках программирования. Уведомления ACM SIGPLAN, 14(7), 18–30.

[4] Кабальеро, К. (2019). Закон Деметры: не разговаривай с незнакомцами. https://betterprogramming.pub/demeters-law-don-t-talk-to-strangers-87bb4af11694. (По состоянию на 30 апреля 2023 г.)

[5] Гамма, Э., Хелм, Р., Джонсон, Р., Джонсон, Р. Э., и Влиссидес, Дж. (1995). Шаблоны проектирования: элементы повторно используемого объектно-ориентированного программного обеспечения. Пирсон Дойчланд ГмбХ.

[6] Бхаргав, Н. (2022). Ортогональность в компьютерном программировании. https://www.baeldung.com/cs/orthogonality-cs-programming-languages-software-databases (по состоянию на 30 апреля 2023 г.).