Разница между фреймворком и контейнером?

Я читал этот вопрос на SO: Framework vs. Toolkit vs. Library, где объясняется Разница между фреймворком и библиотекой. Общее мнение состоит в том, что основное отличие заключается в инверсии управления, поэтому у вас есть горячие точки в структуре, к которым вы прикрепляете функциональность своего приложения (по сути, вы выбираете между наследованием/шаблоном/тяжелым весом или композицией/стратегией/легким для достижения этого).

Хорошо, теперь мне интересно, в чем тогда разница между фреймворком и контейнером? Я видел следующее определение контейнера (от Рода Джонсона): «Контейнер — это фреймворк, в котором запускается код/объекты приложения». И именно это меня смутило. Я думал, что это более или менее определение любого фреймворка :) Я имею в виду, что если вы используете IoC в качестве параметра, который делает разницу между библиотекой и фреймворком (он же вы называете библиотеку, но фреймворк называет вас), то не означает ли это, что больше или менее какая-либо структура удовлетворяет приведенному выше определению контейнера?

Заранее спасибо.


person Kovasandra    schedule 05.09.2011    source источник


Ответы (2)


Я думаю, вы смешиваете принцип инверсии управления и инструмент IoC.

Основная характеристика фреймворка заключается в том, что он следует принципу IoC и вызывает ваш код (как объяснено в связанном потоке). Контейнер IoC — это просто инструмент, а не полноценная структура, помогающая вам писать связанный слабосвязанный код, следуя принципу IoC.

В целом (по крайней мере, в .Net) в основе этого инструмента лежит класс Container, где происходит регистрация/разрешение/построение графа объектов и т. д., но я считаю, что это имя является историческим артефактом, основанным на названии PicoContainer и статье Мартина Фаулера Инверсия контейнеров управления и шаблон внедрения зависимостей.

person Jan Christian Selke    schedule 06.09.2011
comment
Я все еще в замешательстве :) Вы только что ввели здесь еще один термин: инструмент. Хорошо, вы можете определить инструмент? В чем разница между вашим определением инструмента и вашим определением фреймворка? Когда вы говорите, что контейнер IoC — это просто инструмент, а не полноценная структура, помогающая вам писать связный, слабосвязанный код в соответствии с принципом IoC. Я думаю, что цель хорошей среды также состоит в том, чтобы помочь вам писать связный, слабосвязанный код. следуя принципу IoC :) - person Kovasandra; 06.09.2011
comment
Инструмент — это часть программного обеспечения, которое помогает вам развиваться. Так что каждый фреймворк можно назвать инструментом. В этом смысле инструмент означает очень маленький фреймворк. Хороший фреймворк — это тот, который выполняет свое предназначение, но автоматически не помогает вам писать слабосвязанный код. Например, NHibernate хорош в управлении персистентностью, но помогает ли он автоматически писать хороший код? Думаю, нет. Цель инструмента/фреймворка IoC - слабо связать ваш код. - person Jan Christian Selke; 06.09.2011
comment
Конечно, Hibernate не означает автоматически, что ваш код является связным и слабо связанным, но он дает вам относительно простой способ добиться того, чтобы ваш код, связанный с сохраняемостью, был связным и слабо связанным. Ни один фреймворк не сделает ваш код связным и слабо связанным автоматически, но его цель — дать вам простой способ сделать это. Даже если вы используете Spring, например, ваш код может быть тесно связан с контейнером IoC, если вы используете его неправильно :) Итак, если я вас правильно понял, вы думаете, что контейнер/инструмент в некотором смысле просто маленькая рамка? - person Kovasandra; 06.09.2011
comment
Инструмент — это небольшой фреймворк, а контейнер — это центральный класс специализированного инструмента/фреймворка IoC, как и сам инструмент/фреймворк. - person Jan Christian Selke; 06.09.2011
comment
Хорошо, это то, что я хотел услышать :) Спасибо. - person Kovasandra; 06.09.2011

Контейнер — это полный пакет ОС и кодов, который позволяет запускать пользователя или модель выполнения. Framework содержит весь код, необходимый для конкретного процесса (например, в python, если мы хотим создать набор данных для тестирования поезда, у нас есть встроенный код из sklearn).

person user15630755    schedule 14.04.2021