Model execution framework что это
Что такое MEF
Платформа Managed Extensibility Framework (MEF) — это библиотека для создания простых и расширяемых приложений. Она позволяет разработчикам приложений находить и использовать расширения без каких-либо настроек. Она также позволяет разработчикам расширений легко инкапсулировать код и избегать ненадежных жестких зависимостей. MEF позволяет повторно использовать в приложениях не только расширения, но и целые приложения.
Проблема расширяемости
Представьте себе, что вы являетесь архитектором крупного приложения, которое должно обеспечивать поддержку для расширяемости. Приложение должно включать потенциально большое количество небольших компонентов, а также отвечает за их создание и запуск.
Простейшим подходом к решению такой проблемы является включение компонентов в виде исходного кода в приложение и их вызов прямо из кода. Такой подход имеет ряд очевидных недостатков. Самое главное, что нельзя добавлять новые компоненты без изменения исходного кода — данное ограничение может быть приемлемым, например, для веб-приложения, но не для клиентского приложения. Столь же проблематичной может оказаться ситуация, что у вас не будет доступа к исходному коду для компонентов, так как они могут разрабатываться сторонними производителями, и в силу ряда причин вы не сможете разрешить им доступ к своим приложениям.
Несколько более сложный подход будет заключаться в предоставлении точки или интерфейса расширения, позволяющего разделять приложение и его компоненты. В рамках этой модели можно предоставить интерфейс, который может реализовывать компонент, а также интерфейс API, позволяющий ему взаимодействовать с приложением. Это позволяет решить проблему необходимости доступа к исходному коду, но по-прежнему имеет свои собственные сложности.
Так как приложение не в состоянии самостоятельно обнаруживать компоненты, ему по-прежнему необходимо явным образом сообщать, какие компоненты имеются в наличии и подлежат загрузке. Обычно для этого применяется явная регистрация доступных компонентов в файле конфигурации. Это означает, что обеспечение нужных компонентов превращается в задачу обслуживания, особенно в тех случаях, когда обновление должен выполнять конечный пользователь, а не сам разработчик.
Кроме того, компоненты могут взаимодействовать друг с другом, за исключением строго определенных каналов самого приложения. Если в архитектуре приложения не учтена потребность в определенной связи, то обычно это оказывается невозможным.
Наконец, разработчики компонентов вынуждены принимать жесткие зависимости от того, какая именно сборка содержит реализуемый ими интерфейс. Это затрудняет возможное применение компонента в нескольких приложениях и также может вызвать проблемы при создании тестовой платформы для компонентов.
Сведения о возможностях MEF
Вместо явной регистрации доступных компонент MEF позволяет обнаруживать их неявным образом — с помощью композиции. Компонент MEF, называемый частью, декларативно указывает как свои зависимости (называемые импортом), так и свои возможности, которые он предоставляет (называемые экспортом). При создании некоторой части обработчик композиции MEF удовлетворяет свои импортируемые компоненты за счет элементов, доступных из других частей.
Такой поход позволяет решить проблемы, рассмотренные в предыдущем разделе. Так как части MEF декларативно указывают свои возможности, они могут быть обнаружены во время выполнения, то есть приложение может применять части без жестко кодированных ссылок или ненадежных файлов конфигурации. Платформа MEF позволяет приложениям обнаруживать и анализировать части с помощью своих метаданных без создания экземпляров и даже без загрузки их сборок. В результате нет необходимости четко указывать время и способ загрузки расширений.
Кроме обеспечиваемого экспорта, часть может указать свои импортируемые элементы, которые будут заполнены другими частями. Это делает связь между частями не только возможной, но и простой, и обеспечивает качественное разбиение кода. Например, общие для нескольких компонентов службы можно выделить в отдельную часть, которую можно будет легко изменять или заменять.
Так как для модели MEF жесткие зависимости от определенной сборки приложения не требуются, она позволяет повторно использовать расширения в различных приложениях. Это также упрощает разработку окружения теста, не зависящего от приложения, для тестирования компонентов расширений.
Расширяемое приложение, созданное с помощью платформы MEF, объявляет импортируемый элемент, который может быть заполнен компонентами расширения, а также может объявить экспортируемые элементы, позволяющие применять службы приложений для расширений. Каждый компонент расширения объявляет экспортируемый элемент, а также может объявлять импортируемые элементы. Таким образом, сами компоненты расширения автоматически становятся расширяемыми.
Где доступна MEF
MEF и MAF
SimpleCalculator — пример приложения
Чтобы узнать о возможностях MEF, проще всего создать простое приложение MEF. В этом примере выполняется создание очень простого калькулятора, который называется SimpleCalculator. SimpleCalculator предназначен для создания консольного приложения, принимающего основные арифметические команды в формате «5 + 3» или «6 - 2» и возвращающего правильные ответы. Благодаря применению MEF, вы сможете добавлять новые операторы без изменения кода приложения.
Чтобы скачать полный исходный код для этого примера, см. раздел Пример SimpleCalculator (Visual Basic).
Пример с SimpleCalculator предназначен просто для демонстрации концепции и синтаксиса платформы MEF, а не описания реального сценария для ее использования. Многие приложения, которые будут использовать возможности MEF, являются более сложными, чем SimpleCalculator. Более сложные примеры см. в разделе Managed Extensibility Framework в GitHub.
Чтобы приступить к работе, создайте проект консольного приложения в Visual Studio и назовите его SimpleCalculator .
Если вы используете Visual Basic, добавьте ключевое слово Public в строку, в которой объявляется модуль Module1 .
Контейнер композиции и каталоги
Основным элементом модели композиции MEF является контейнер композиции, который содержит все доступные части и выполняет композицию. Композиция обеспечивает сопоставление импортируемых и экспортируемых элементов. Наиболее распространенным типом контейнера композиции является CompositionContainer, который вы будете использовать для SimpleCalculator.
Если вы используете Visual Basic, добавьте открытый класс с именем Program в Module1.vb.
Добавьте следующую строку в класс Program в Module1.vb или Program.cs:
Для обнаружения доступных частей в контейнерах композиции используется каталог. Каталог – это объект, который делает доступными части, обнаруженные в определенном источнике. MEF содержит каталоги для обнаружения частей с заданным типом, сборкой или директорией. Разработчики приложений могут легко создавать новые каталоги для обнаружения частей из других источников, например, веб-служб.
Добавьте следующий конструктор в класс Program :
Вызов ComposeParts указывает контейнеру композиции на необходимость компоновки определенного набора частей (в данном случае текущий экземпляр Program ). Однако на этом этапе ничего не происходит, так как в Program нет импортируемых элементов для заполнения.
Импортируемые и экспортируемые элементы с атрибутами
Во-первых, необходимо выбрать Program для импорта калькулятора. Это позволит отделять вопросы пользовательского интерфейса, например, ввод и вывод консоли, который будет поступать в Program , от логики калькулятора.
Добавьте следующий код в класс Program :
Следует отметить, что объявление объекта calculator не является необычным, однако он содержит атрибут ImportAttribute. Этот атрибут объявляет что-нибудь, подлежащее импорту; то есть, это будет заполнено обработчиком композиции при составлении объекта.
Каждый импортируемый элемент имеет контракт, определяющий, с какими экспортируемыми элементами будет выполняться сопоставление. Контракт может быть явно заданный строкой, или он может создаваться автоматически платформой MEF из заданного типа (в данном случае интерфейс ICalculator ). Любой экспортируемый элемент, объявленный с помощью контракта сопоставления, будет подставляться в этот импорт. Следует отметить, что типом объекта calculator на самом деле является ICalculator , это не является обязательным. Контракт не зависит от типа импортирующего объекта. (В этом случае можно опустить typeof(ICalculator) . MEF автоматически предположит, что контракт должен быть основан на типе импорта, если не указано явным образом.)
Добавьте этот простейший интерфейс в модуль или пространство имен SimpleCalculator :
Теперь, после определения ICalculator , нужен класс, который его реализует. Добавьте следующий класс в модуль или пространство имен SimpleCalculator :
Здесь используется экспортируемый элемент, соответствующий импортируемому элементу в Program . Чтобы экспортируемый элемент соответствовал импортируемому, экспорт должен иметь такой же контракт. Экспорт по контракту на основе typeof(MySimpleCalculator) вызовет несовпадение, и импортируемый элемент не будет заполнен; контракт должен в точности совпадать.
Так как контейнер композиции будет заполняться всеми доступными в этой сборке частями, часть MySimpleCalculator будет доступна. Когда конструктор для Program выполняет композицию для объекта Program , его импортируемый элемент будет заполняться объектом MySimpleCalculator , который будет создан для этой цели.
Для уровня пользовательского интерфейса ( Program ) никакая другая информация не требуется. Таким образом, можно заполнить остальную часть логики интерфейса пользователя в методе Main .
Добавьте следующий код в метод Main :
Этот код просто считывает строку входных данных и вызывает функцию Calculate калькулятора ICalculator с результатом, который он записывает в консоль. То есть, весь код, требуемый в Program . Все остальные действия будут выполняться по частям.
Атрибуты Imports и ImportMany
Чтобы приложение SimpleCalculator было расширяемым, оно должно импортировать список операций. Обычный атрибут ImportAttribute заполняется одним и только одним ExportAttribute. Если имеется несколько значений, обработчик композиции выдаст ошибку. Чтобы создать импортируемый элемент, который может заполняться произвольным количеством экспортируемых элементов, можно использовать атрибут ImportManyAttribute.
Добавьте в класс MySimpleCalculator следующее свойство операций:
Lazy<T,TMetadata> — это тип, задаваемый платформой MEF для сохранения косвенных ссылок на экспортируемые элементы. Здесь, кроме самого экспортируемого объекта, вы также получаете метаданные экспорта или информацию, описывающую экспортируемый объект. Каждый Lazy<T,TMetadata> содержит объект IOperation , представляющий собой фактическую операцию, и объект IOperationData , представляющий ее метаданные.
Добавьте следующие простые интерфейсы в модуль или пространство имен SimpleCalculator :
В этом случае метаданными для каждой операции является символ, представляющий данную операцию, например, +, -, * и т. д. Чтобы сделать доступной операцию сложения, добавьте следующий класс в модуль или пространство имен SimpleCalculator :
Атрибут ExportAttribute функционирует так же, как и раньше. Атрибут ExportMetadataAttribute присоединяет метаданные к данному экспортируемому элементу в виде пары "имя значение". Если Add реализует IOperation , то класс, реализующий IOperationData , явным образом не определен. Вместо этого, он создается неявным образом платформой MEF со свойствами на основе имен предоставленных метаданных. (Это один из нескольких способов доступа к метаданным в MEF.)
Композиция на платформе MEF является рекурсивной. Вы явным образом составили композицию объекта Program , импортировавшего ICalculator , который получил тип MySimpleCalculator . MySimpleCalculator , в свою очередь, импортирует коллекцию объектов IOperation , и данный импорт будет заполнен при создании MySimpleCalculator , одновременно с импортируемыми элементами Program . Если Add класс объявил дополнительный импортируемый элемент, он тоже должен быть заполнен, и т. д. Любой незаполненный импорт будет вызывать ошибку композиции. (Однако можно объявить, что импортируемые элементы являются необязательными, или присвоить им значения по умолчанию.)
Логика калькулятора
При наличии всех этих частей все, что остается, представляет собой саму логику калькулятора. Добавьте следующий код в класс MySimpleCalculator для реализации метода Calculate :
Начальные действия анализируют входную строку по левому и правому операндам, а также символ оператора. В цикле foreach анализируется каждый член коллекции operations . Эти объекты относятся к типу Lazy<T,TMetadata>, а доступ к значениям их метаданных и экспортируемому объекту можно получить с помощью, соответственно, свойств Metadata и Value. В этом случае, если обнаружено, что свойство Symbol объекта IOperationData совпадает, калькулятор вызывает метод Operate объекта IOperation и возвращает результат.
Для завершения работы над калькулятором также нужен вспомогательный метод, который возвращает позицию первого нецифрового символа в строке. Добавьте в класс MySimpleCalculator следующий вспомогательный метод:
Расширение SimpleCalculator с использованием нового класса
Теперь, когда калькулятор работает, добавление новой операции является простой задачей. Добавьте следующий класс в модуль или пространство имен SimpleCalculator :
Скомпилируйте и запустите проект. Выполните операцию вычитания, например, "5 - 3". Теперь калькулятор выполняет операции вычитания наряду со сложением.
Расширение SimpleCalculator с использованием новой сборки
Добавить классы в исходный код достаточно просто, но MEF позволяет искать части за пределами собственного источника приложения. Чтобы продемонстрировать это, необходимо изменить приложение SimpleCalculator для поиска в каталоге, а также в его собственной сборке, частей путем добавления DirectoryCatalog.
Добавьте новый каталог с именем Extensions в проект SimpleCalculator. Убедитесь, что добавление выполняется на уровне проекта, а не на уровне решения. Затем добавьте новый проект библиотеки классов в решение с именем ExtendedOperations . Новый проект будет скомпилирован в отдельную сборку.
Откройте конструктор свойств проекта для проекта ExtendedOperations и перейдите на вкладку Компиляция или Сборка. Измените значение в поле Выходной путь сборки или Выходной путь так, чтобы оно указывало на каталог расширений в каталоге проекта SimpleCalculator ( ..\SimpleCalculator\Extensions\ ).
В Module1.vb или Program.cs добавьте следующую строку в конструктор Program :
Замените пример пути на путь к каталогу расширений. (Этот абсолютный путь используется только для отладки. В реальном приложении будет использоваться относительный путь.) DirectoryCatalog добавит все части, найденные в сборках в каталоге расширений, в контейнер композиции.
Следует отметить, что для совпадения контрактов атрибут ExportAttribute должен иметь тот же тип, что и ImportAttribute.
Скомпилируйте и запустите проект. Проверьте новый оператор Mod (%).
Заключение
В этом разделе рассмотрены основные концепции платформы MEF.
Части, каталоги и контейнер композиции
Части и контейнер композиции являются базовыми строительными блоками приложения MEF. Часть — это любой объект, который импортирует или экспортирует значение, вплоть до самого себя. Каталог содержит коллекцию частей из определенного источника. Контейнер композиции использует части, предоставленные каталогом для выполнения композиции, привязки импортируемых и экспортируемых элементов.
Импортируемые и экспортируемые элементы
Импортируемые и экспортируемые элементы позволяют компонентам взаимодействовать друг с другом. При импорте компонент указывает на необходимость в определенном значении или объекте, а при экспорте он указывает на доступность значения. Каждый импортируемый элемент сопоставляется со списком экспортируемых элементов при помощи своего контракта.
Следующие шаги
Чтобы скачать полный исходный код для этого примера, см. раздел Пример SimpleCalculator (Visual Basic).
Итак, мы знаем, что в Java есть потоки, о чём можно прочитать в обзоре "Thread'ом Java не испортишь : Часть I - потоки". Давайте ещё раз посмотрим на типовой код: Как мы видим, код для запуска задачи довольно типовой, но на каждый новый запуск нам его придётся повторять. Одно из решений — вынести его в отдельный метод, например, execute(Runnable runnable) . Но разработчики Java за нас уже побеспокоились и придумали интерфейс Executor : Как видно, код стал лаконичнее и позволил нам просто написать код по запуску Runnable в потоке. Здорово, не так ли? Но это только начало:Как видно, у интерфейса Executor есть интерфейс-наследник ExecutorService . В JavaDoc данного интерфейса сказано, что ExecutorService является описанием особого Executor 'а, который предоставляет методы по остановке работы Executor 'а и позволяет получить java.util.concurrent.Future , чтобы отслеживать процесс выполнения. Ранее, в "Thread'ом Java не испортишь : Часть IV — Callable, Future и друзья" мы уже кратко рассмотрели возможности Future . Кто забыл или не читал - советую освежить в памяти ;) Что ещё интересного в JavaDoc написано? Что у нас есть специальная фабрика java.util.concurrent.Executors , которая нам позволяет создавать доступные по умолчанию реализации ExecutorService .
ExecutorService
- поток пытается получить элементы из пустой очереди
- поток пытается положить элементы в полную очередь
ThreadPoolExecutor
Как мы ранее увидели, внутри фабричных методов в основном создаётся ThreadPoolExecutor . На функциональность влияет то, какие значения переданы в качестве максимума и минимума потоков, а также какая очередь используется. А использоваться может любая реализация интерфейса java.util.concurrent.BlockingQueue . Говоря о ThreadPoolExecutor 'ах, стоит отметить интересные особенности при работе. Например, нельзя посылать задачи в ThreadPoolExecutor , если там нет места: Данный код упадёт с ошибкой вида: То есть task нельзя засабмитить, т.к. SynchronousQueue устроена так, что фактически состоит из одного элемента и не позволяет положить туда больше. Как мы видим, queued tasks здесь 0, и в этом нет ничего странного, т.к. это специфика SynchronousQueue — фактически это очередь в 1 элемент, которая всегда пустая. (!) Когда один поток кладёт в очередь элемент, он будет ждать, пока другой поток не заберёт элемент из очереди. Поэтому, мы можем заменить на new LinkedBlockingQueue<>(1) и в ошибке изменится то, что будет указано queued tasks = 1 . Т.к. очередь всего в 1 элемент, то второй мы уже положить не можем. И упадём на этом. Продолжая тему очереди, стоит отметить, что класс ThreadPoolExecutor обладает дополнительными методами по обслуживанию очереди. Например, метод threadPoolExecutor.purge() удалит из очереди все отменённые задачи, чтобы освободить место в очереди. Ещё одной интересной функцией, связанной с очередью, является обработчик непринятых задач: Для примера обработчик просто выводит слово Rejected на каждый отказ принимать задачу в очередь. Удобно, не правда ли? Кроме того, ThreadPoolExecutor имеет интересного наследника — ScheduledThreadPoolExecutor , который является ScheduledExecutorService . Он предоставляет возможность выполнять задачу по таймеру.
ScheduledExecutorService
WorkStealingPool
Помимо указанных выше пулов потоков, есть ещё один. Можно сказать, что он немного особенный. Имя ему — Work Stealing Pool. Если кратко, то Work Stealing — это такой алгоритм работы, при котором простаивающие потоки начинают забирать задачи других потоков или задачи из общей очереди. Посмотрим на пример: Если мы запустим данный код, то ExecutorService нам создаст 5 потоков, т.к. каждый поток будет вставать в wait очередь по локу объекта lock . Про мониторы и локи по нему мы уже ранее разбирались в "Thread'ом Java не испортишь: Часть II — синхронизация". А теперь мы заменим Executors.newCachedThreadPool на Executors.newWorkStealingPool() . Что поменяется? Мы увидим, что наши задачи выполняются не в 5 потоков, а меньше. Помните, что cachedThreadPool создавал на каждую задачу свой поток? Потому что wait блокировал поток, а следующие задачи хотели выполнятся и в пуле для них создавались новые потоки. В случае со StealingPool потоки не будут вечно простаивать в wait , они начнут выполнять соседние задачи. Чем так отличается от остальных тредпулов этот WorkStealingPool ? Тем, что внутри него живёт на самом деле волшебный ForkJoinPool : На самом деле есть ещё одно отличие. Потоки, которые создаются для ForkJoinPool по умолчанию являются демон потоками, в отличие от потоков, созданных через обычный ThreadPool . Вообще, стоит помнить про демон-потоки, т.к. например при CompletableFuture тоже используются демон-потоки, если не указать свою ThreadFactory , которая будет создавать не демон-потоки. Вот такие вот сюрпризы могут ждать в неожиданном месте!)
Fork/Join Pool
В этой части мы поговорим про тот самый ForkJoinPool (его ещё называют fork/join framework), который живёт "под капотом" у WorkStealingPool . Вообще, Fork Join Framework появился ещё в Java 1.7. И пусть уже Java 11 на дворе, но вспомнить всё равно стоит. Не самая распространённая задача, но довольно интересная. На просторах сети есть хороший обзор на эту тему: "Fork/Join Framework в Java 7". Fork/JoinPool оперирует в своей работе таким понятием как java.util.concurrent.RecursiveTask . Также есть аналог — java.util.concurrent.RecursiveAction . RecursiveAction не возвращают результат. Таким образом RecursiveTask похож на Callable , а RecursiveAction похож на Runnable . Ну и смотря на название мы видим два ключевых метода — fork и join . Метод fork запускает асинхронно в отдельном потоке некоторую задачу. А метод join позволяет дождаться завершения выполнения работы. Существует несколько способов использования: Данный картинка — это часть слайда доклада Алексея Шипилёва "Fork/Join: реализация, использование, производительность". Чтобы стало понятнее, стоит посмотреть его доклад на JEE CONF: "Fork Join особенности реализации".Веб-разработчики большую часть времени занимаются кодингом. Они создают сайты или приложения с нуля. В арсенале программистов много инструментов, которые позволяют сэкономить время при решении стандартных задач. Одним из самых популярных являются фреймворки.
В статье расскажем о том, как фреймворки помогают ускорить разработку и разберём виды этих инструментов.
Что такое фреймворк
У новичков, которые делают первые шаги в нише разработки, часто возникают проблемы с фреймворками. Все понимают, что их надо изучить, но тема кажется максимально сложной. Если разобраться в особенностях инструментов, то станет понятно, что освоить их вполне реально.
Фреймворк — платформа для создания сайтов и приложений, которая облегчает разработку благодаря большому количеству реализованных функций. Программисту не надо писать код с нуля. Он берёт готовое решение и создаёт надстройку для реализации продукта.
Фреймворки часто пересекаются с библиотеками. Разработчики используют оба компонента и новички часто не понимают, чем они отличаются. Библиотеки — готовые компоненты, решающие определённые задачи. Например, есть библиотеки для обработки файлов и вывода картинки на экран.
У библиотек и фреймворков одна цель — освободить программиста от постоянного решения однотипных задач. Когда он берёт в работу новый проект, то может не писать весь код, а взять фреймворк, в котором уже есть базовое «ядро» и подключить к нему несколько библиотек.
Главное отличие фреймворка от библиотеки заключается в том, что фреймворк задаёт жёсткие рамки. Разработчик интегрирует свой код в стороннее решение, но не может выйти за пределы стандартной логики. Библиотеки же можно использовать в любой момент или отключить совсем, если есть альтернативы.
Принципиальные отличия фреймворка от библиотеки надо знать всем, чтобы правильно использовать оба инструмента. Когда заказчик просит создать сайт на базе готовой CMS, PHP-фреймворки уже не понадобятся, а вот CSS могут пригодиться. Можно подключить их к проекту и не писать код стандартных функций.
Чтобы новичкам было проще освоить новые понятия, разберём суть терминов на примере строительства. Представьте, что надо построить дом. Заказчик дал чёткое ТЗ и установил сроки. Программист не может выйти за рамки, но у него есть свобода выбора технологий.
Кирпичи, цемент, окна и другие расходники — библиотеки. Их можно менять в зависимости от конфигурации здания. Фреймворк — форма сооружения, его архитектурные особенности. Если мы строим двухэтажный дом и уже есть «коробка», избавиться от второго этажа будет сложно. Это ограничения фреймворка.
А вот заменить окна, двери или цвет здания можно в любой момент. На это понадобятся деньги, но конструкция не пострадает. Фреймворки и библиотеки можно использовать одновременно, чтобы экономить время на разработке и заниматься написанием уникальных функций.
Скорость отрисовки страниц для разных фреймворков
К примеру, программисту нужно создать корпоративный портал с системой профилей и надёжной защитой. На создание такой системы с нуля может уйти несколько месяцев. Проще взять готовый фреймворк, в котором будут закрыты популярные «дыры» безопасности и сосредоточиться на создании личного кабинета.
Популярные фреймворки — результат работы программистов со всего мира. Они постоянно улучшают модуль и он обрастает новыми возможностями. Не надо создавать с нуля формы, кнопки, таблицы и другие элементы. Подключили «ядро» и можно спокойно заниматься реализацией пунктов из технического задания.
Виды фреймворков
Ниша веб-разработки начала развиваться давно, и в какой-то момент разработчики поняли, что большая часть программных решений содержат одинаковый код. Например, работа с файлами в разных операционных системах отличается, но можно один раз написать «скелет», а потом менять его под себя.
Постепенно начали появляться библиотеки и фреймворки. На разработку библиотек уходит меньше времени, потому что они закрывают одну задачу. А вот фреймворки разрабатываются и улучшаются с годами. В них появляются новые функции и «ядро» становится более мощным.
Существуют PHP, CSS и JS-фреймворки. Каждый вид программных инструментов решает свои задачи, но они объединены общей целью — помочь разработчику избавиться от рутины. Вместо того, чтобы писать, к примеру, систему вывода шаблонов страницы для каждого проекта, он может заниматься нестандартными задачами.
Фреймворки и библиотеки не являются лёгким решением проблем. Они лишь дают «фундамент» на базе которого можно создать проект. Если разработчик надеется, что за него сделают всю работу, то эти инструменты так не не умеют.
Количество библиотек и фреймворков для JavaScript постоянно увеличиваются. Появляются более гибкие решения, создатели которых обещают высокую производительность и быстродействие. Разработчикам надо следить за трендами, чтобы через несколько лет не оказалось, что они пользуются устаревшим стеком и он перестал быть востребованным.
PHP-фреймворки используются на бэкенде для формирования базовой структуры. Для фронтенда существует большое количество своих фреймворков, которые помогают быстро собрать «каркас» и изменить его внешний вид.
Для отслеживания популярности фреймворков можно использовать сервис Google Trends. Он показывает динамику спроса на основе количества поисковых запросов. Можно ввести несколько ключей сразу, чтобы отобразить данные на одном графике и сравнить их.
На скриншоте ниже видно, что информацию о React ищут примерно в 2 раза чаще, чем о Vue. Притом, что React — JS-библиотека с открытым исходным кодом, а Vue — фреймворк. В среде разработчиков часто идут споры по поводу принадлежности React к фреймворкам, но информация на официальном сайте чётко говорит о том, что это библиотека.
Фронтенд и бэкенд-фреймворки одинаково полезны. Первые отвечают за внешний вид проекта, а вторые за работу на стороне сервера. Разработчику необходимо освоить хотя бы несколько инструментов каждого типа. Необязательно изучать их досконально, достаточно базовых знаний.
Существуют фуллстек-фреймворки, которые работают на стороне клиента и сервера. Некоторые программисты уделяют их изучению много времени, чтобы создавать сайты и веб-приложения с широкими возможностями.
Какие задачи решают фреймворки
Мы уже несколько раз ответили на этот вопрос, но для лучшего понимания вопроса необходимо увидеть картинку полностью. В глобальном смысле фреймворки ускоряют разработку. Они избавляют разработчика от необходимости тратить время на функции, которые можно взять из стандартных решений.
У фреймворков есть преимущества и недостатки, поэтому их нельзя назвать идеальным инструментом. При правильном использовании они экономят время, но, если у разработчика недостаточно опыта работы, то взаимодействие с новым фреймворком принесёт много проблем.
Какие задачи решают фреймворки:
- Увеличивают скорость разработки. У программиста будет отлаженное «ядро», которое можно использовать как основу проекта.
- Уменьшают стоимости задачи. Если программисту не надо создавать сайт с нуля, а можно использовать фреймворк, он возьмёт гораздо меньше денег за работу. Самописные CMS могут разрабатываться несколько лет, а бюджет нередко достигает сотен тысяч рублей.
- Освобождают от рутинных задач. Разработчик может заниматься реализацией нестандартных функций.
- Помогают остаться конкурентоспособным на рынке. Если программист в совершенстве освоил несколько популярных фреймворков, он не останется без работы.
Фреймворки — не просто удобные инструменты, которые являются незаменимыми для веб-разработчиков. Это «фундамент» для успешной карьеры в нише. Во многих вакансиях указывается обязательное знание фреймворков. Если у соискателя нет опыта, у него меньше шансов получить хорошую работу.
Можно обойтись в работе без фреймворков и библиотек. Разрабатывать сайты на базе готовой системы управления контентом и писать дополнительные модули на PHP. Многие digital-агентства используют популярные CMS и отказываются от фреймворков из-за сложностей с поиском квалифицированных кадров.
Стоимость разработки сайта на фреймворке Yii
У фреймворков открытый исходный код, поэтому любой разработчик может внести изменения в логику и адаптировать программный продукт под свои задачи. Если брать готовое «ядро», то вместе со стандартными функциями в проект «подтянутся» и распространённые проблемы.
Проблемы с безопасностью есть почти у каждого фреймворка. Недоброжелатели могут проанализировать исходный код, найти сайты, использующие фреймворк и получить доступ к конфиденциальной информации, если разработчик самостоятельно не закрыл бреши в безопасности.
Проблемы с безопасностью актуальны и для готовых систем управления контентом. Их часто взламывают через уязвимости в плагинах и в некоторых случаях защититься от проблем практически невозможно.
На сайте может быть 20-30 потенциально небезопасных плагинов. На анализ уязвимостей в каждом из них уйдёт много времени. Поэтому CMS и фреймворки в этом плане особо не отличаются.
Как выбрать фреймворк для работы
Начинающие разработчики часто спрашивают опытных коллег о том, какой фреймворк выбрать для работы. Чтобы потратить несколько лет на его изучение и хорошо зарабатывать. Однозначно ответить на этот вопрос нельзя, потому что ниша веб-разработки постоянно меняется.
При выборе фреймворка надо анализировать данные из нескольких источников. Посмотрите статистику в Google Trends, проанализируйте данные ежегодного опроса разработчиков на портале Stack Overflow, ознакомьтесь с профильными исследованиями.
При выборе фреймворка обратите внимание на комьюнити и документацию. Чем больше людей вовлечены в разработку, тем быстрее будут увеличиваться возможности. Документация помогает решить распространённые проблемы без помощи коллег. Не надо тратить время на публикацию вопросов или поиск опытных программистов.
Статистика вакансий тоже важна, но данные постоянно меняются. Пока будете изучать React или Vue может появиться другой фреймворк, который будет пользоваться спросом у работодателей. Гнаться за трендами не стоит, но надо внимательно следить за ними.
Если собираетесь посвятить годы карьеры разработке, уделите время изучению популярных фреймворков. Это поможет стать востребованным программистом и даст возможность переходить в компании с более выгодными условиями работы.
Для чего нужна платформа
- приложение нужно создать для разных платформ ОС,
- необходимо разработать масштабируемый продукт с высокой производительностью,
- для разработки требуется платформа с открытым исходным кодом.
Система Windows 8 и 8.1 работает с версией 4.5.1, а Windows 10 требуется версию поновее — 4.6, 4.6.1 или 4.6.2
На момент написания этой статьи наиболее актуальная версия — 4.8. Устанавливают её через автономный или веб-установщик.
- Веб-установщик весит около 2 МБ, и загружает все компоненты онлайн, поэтому нужно стабильное соединение с интернетом.
- Автономный установщик весит около 60 МБ, зато все компоненты можно установить даже без интернета. Многие разработчики выбирают именно автономный установщик, потому что он всегда под рукой.
Оба установщика имеют одинаковые версии и процесс установки по ним несложный, надо просто следовать инструкциям системы.
Как устранить неполадки при установке
Проверьте версию Windows
Если вы хотите использовать версию, которую не поддерживает ваша система, вам придётся обновить систему до Windows 8.1 или Windows 10.
Перезагрузите компьютер
Соберите журналы установки
Так должен выглядеть запущенный файл Collect.exe
Коротко о главном
Читайте также: