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

Чистая архитектура. Искусство разработки программного обеспечения - Роберт Мартин (2018)

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

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

System.out.println(i*i);

}

}

В Clojure, функциональном языке и производном от языка Lisp, аналогичную программу можно записать так:

(println (take 25 (map (fn [x] (* x x)) (range))))

Этот код может показаться немного странным, если вы не знакомы с Lisp. Поэтому я, с вашего позволения, немного переоформлю его и добавлю несколько комментариев.

(println;___________________ Вывести

(take 25;_________________ первые 25

(map (fn [x] (* x x));__ квадратов

(range))));___________ целых чисел

Совершенно понятно, что println, take, map и range – это функции. В языке Lisp вызов функции производится помещением ее имени в круглые скобки. Например, (range) – это вызов функции range.

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

Взглянем на эту программу еще раз, начав с самого внутреннего вызова функции:

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

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

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

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

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

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

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

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

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

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

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

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

Перейти
Наш сайт автоматически запоминает страницу, где вы остановились, вы можете продолжить чтение в любой момент
Оставить комментарий