Фреймворк или библиотека А в чем, собственно, разница

Разработчики часто используют термины “библиотека” и “фреймворк” как синонимы, так что кажется, что это одно и то же. Но разница все-таки есть.

Фреймворк или библиотека? А в чем между ними разница?

Как фреймворки, так и библиотеки, – это некоторый код. Он может быть большим или маленьким по объему, его автором могут быть сторонние программисты или вы сами. Суть в том, что этот код используется для решения распространенных задач разработки.

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

Это уже можно назвать простой библиотекой.

В библиотеках и фреймворках нет никакой магии – только обычный код, который кто-то уже написал за вас, чтобы жизнь стала немного легче. Эти термины действительно синонимичны, ведь они имеют одну цель – решать частые проблемы.

IKEA или строительная компания?

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

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

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

Техническое различие

Технически библиотека отличается от фреймворка тем, что называется инверсией управления.

Используя библиотеку, программист самостоятельно отвечает за поток приложения. Только он решает, когда привлекать к работе стороннюю функциональность.

Фреймворк же сам отвечает за поток. Он предоставляет несколько мест для размещения вашего кода, но вызываться его или нет – решает он сам.

Библиотека vs фреймворк

Возьмем реальную библиотеку (jQuery) и фреймворк (Vue.js) – попробуем с их помощью вывести сообщение об ошибке. Сделаем вид, что ошибка возникает после нажатия на кнопку.

jQuery

Здесь мы сами решаем, когда и где вызвать метод библиотеки. Это вовсе не значит, что функции jQuery не требуют определенных входных данных для работы. Суть в том, что jQuery – это библиотека таких функций. Их можно использовать или не использовать. Мы тут главные.

Vue.js

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

Именно наличие инверсии управления – основная разница между библиотекой и фреймворком.

Упрямцы

Очень часто фреймворки и библиотеки характеризуют как “упрямые” (opinionated) или “не упрямые” (un-opinionated). Эта оценка основывается на уровне свободы, который имеет разработчик при структурировании кода.

Конечно, это очень субъективный критерий. Фреймворки “упрямы” по определению – инверсия контроля требует от программиста ряда уступок при проектировании приложения. Степень “упрямства” может быть разной для каждого разработчика.

Примером очень “упрямого” фреймворка может служить Angular, а вот Vue.js считается очень свободным.

Теперь вы знаете, что:

  • Фреймворки и библиотеки – это код, написанный кем-то другим, который решает некоторые общие задачи, не утруждая вас реализацией этого решения.
  • Фреймворк инвертирует управление программой и говорит программисту, что ему нужно.
  • Библиотека не вмешивается в поток программы. Ее методы можно вызывать только тогда, когда они нужны.
  • “Упрямство” фреймворка или библиотеки определяется степенью свободы разработчика.

А какой подход ближе вам? С чем приходится работать чаще – с фреймворками или библиотеками? Делитесь в комментариях.

Вы пропустили

AEGIS Algorithms Android Angular Apache Airflow Apache Druid Apache Flink Apache Spark API API Canvas AppSec Architecture Artificial Intelligence Astro Authentication Authorization AutoGPT AWS AWS Aurora AWS Boto3 AWS EC2 AWS Lambda Azure Babylon.js Backend bash Beautiful Soup Bento UI Big Data Binary Tree Browser API Bun Career Cassandra Charts ChatGPT Chrome Extension Clean Code CLI ClickHouse Coding Codux Combine Compose Computer Context Fusion Copilot Cosmo Route CProgramming cron Cryptography CSS CTF Cypress DALL-E Data Analysis Data science Database dbt dbt Cloud deno Design Design Patterns Detekt Development Distributed Systems Django Docker Docker Hub Drizzle DRY DuckDB Express FastAPI Flask Flutter For Beginners Front End Development Game Development GCN GCP Geospatial Git GitHub Actions GitHub Pages Gitlab GMS GoFr Golang Google Google Sheets Google Wire GPT-3 GPT3 Gradio Gradle Grafana Graphic Design GraphQL gRPC Guidance HMS Hotwire HTML Huawei HuggingFace IndexedDB InfoSec Interview iOS Jackknife Java JavaScript Jetpack Compose JSON Kafka Kotlin Kubernetes LangChain Laravel Linux LlaMA LLM localStorage Logging Machine Learning Magento Math Mermaid Micro Frontends Mobile Mobile App Development mondayDB MongoDB Mongoose MySQL Naming NestJS NET NetMock Networks NextJS NLP Node.js Nodejs NoSQL NPM OOP OpenAI OTP Pandas PDF PHP Playwright Plotly Polars PostgreSQL Prefect Productivity Programming Prometheus Puppeteer Pushover Python Pytorch Quarkus Rabbitmq RAG Ramda Raspberry Pi React React Native Reactor Redis REST API Revolut Riverpod RProgramming Ruby Ruby on Rails Rust Scalene SCDB ScyllaDB Selenium Servers Sklearn SLO SnowFlake Snowkase Software Architecture Software Development Solara Solid Spring Boot SQL SQLite Streamlit SudoLang Supabase Swift SwiftUI Tailwind CSS Taipy Terraform Testing Transformers TURN TypeScript Ubuntu UI Design Unix UX UX Design Vim Vite VSCode Vue Web Architecture Web Components Web Development Web Frameworks Web Scraping Web-разработка Webassembly Websocket Whisper Widgets WordPress YAML YouTube Zed Наука о данных Разное Тренды

Как исследовать и визуализировать данные МО для обнаружения объектов на изображениях