Библиотека и фреймворк: в чём разница и кто кого вызывает
Эти два слова звучат похоже, и их вечно путают. Но между ними принципиальная разница в том, кто главный. Библиотеку зовёте вы. А фреймворк зовёт вас. Понять это — значит понять половину устройства любого современного проекта.
Библиотека — это набор готовых инструментов, которые вы берёте по необходимости; фреймворк — это готовый каркас, в который вы встраиваете свой код.
Разница в одном вопросе: кто кого вызывает? Вашу программу — фреймворк, или ваша программа — чужой код? От ответа зависит, библиотека перед вами или фреймворк.
Никто не пишет программы целиком с нуля — это было бы безумием. Зачем заново изобретать разбор дат, работу с сетью или построение интерфейса, если умные люди уже сделали это и поделились? Так появились два способа использовать чужой код: библиотеки и фреймворки. Разберём, чем они отличаются.
Библиотека: ящик с инструментами
Библиотека — это собрание готовых функций, решающих определённые задачи. Вам нужно красиво отформатировать дату? Берёте функцию из библиотеки дат. Нужно скачать страницу из интернета? Берёте функцию из сетевой библиотеки. Вы — хозяин положения: решаете, что и когда вызвать.
import math
# Вы зовёте библиотеку, когда вам удобно
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.14159...Ключевая мысль: вы вызываете библиотеку. Она пассивна и ждёт, пока её попросят. Это как ящик с инструментами в мастерской: молоток и отвёртка лежат и ждут, вы берёте нужный, когда он нужен, и кладёте обратно. Управление всегда у вас.
Фреймворк: готовый каркас дома
Фреймворк — это нечто большее. Он задаёт структуру всей программы: где что должно лежать, как части соединяются, в каком порядке всё происходит. Вы не вызываете фреймворк по кусочкам — вы встраиваете свой код в заранее подготовленные места, а фреймворк сам решает, когда его запустить.
Это как построить дом по готовому каркасу: фундамент, стены, проводка уже на месте. Вы расставляете мебель и обживаете комнаты, но менять расположение несущих стен нельзя — каркас диктует структуру.
Главное отличие: кто кого зовёт
Вот суть, которую программисты называют красивой фразой «инверсия управления». В случае библиотеки управление у вас: вы пишете программу и зовёте библиотеку, когда захотите. В случае фреймворка управление у него: фреймворк — это работающая программа, а ваш код — вставки, которые он вызывает в нужные моменты.
Это даже сформулировали как «голливудский принцип»: не звоните нам — мы сами вам позвоним. Библиотеке звоните вы. А фреймворк звонит вам.
| Библиотека | Фреймворк |
| Вы вызываете её код | Он вызывает ваш код |
| Управление у вас | Управление у него |
| Набор инструментов | Каркас приложения |
| Берёте кусочками | Встраиваетесь целиком |
Когда что выбрать
Библиотека даёт свободу: вы строите программу как хотите и подключаете готовые куски по необходимости. Цена свободы — вы сами отвечаете за всю структуру и связки.
Фреймворк даёт скорость и порядок: множество решений уже приняты за вас, типовые задачи (маршрутизация запросов, работа с базой, безопасность) встроены. Цена — вы играете по его правилам и теряете часть гибкости. Для типового веб-приложения фреймворк сэкономит недели. Для нестандартной задачи он может, наоборот, мешать.
Граница не всегда чёткая
Честно говоря, иногда трудно сказать однозначно: вот это библиотека, а вот это фреймворк. Некоторые инструменты можно использовать и так, и эдак. Но проверочный вопрос почти всегда работает: задумайтесь, кто диктует структуру программы — вы или этот инструмент? Если вы зовёте его по мере надобности — библиотека. Если он управляет потоком, а вы лишь заполняете пропуски, — фреймворк.
Зачем понимать разницу
Эта простая мысль помогает читать описания проектов и принимать решения. «Мы используем такой-то фреймворк» означает, что вся архитектура подчинена его правилам. «Подключили такую-то библиотеку» — что взяли готовый кусочек, не меняя устройство приложения. Понимая, кто кого вызывает, вы лучше представляете, как устроен код, который видите впервые, — а это половина работы программиста.