Читаем Чистая архитектура. Искусство разработки программного обеспечения полностью

• функция range возвращает бесконечный список целых чисел, начиная с 0;

• этот список передается функции map, которая вызывает анонимную функцию для вычисления квадрата каждого элемента и производит бесконечный список квадратов;

• список квадратов передается функции take, которая возвращает новый список, содержащий только первые 25 элементов;

• функция println выводит этот самый список квадратов первых 25 целых чисел.


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

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

Моя цель – показать важнейшее отличие между программами на Clojure и Java. В программе на Java используется изменяемая переменная – переменная, состояние которой изменяется в ходе выполнения программы. Это переменная i – переменная цикла. В программе на Clojure, напротив, нет изменяемых переменных. В ней присутствуют инициализируемые переменные, такие как x, но они никогда не изменяются.

В результате мы пришли к удивительному утверждению: переменные в функциональных языках не изменяются.


Неизменяемость и архитектура

Почему этот аспект важен с архитектурной точки зрения? Почему архитектора должна волновать изменчивость переменных? Ответ на этот вопрос до нелепого прост: все состояния гонки (race condition), взаимоблокировки (deadlocks) и проблемы параллельного обновления обусловлены изменяемостью переменных. Если в программе нет изменяемых переменных, она никогда не окажется в состоянии гонки и никогда не столкнется с проблемами одновременного изменения. В отсутствие изменяемых блокировок программа не может попасть в состояние взаимоблокировки.

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

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

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

Рассмотрим некоторые из этих компромиссов.

Ограничение изменяемости

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

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

Транзакционная память интерпретирует переменные в оперативной памяти подобно тому, как база данных интерпретирует записи на диске. Она защищает переменные, применяя механизм транзакций с повторениями.

Простым примером могут служить атомы в Clojure:


(def counter (atom 0)); инициализировать счетчик нулем

(swap! counter inc); безопасно увеличить счетчик counter.


Рис. 6.1. Изменяемое состояние и транзакционная память


В этом фрагменте переменная counter определяется как атом (с помощью функции atom). Атом в языке Clojure – это особая переменная, способная изменяться при очень ограниченных условиях, соблюдение которых гарантирует функция swap!.

Перейти на страницу:

Похожие книги

Mass Effect. Восхождение к звездам. История создания космооперы BioWare
Mass Effect. Восхождение к звездам. История создания космооперы BioWare

Далекие звезды – мечта, пленяющая сердца людей на протяжении столетий. Космические путешествия стали излюбленным сюжетом научно-фантастических произведений. Уже ранние видеоигры затрагивали тему космоса, но полное раскрытие она получила в культовой серии игр Mass Effect от студии BioWare. В этой книге французского игрового журналиста Николя Доменга описана хроника создания оригинальной трилогии Mass Effect. Через историю студии автор показывает, как формировалась уникальная вселенная Mass Effect, какие идеи заложены в ее основу и как разработчикам удалось добиться эффекта реалистичного погружения в мир игры и дать каждому игроку возможность выбирать свой путь.В формате PDF A4 сохранен издательский макет.

Николя Доменг

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

«Идеальный программист» и «Чистый код» – легендарные бестселлеры Роберта Мартина – рассказывают, как достичь высот профессионализма. «Чистая архитектура» продолжает эту тему, но не предлагает несколько вариантов в стиле «решай сам», а объясняет, что именно следует делать, по какой причине и почему именно такое решение станет принципиально важным для вашего успеха.Роберт Мартин дает прямые и лаконичные ответы на ключевые вопросы архитектуры и дизайна. «Чистую архитектуру» обязаны прочитать разработчики всех уровней, системные аналитики, архитекторы и каждый программист, который желает подняться по карьерной лестнице или хотя бы повлиять на людей, которые занимаются данной работой.

Роберт Сесил Мартин , Роберт С. Мартин

Программирование, программы, базы данных / Зарубежная компьютерная литература / Книги по IT
Super Mario. Как Nintendo покорила мир
Super Mario. Как Nintendo покорила мир

Перед вами невероятная история Марио и расцвета Nintendo.1981 год. Nintendo of America находилась на грани краха, и тогда Сигэру Миямото разработал игру о противостоянии гориллы и маленького прыгающего человечка. Это была знаменитая Donkey Kong, которая положила начало карьере пухлого водопроводчика по имени Марио. С тех пор он появился более чем в двух сотнях игр, принес компании миллиардную прибыль и стал более узнаваемым, чем Микки Маус.Вы узнаете:[ul]как Марио получил свое имя и внешность;когда в играх про Марио появились Луиджи, Боузер, Йоши и другие персонажи;как создавались и развивались Mario и другие франшизы Nintendo;обо всех трудностях, ошибках и триумфах компании;как Марио стал лицом Nintendo и помог ей покорить Америку и весь мир![/ul]

Джефф Райан

Карьера, кадры / Зарубежная компьютерная литература / Книги по IT