В чем разница между фреймворком и библиотекой?
В чем разница между фреймворком и библиотекой?
Я всегда думал о библиотеке как о наборе объектов и функций, которые фокусируются на решении конкретной проблемы или конкретной области разработки приложений (например, доступа к базе данных); и, с другой стороны, структура как набор библиотек, ориентированных на конкретную методологию (например, MVC) и охватывающих все области разработки приложений.
25 ответов
На самом деле эти термины могут означать много разных вещей в зависимости от контекста, который они используют.
Например, в Mac OS X фреймворки - это просто библиотеки, упакованные в пакет. В комплекте вы найдете актуальную динамическую библиотеку (libWhwhat.dylib). Разница между пустой библиотекой и фреймворком на Mac заключается в том, что фреймворк может содержать несколько разных версий библиотеки. Он может содержать дополнительные ресурсы (изображения, локализованные строки, файлы данных XML, объекты пользовательского интерфейса и т. Д.), И если инфраструктура не является общедоступной, она обычно содержит необходимые файлы.h, необходимые для использования библиотеки.
Таким образом, в одном пакете есть все, что вам нужно, чтобы использовать библиотеку в своем приложении (библиотека C/C++/Objective-C без файлов.h довольно бесполезна, если вы не пишете их самостоятельно в соответствии с некоторой документацией библиотеки) вместо куча файлов для перемещения (пакет Mac - это просто каталог на уровне Unix, но пользовательский интерфейс рассматривает его как один файл, почти как у вас есть файлы JAR в Java, и когда вы щелкаете по нему, вы обычно не видите что внутри, если вы явно не выбрали, чтобы показать содержимое).
Википедия называет фреймворк "модным словом". Он определяет структуру программного обеспечения как
Программная структура - это повторно используемая конструкция для программной системы (или подсистемы). Программная структура может включать в себя программы поддержки, библиотеки кодов, язык сценариев или другое программное обеспечение, помогающее разрабатывать и склеивать различные компоненты программного проекта. Различные части платформы могут быть представлены через API.
Так что я бы сказал, что библиотека - это просто библиотека. Это набор объектов / функций / методов (в зависимости от вашего языка), и ваше приложение "ссылается" на него и, таким образом, может использовать объекты / функции / методы. В основном это файл, содержащий повторно используемый код, который обычно может использоваться несколькими приложениями (вам не нужно писать один и тот же код снова и снова).
Фреймворк может быть всем, что вы используете в разработке приложений. Это может быть библиотека, набор из множества библиотек, набор сценариев или любое программное обеспечение, необходимое для создания приложения. Рамки это просто очень расплывчатый термин.
Вот статья о каком-то парне на тему " Библиотека против фреймворка". Я лично считаю, что эта статья является весьма спорной. Это не неправильно, что он говорит там, однако, он просто выбирает одно из множества определений фреймворка и сравнивает его с классическим определением библиотеки. Например, он говорит, что вам нужна структура для подклассов. В самом деле? Я могу иметь объект, определенный в библиотеке, я могу ссылаться на него и подкласс его в моем коде. Я не понимаю, как мне нужна "основа" для этого. В некотором смысле он скорее объясняет, как термин "каркас" используется в наши дни. Это просто раскрученное слово, как я уже говорил. Некоторые компании выпускают только обычную библиотеку (в любом смысле классической библиотеки) и называют ее "структурой", потому что это звучит более навороченно.
Библиотека выполняет определенные, четко определенные операции.
Каркас - это скелет, где приложение определяет "мясо" операции, заполняя каркас. У скелета все еще есть код для соединения частей, но самая важная работа выполняется приложением.
Примеры библиотек: сетевые протоколы, сжатие, манипулирование изображениями, строковые утилиты, оценка регулярных выражений, математика. Операции являются автономными.
Примеры фреймворков: система веб-приложений, менеджер плагинов, система графического интерфейса. Фреймворк определяет концепцию, но приложение определяет фундаментальную функциональность, о которой заботятся конечные пользователи.
Я думаю, что главное отличие состоит в том, что фреймворки следуют " голливудскому принципу", то есть "не звоните нам, мы вам позвоним".
По словам Мартина Фаулера:
Библиотека - это, по сути, набор функций, которые вы можете вызывать, в наши дни обычно организованные в классы. Каждый вызов выполняет некоторую работу и возвращает управление клиенту.
Фреймворк воплощает в себе некоторый абстрактный дизайн с большим количеством встроенного поведения. Чтобы использовать его, вам нужно вставить свое поведение в различные места фреймворка либо путем создания подклассов, либо путем подключения ваших собственных классов. Код платформы затем вызывает ваш код в этих точках.
Библиотека:
Это просто набор процедур (функциональное программирование) или определений классов(объектно-ориентированное программирование). Причиной этого является простое повторное использование кода, то есть получение кода, который уже был написан другими разработчиками. Классы или подпрограммы обычно определяют конкретные операции в конкретной области домена. Например, есть несколько библиотек математики, которые могут позволить разработчику просто вызвать функцию без повторения реализации алгоритма.
Фреймворк:
Во фреймворке весь поток управления уже существует, и есть множество предопределенных белых пятен, которые мы должны заполнить нашим кодом. Фреймворк обычно более сложный. Он определяет скелет, где приложение определяет свои собственные функции, чтобы заполнить скелет. Таким образом, ваш код будет вызываться фреймворком, когда это необходимо. Преимущество заключается в том, что разработчикам не нужно беспокоиться о том, хорош дизайн или нет, а нужно только реализовать специфичные для предмета функции.
Библиотека,Framework и представление вашего кода:
KeyDifference:
Ключевым отличием библиотеки от фреймворка является "инверсия контроля". Когда вы вызываете метод из библиотеки, вы находитесь под контролем. Но с фреймворком управление перевернуто: фреймворк зовет вас. Источник.
Связь:
Оба они определили API, который используется программистами для использования. Чтобы объединить их, мы можем представить библиотеку как определенную функцию приложения, каркас как скелет приложения, а API - это соединитель для их объединения. Типичный процесс разработки обычно начинается с фреймворка и заполняет функции, определенные в библиотеках, через API.
Вы звоните в библиотеку.
Фреймворк зовет вас.
図 書館 助 け 足 場 が 痛 い 多 く の 涙
Как я всегда описывал это:
Библиотека - это инструмент.
Фреймворк - это образ жизни.
Библиотека, в которой вы можете использовать любую маленькую часть, которая вам поможет. Фреймворк, которому вы должны посвятить весь свой проект.
С точки зрения веб-разработчика:
Библиотека может быть легко заменена другой библиотекой. Но рамки не могут.
Если вам не нравится библиотека выбора даты jquery, вы можете заменить ее на другую программу выбора даты, такую как загрузчик даты или начальную загрузку.
Если вам не нравится AngularJS, на котором вы создали свой продукт, вы не можете просто заменить его какими-либо другими фреймворками. Вы должны переписать всю свою базу кода.
В основном библиотека требует гораздо меньшего обучения по сравнению с Frameworks. Например: underscore.js - это библиотека, Ember.js - это фреймворк.
Мне нравится ответ Коэнса, но более техническое определение таково: ваш код вызывает библиотеку. Фреймворк вызывает ваш код. Например, графический интерфейс вызывает ваш код через обработчики событий. Веб-фреймворк вызывает ваш код через некоторую модель запрос-ответ.
Это также называется инверсией управления - внезапно среда решает, когда и как выполнять ваш код, а не наоборот, как в случае с библиотеками. Это означает, что фреймворк также оказывает гораздо большее влияние на то, как вы должны структурировать свой код.
Я забыл, где я видел это определение, но я думаю, что это довольно мило.
Библиотека - это модуль, который вы вызываете из своего кода, а фреймворк - это модуль, который вызывает ваш код.
Фреймворк может быть сделан из разных библиотек. Давайте возьмем пример.
Допустим, вы хотите приготовить рыбное карри. Тогда вам понадобятся такие ингредиенты, как масло, специи и другие полезности. Вам также нужна рыба, на которой вы будете готовить блюдо (это данные вашего заявления). все ингредиенты вместе называются рамками. Теперь вы будете использовать их один за другим или в комбинации, чтобы сделать рыбу карри, которая является вашим конечным продуктом. Сравните это с веб-фреймворком, который состоит из underscore.js, bootstrap.css, bootstrap.js, fontawesome, AngularJS и т. Д. Например, Twitter Bootstrap v.35.
Теперь, если вы рассматриваете только один ингредиент, как, скажем, масло. Вы не можете использовать любое масло, которое хотите, потому что тогда оно разрушит вашу рыбу (данные). Вы можете использовать только оливковое масло. Сравните это с underscore.js. Теперь, какую марку масла вы хотите использовать, зависит от вас. Некоторые блюда были приготовлены с использованием американского оливкового масла (underscore.js) или индийского оливкового масла (lodash.js). Это только изменит вкус вашего приложения. Поскольку они служат практически одной цели, их использование зависит от предпочтений разработчика, и их легко заменить.
Framework: коллекция библиотек, которые предоставляют уникальные свойства и поведение для вашего приложения. (Все ингредиенты)
Библиотека: четко определенный набор инструкций, которые обеспечивают уникальные свойства и поведение ваших данных. (Масло на рыбе)
Плагин: сборка утилиты для библиотеки (ui-router -> AngularJS) или множества библиотек в комбинации (date-picker -> bootstrap.css + jQuery), без которой ваш плагин мог бы теперь работать должным образом.
PS AngularJS - это фреймворк MVC, но библиотека JavaScript. Потому что я считаю, что библиотека расширяет стандартное поведение нативных технологий (в данном случае JavaScript).
Я постараюсь объяснить, как будто вам пять.
Представим, что недавно вы открыли в своем городе ресторан, где подают бургеры. Но вы чувствуете, что новичку так сложно приготовить гамбургер. Вы думали о простом способе приготовить гамбургеры для клиентов. Кто-то сказал вам, что есть McDonald Burger Framework и BurgerKing Burger Framework.
Если вы используете McDonald Burger Framework, сделать бургер Big Mac очень просто . (но вы не можете сделать Whopper.)
Если вы используете BurgerKing Burger Framework, сделать Whopper Burger очень просто . (однако вы не можете сделать Биг Мак)
Во всяком случае, в конце концов, они все гамбургеры. Здесь важно то, что для приготовления гамбургеров вы должны следовать их правилам. в противном случае вам станет еще труднее сделать это или вы не сможете это сделать.
И вы также слышали, что есть что-то, что называется Simple Burger-Patty Library .
Если вы используете эту библиотеку, вы можете легко приготовить любую котлету для гамбургеров (скорость X2). На самом деле не имеет значения, используете ли вы McDonald Burger Framework или BurgerKing Burger Framework. В любом случае вы все равно можете использовать эту простую библиотеку Burger-Patty . (Даже вы можете использовать эту библиотеку без фреймворков.)
Вы сейчас видите разницу между Framework и библиотекой ?
Как только вы начали использовать McDonald Burger Framework . Перейти на BurgerKing Burger Framework будет непросто . Так как придется менять всю кухню.
Но библиотеку было бы намного проще переключить на другие. а можно просто не использовать.
Вот как я об этом думаю (и видел, как это рационализировали другие):
Библиотека - это то, что содержится в вашем коде. А фреймворк - это контейнер для вашего приложения.
Здесь приведена горькая статья Джоэла Спольски, но она содержит хорошее различие между наборами инструментов, библиотеками, фреймворками и т. д.
Библиотека реализует функциональные возможности для узкопрофильной цели, тогда как инфраструктура, как правило, представляет собой набор библиотек, обеспечивающих поддержку более широкого диапазона функций. Например, библиотека System.Drawing.dll обрабатывает функции рисования, но является только одной частью общей платформы.NET.
Библиотека. Любой набор классов или компонентов, которые могут использоваться клиентом для выполнения определенной задачи.
Framework - требует от вас определенных рекомендаций по подключению к чему-то большему, чем вы. Вы просто предоставляете материалы, специфичные для вашего приложения / требований, в соответствии с требованиями публикации, так что "работа с фреймами может облегчить вашу жизнь".
Библиотеки предназначены для простоты использования и эффективности. Например, вы можете сказать, что библиотека Zend помогает нам выполнять различные задачи с ее четко определенными классами и функциями. В то время как инфраструктура обычно требует определенного способа реализации решения, такого как MVC (Model -view-controller) (ссылка). Это четко определенная система для распределения задач, как в MVC. Модель содержит сторону базы данных, представления предназначены для интерфейса пользовательского интерфейса, а контроллеры предназначены для бизнес-логики.
Инверсия управления - это ключевая часть того, что отличает фреймворк от библиотеки. Библиотека - это, по сути, набор функций, которые вы можете вызывать, в наши дни обычно организованные в классы. Каждый вызов выполняет некоторую работу и возвращает управление клиенту.
Фреймворк воплощает в себе некоторый абстрактный дизайн с большим количеством встроенного поведения. Чтобы использовать его, вам нужно вставить свое поведение в различные места фреймворка либо путем подкласса, либо путем подключения ваших собственных классов. Код платформы затем вызывает ваш код в этих точках.
Я думаю, что вы хорошо заметили разницу: фреймворк обеспечивает фрейм, в котором мы выполняем нашу работу... Каким-то образом, он более "сдерживающий", чем простая библиотека.
Фреймворк также должен добавить согласованности в набор библиотек.
Я думаю, что библиотека - это набор утилит для достижения цели (например, сокеты, криптография и т. Д.). Фреймворк библиотека + БЕЗОПАСНОЕ ОБЕСПЕЧЕНИЕ. Например, ASP.NET - это фреймворк: он принимает HTTP-запросы, создает объект страницы, вызывает события lyfe cicle и т. Д. Фреймворк делает все это, вы пишете немного кода, который будет выполняться в определенное время жизненного цикла. текущий запрос!
Во всяком случае, очень интересный вопрос!
Ваша интерпретация звучит довольно хорошо для меня... Библиотека может быть чем угодно, которая компилируется и самодостаточна для повторного использования в другом коде, ее содержание буквально не ограничено.
С другой стороны, ожидается, что фреймворк будет иметь ряд возможностей для использования в какой-то конкретной области разработки приложений, как, например, в вашем примере, MVC.
Я не помню источник этого ответа (я думаю, я нашел его в.ppt в Интернете), но ответ довольно прост.
Библиотека и платформа - это набор классов, модулей и / или кода (в зависимости от языка программирования), которые могут использоваться в ваших приложениях и помогают вам решить конкретную "проблему".
Эта проблема может заключаться в регистрации или отладке информации в приложении, рисовании диаграмм, создании определенного формата файла (html, pdf, xls), подключении к базе данных, создании части приложения или полного приложения или кода, примененного к Шаблон дизайна.
У вас может быть Фреймворк или Библиотека для решения всех этих проблем, и многие другие, обычно фреймворки, помогают вам решать более сложные или большие проблемы, но это является следствием их основного различия, а не основного определения для обоих.
Основное различие между библиотекой и платформой - это зависимость между их собственным кодом. Другими словами, чтобы использовать платформу, вам нужно использовать почти все классы, модули или код в FW, но для использования библиотеки вы можете использовать один или несколько классов, модулей или кода в lib в вашем собственном приложении
Это означает, что если, например, Framework имеет 50 классов, чтобы использовать Framework в приложении, которое вам нужно использовать, скажем, 10-15 или более классов в вашем коде, потому что именно так разработан Framework, некоторые классы (объекты этих классов) являются входными данными / параметрами для методов в других классах в рамках. Смотрите.NET Framework, Spring или любой MVC-фреймворк.
Но, например, библиотека журналов, вы можете просто использовать класс Log в своем коде и помочь вам решить "проблему журналирования", это не означает, что библиотека журнала не имеет больше классов в своем коде, как классы обрабатывать файлы, обрабатывать вывод на экран или даже базы данных, но вы никогда не трогаете / не используете эти классы в своем коде, и именно поэтому библиотека, а не фреймворк.
И также есть больше категорий, чем Frameworks и Библиотеки, но это не по теме.
Мне удалось объединить пару ресурсов и придумать это, надеюсь, это поможет.
Это "короткое длинное" описание
Что такое библиотека?
Библиотека — это набор блоков кода (могут быть в виде переменных, функций, классов, интерфейсов и т. д.), которые создаются разработчиками для облегчения процесса разработки программного обеспечения для других разработчиков, которые считают его актуальным.
Что такое фреймворк?
Что касается определения библиотеки, мы могли бы определить фреймворк как инструмент, который помогает разработчику решать широкий спектр проблем, связанных с предметной областью, предоставляя разработчику необходимые библиотеки в контролируемой среде разработки.
Библиотека против фреймворка
Мартин Фаулер - InversionOfControl
Библиотека и фреймворк - это внешний код по отношению к вашему коду. Это может быть файл (например,
.jar
) или системный код (часть ОС) ...
Library
представляет собой набор полезного кода. Основное внимание уделяется вашему коду. Библиотека решает узкий круг задач. Например - утилиты, сортировка, модуляризация
your code ->(has) Library API
Framework
это нечто большее. Фреймворк решает широкий круг задач (предметно-ориентированных). Инверсия управления - ваш код зависит от логики фреймворка, событий ... В результате фреймворк вызывает ваш код. Это заставляет ваш код придерживаться своих правил (реализовать / расширить протокол / интерфейс / контракт), передать лямбда-выражения ... Например - тесты, контейнер IoC, графический интерфейс ...
your code ->(has) and ->(implements) Framework API
На основе определений, данных в книге « Паттерны дизайна » Эриха Гаммы и др .:
- библиотека: набор связанных процедур и классов, составляющих многоразовую реализацию;
- framework: набор взаимодействующих классов с шаблонными методами, составляющих многоразовую спецификацию. Он устанавливает поток управления и позволяет подключиться к этому потоку для адаптации структуры к конкретной проблеме, переопределив в подклассе методы ловушки, вызываемые шаблонными методами в классах платформы.
Код конкретной проблемы может использовать библиотеки и реализовывать фреймворки.
На самом деле это зависит от того, какое определение вы дадите терминологии. Вероятно, существует много разных определений.
Я думаю, что следующие хорошие объяснения, основанные на том, что я считаю, относится к этой терминологии:
Детерминированная библиотека
Детерминированная библиотека содержит функции, которые являются детерминированными на основе а) ввода функции или б) состояния, которое каким-то образом поддерживается во время вызовов функций.
Если логика вводится зависимостями в детерминированную библиотеку, такая логика должна соответствовать конкретной спецификации, чтобы не влиять на вывод библиотеки.
Пример: библиотека обнаружения столкновений, которая по какой-то причине зависит от функции сортировки, помогающей в этих вычислениях. Эту функцию сортировки можно настроить в целях оптимизации (например, посредством внедрения зависимостей, связывания во время компиляции и т. Д.), Но она всегда должна соответствовать одному и тому же отображению ввода / вывода, чтобы сама библиотека оставалась детерминированной.
Индетерминированная библиотека
Индетерминированная библиотека может содержать недетерминированные функции, взаимодействуя с другими внешними недетерминированными библиотеками, к которым она каким-то образом получила доступ.
Я обычно называю недетерминированные библиотеки службами.
Пример: покерная библиотека, которая зависит от службы генератора случайных чисел для перетасовки колоды. Вероятно, это плохой пример, потому что для архитектурных целей мы должны выдвинуть недетерминированный аспект этой библиотеки наружу. Вместо этого покерная библиотека могла бы стать детерминированной и поддающейся тестированию единиц, принимая предварительно перетасованную колоду карт, и теперь ответственность за перетасовку колоды лежит на пользователе этой библиотеки, если он того пожелает.
Фреймворк
Фреймворк - это нечто среднее между детерминированной и недетерминированной библиотекой.
Любая логика, которая вводится зависимостями в фреймворк, должна быть детерминированной на время существования этого экземпляра функции, но разные экземпляры функций с различной логикой могут быть внедрены при отдельном выполнении функций фреймворка.
Пример: функции, которые работают со списками, такими как