Ортогональность — важнейшая концепция при создании систем, которые легко проектировать, создавать, тестировать и расширять [1]. Ортогональность исходит из геометрии, где две линии ортогональны, если они пересекаются под углом 90 градусов, что делает их подходящими для размещения на осях графика. С точки зрения векторов они независимы друг от друга. Хотя эта концепция не нова в мире информатики [3][6], она остается весьма актуальной.
В информатике или программировании это стало означать независимость или разделение. В хорошо спроектированной системе код базы данных будет ортогонален коду пользовательского интерфейса: интерфейс можно изменить, не затрагивая базу данных, а базу данных можно изменить, не затрагивая интерфейс. Следовательно, в чисто ортогональной системе [2] операции не имеют побочных эффектов; каждое действие изменяет только одну вещь, не затрагивая другие (еще один хороший пример — монитор с ортогональными элементами управления: изменение яркости не влияет на контрастность, и наоборот).
Эта статья основана на книге Программист-прагматик, поэтому, если она вам понравилась, настоятельно рекомендую приобрести.
(Первоначально опубликовано на испанском языке для Linkedin: 1 мая 2023 г.)
Индекс:
- Неортогональная система
- Преимущества
- Способы применения ортогональности
- Тестирование
- Жизнь с ортогональностью
- Библиографические ссылки
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 г.).