Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: курс - практикум по frontend разработке*
ТОП 6 популярних CMS

Автор: Армен Маїлян

Тип сайта и его тематика Функциональность сайта На сегодняшний день более половины всех сайтов в сети Интернет используют ту или иную систему управления контентом (Content Management System – CMS). Однако термин CMS не получил, к сожалению, четкого определения. Он может иметь несколько значений в зависимости от сценариев и целей человека или проекта. Некоммерческая международная организация AIIM (Association for Information and Image Management - Ассоциация по вопросам Управления Информацией и Изображениями) ввела в обиход понятия ECM (Enterprise Content Management) и WCM (система управления веб-контентом) как две составных части CMS.  В этом случае под ECM подразумевается программный комплекс, обеспечивающий документооборот, работу внутренней базы знаний и организующий в общем виде набор бизнес-процессов предприятия. Как одну из функций ECM может включать в себя и работу с веб контентом. Хорошим примером такого типа систем является платформа Microsoft SharePoint. В свою очередь WCM стало включать в себя набор инструментов в некотором комплексе, позволяющем управлять веб-сайтом и контентом на нем. Часто также CMS также называют «движком» сайта. В обиходе у разработчиков устоявшимся значением, подразумеваемым под CMS, является некоторая программная система, применяемая для создания, редактирования и управления контентом сайта и устанавливаемая на свой хостинг. В дальнейшем, в этой статье мы примем за основу именно это - последнее определение, более похожее на WCM. Стоит отметить и часто включаемые в число CMS так называемые SaaS решения (software as a service – услуга доступа к программному обеспечению). В случае такого типа услуг компании не предоставляют код, который вы можете скачать, установить и настроить под себя на своём хостинге. Провайдеры услуги SaaS предлагают для клиентов свои платформы, со своим хостингом, своими индивидуальными возможностями без предоставления CMS в обиходном понимании. При такой схеме вы фактически оплачиваете не владение вашим сайтом, а его аренду. В нашей статье мы не будем рассматривать такой тип услуг.   Рассмотрим подходы, которых следует придерживаться, решая вопрос как выбрать движок для сайта.   Критерии выбора CMS для вашего сайта Тип сайта и его тематика Большой выбор различных систем управления контентом на рынке объясняется различиями в типах сайтов, для которых лучше всего конкретная CMS подойдет. Будет это форум или интернет магазин, блог или корпоративный сайт, сайт-визитка или новостной портал – определенность с тематикой сайта это первое, от чего будет зависеть правильный выбор CMS. Функциональность сайта Не смотря на определенную специализацию каждой CMS под определенные задачи, на сегодняшний день для ТОП CMS существует огромное количество различных расширений (плагинов, модулей), существенно увеличивающих их функциональность и возможности «донастройки». К примеру существующими плагинами можно превратить «блоговый» движок в интернет-магазин, а на движке портала сделать форум. Однако нужно понимать, что большое количество дополнительных плагинов будут влиять и на быстродействие, и на безопасность, и на внутреннюю слаженность работы механизмов сайта, из-за возможных конфликтов этих расширений. Также определенный набор проблем может доставить и необходимость регулярных обновлений как самого движка, так и установленных плагинов. Без таких обновлений у вас будут открываться дыры в безопасности, а это вряд ли вам понравится. А обновление большого числа расширений может вызвать конфликты совместимости. Поэтому правильный выбор CMS это баланс между нужной готовой функциональностью движка «из коробки» и количеством (и качеством) установленных расширений. Исходя из задач и потребности в балансе, сложно однозначно ответить на вопрос «какая CMS лучше?». Требовательность к ресурсам Правильный выбор тематики сайта приводит к необходимости выбора условной «мощности» движка. «Мощнее», в нашем случае, вовсе не обязательно значит – «лучше». Если вы нуждаетесь, к примеру, в сайте-визитке, установка движка портала для вас будет избыточной. Значительная часть ресурсов мощной CMS останется не задействованной. При этом требования к хостингу такого сайта будут выше – вам понадобится больше оперативной памяти, больше ресурсов процессора, могут понадобиться некоторые специфические настройки сервера и предустановленное программное обеспечение. Также стоит понимать, что, к примеру, сайты администрации для поселка и для города миллионника хоть и имеют общую тематику, но будут иметь разный дизайн, функциональность, наполнение, разную посещаемость и, соответственно, разные требования. Поэтому, при выборе вам следует исходить и из масштабов вашего будущего сайта. Неправильный выбор выльется либо в необоснованное удорожание и хостинга, и администрирования вашего сайта, либо в нехватку ресурсов. Возможность кастомизации движка Многим владельцам сайтов не хватает возможностей «голой» CMS. Кроме того, из-за специфики каждого конкретно бизнеса и каждого конкретного сайта, возможности расширения с помощью дополнительных плагинов тоже может быть недостаточно. Может потребоваться индивидуальная доработка движка, тем оформления или доработка под заказчика тех плагинов, функциональности которых не вам хватает. В этом вопросе нам очень важно будет понимать следующие моменты: Количество разработчиков на рынке – специалистов по конкретной CMS; Количество и качество документации к CMS и плагинам; Развитость сообщества пользователей и разработчиков конкретной CMS. Можно с уверенностью сказать, что чем более распространён движок – тем больше доступных специалистов, тем проще внести нужные правки и тем дешевле эти правки обойдутся. Стоит уделить внимание и особенностям SEO-оптимизации конкретного движка. Если вы хотите, чтобы аудитория вашего сайта росла, вам придется соответствовать ряду правил, касающихся и скорости работы сайта на различных типах устройств, и внешнего дизайна сайта вообще и конкретных страниц в частности, и внутренней иерархии страниц, и правильной настройки индексации и т.п. Возможность проведения SEO оптимизации вашего сайта сложно переоценить.  Наличие уже встроенных в CMS SEO инструментов или доступных качественных плагинов, а также возможность доработки их под ваши нюансы проекта привлеченными разработчиками, будут очень важны на этапе продвижения вашего сайта. Стоимость CMS и доработки. На рынке сегодня присутствуют как качественные бесплатные, так и значительное количество различных платных CMS. Кроме того, выбирая бесплатные CMS, вам вероятно захочется добавить в них платные расширения.  Выбирая между платными и бесплатными вариантами вам стоит заранее определиться с несколькими моментами: Представить себе (хотя бы приблизительно) стратегию развития вашего сайта. От понимания дальнейших перспектив будет зависеть комбинация доступных расширений и необходимость их доработок. Может так сложиться, что выбор бесплатной CMS, с учетом плагинов и доработок для получения нужного функционала, окажется существенно дороже, чем купить платную CMS и платный плагин, получив при этом техническую поддержку разработчиков этой CMS. Также может оказаться, что нужный для вас плагин под конкретную CMS нужно будет разрабатывать с нуля, тогда как под другую CMS такой плагин есть уже готовый, давно выпущенный и протестированный в реальной работе.   Распространенность CMS и ее востребованность Если выбранный вами движок сайта окажется непопулярным и его разработчики решат перестать выпускать обновления, вы столкнетесь с рядом проблем. Это и падение уровня безопасности системы, и ухудшение внешней привлекательности на фоне новых сайтов-конкурентов, использующих новые технологические решения. Также существенно сложнее будет найти специалиста для внесения доработок в движок, использующий уже устаревшие и непопулярные технологии. В свою очередь выход новейшей версии движка может быть связан с кучей багов системы, наличия новых дыр безопасности, несовместимости со старыми плагинами и другими сложностями. Самописные движки Наличие такого числа сложностей при выборе системы управления для своего сайта может вызвать у вас желание заказать или написать свой сайт с нуля. Действительно, ряд проектов прямо потребует от вас такого подхода. Подключение к своим специфическим сервисам, интеграция с другими уникальными проектами, гибкость в дизайнерских и архитектурных решениях – в определенных обстоятельствах написание своего движка будет правильным решением. Однако стоит сразу учитывать набор проблем, с которыми вам предстоит столкнуться: Подсадка «на иглу» одного разработчика. Полноценно разбираться в куче кода, с слабо или вовсе недокументированными возможностями, сможет только сам автор кода. Новому разработчику может оказаться проще переписывать модули вашего сайта с нуля, чем тратить время на разбор чужого кода. Это с одной стороны существенно удорожит работу, а с другой жестко привяжет вас к конкретному разработчику. Даже сменив одного программиста на другого, вы оказываетесь в той же ситуации, только теперь с новым разработчиком. Сроки и цена разработки. Написание нужных модулей «с нуля» будет стоить значительно дороже и займет значительно больше времени, чем адаптация уже существующего движка и плагинов с хорошей документацией от авторов. Проблемы тестирования и ошибок. В движках, которые используют каждый день миллионы человек, есть значительный плюс – большинство багов выявляются мгновенно и быстро перекрываются обновлениями. Наличие багов в вашей самописной системе будет зависеть как от навыков вашего разработчика, так и от применяемых им технологий. Эта комбинация может нести большое количество скрытых проблем как работоспособности, так и безопасности, которые останутся не выловленными, пока не станет слишком поздно. В результате разработка своего движка оказывается выгодна, практически, только крупным компаниям со своими внутренними отделами разработки и тестирования, которые будут писать свой сайт и поддерживать его работоспособность независимо от сторонних разработчиков. Статистика использования CMS   По данным сайта w3techs.com более 55% всех Web-сайтов в Интернете управляются теми или иными CMS. Как видно из диаграммы более 33% всех сайтов в Интернете работают на движке WordPress. Фактически это более 60% от сайтов, управляемых теми или иными CMS. Следующие по популярности системы CMS: Joomla – 5.4%, Drupal – 3.5%, Magento – 1.8%, PrestaShop – 1.4%. Набравшие в этой диаграмме высокие места Shopify (2.7%), Squarespace (2.7%) и Wix (1.8%) предлагают услуги SaaS (которые мы здесь не рассматриваем). По данным портала WhatСms первое место по числу сайтов среди популярных CMS также принадлежит WordPress - 52.74%. Затем идут Joomla - 5.219%, Drupal - 3.953%, Magento - 2.840%, PrestaShop - 1.671%. Blogger, как и несколько компаний в предыдущей диаграмме, является SaaS платформой. По данным портала BuiltWith первые три места среди не SaaS CMS занимают: WordPress - 28.27%, Joomla – 26.93%, Drupal – 8.84%. По данным портала SimilarTech, предлагающего свой ТОП движков для сайтов, среди 9,5 млн сайтов на CMS также лидирует WordPress, заняв 68% рынка CMS. Слетом идет Drupal (версии 6 и ниже) – 4%, Joomla – 3%, Drupal 7 – 1%, Typo3 – 1%. В число других CMS вошли как SaaS решения, так и другие полноценные CMS, включая и Drupal 8. Проанализировав указанную статистику, мы выбрали следующий 6 ТОП CMS: WordPress, Joomla, Drupal, Magento, PrestaShop и Typo3. Проведем краткий обзор движков для сайтов, входящих в наш ТОП CMS.   1) WordPress Выпущенный впервые в 2003 году, CMS WordPress быстро завоевал популярность как у продвинутых разработчиков, так и простых пользователей. Благодаря простой настройке, не самой высокой требовательностью к ресурсам хостинга и огромному количеству расширений эта CMS уже многие годы занимает первое место. На сегодня именно WordPress называют лучшей CMS для блога. WordPress идеально подходит для довольно простых веб-сайтов, таких как ежедневные блоги и новостные сайты, и для тех, кто ищет для себя простую CMS. Дополнения позволяют легко расширять функциональность сайта. К примеру, благодаря плагину WooCommerce, из сайтов на движке WordPress получается удобный для управления интернет-магазин – один из самых распространенных вариантов интернет-магазинов в сети. Нужно отметить и большое количество SaaS решений, использующих на своей платформе этот движок. Часть успеха WordPress в представленных диаграммах без сомнения относится к SaaS решениям. Официальный сайт WordPress: https://wordpress.org/ Особенности WordPress: Последняя версия - 5.0.3 от 09.01.2019. Написан на PHP. Более старые версии чем 5.0 официально объявлены «небезопасными». Минимальные требования к хостингу, поддержку которых обещает разработчик: PHP 7.3 MySQL 5.6 или MariaDB 10.0; HTTPS; Apache или Nginx. Плюсы WordPress: Бесплатная CMS распространяется с открытым исходным кодом. Огромное количество как платных, так и бесплатных шаблонов, и плагинов. Удобная панель администратора. Простая CMS для пользователя. Отмечают простоту использования и легкость установки как движка, так и тем, и расширений. Большое сообщество. Достаточно высокая производительность. Доступные платные плагины с проверенным качеством. Минусы WordPress: Относительно не маленькая требовательность к ресурсам, особенно при установке значительного числа плагинов. Отсутствие технической поддержки в не SaaS вариантах. Многие плагины написаны некачественно, что создает проблемы в работе и дыры в безопасности. Сайты на WordPress взламывают чаще всего.   Для каких сайтов используют CMS WordPress: Популярность WordPress продолжает расти: При этом в Украине сейчас 34910 сайтов используют эту CMS, а в Российской Федерации - 297353.   2) Joomla CMS Joomla впервые увидела свет в 2005 году. Отражая философию этого движка, его назвали словом, звучащим на суахили как «всё вместе». Фактически разрабатываемая как CMS для порталов, Joomla позволяет создавать сайты с большей гибкостью контента и внутренней структуры, чем WordPress, но при этом с достаточно простым и интуитивно понятным интерфейсом. Эта CMS поддерживает электронную коммерцию, социальные сети и многое другое. Используя этот движок, разработчики создают сайты-визитки, интернет-магазины, фотогалереи, порталы (включая новостные), блоги и другие сайты. Рядом пользователей, Joomla признается лучшей CMS для сайта типа портал. Официальный сайт: https://www.joomla.org/ Особенности движка Joomla: Последняя версия – 3.9.3 от 12.02.2019. Написана на PHP и JavaScript. Минимальные системные требования: PHP 5.3.10; MySQL  5.1 или SQL Server 10.50.1600.1 или PostgreSQL 8.3.18; Apache 2.0 или Nginx 1.0 или Microsoft IIS 7. Плюсы Joomla: Бесплатное распространение с открытым исходным кодом по лицензии GNU GPL v2, включая обновления; Частое предоставление обновлений движка; Большое сообщество пользователей и разработчиков; Большое количество доступных платных и бесплатных тем и плагинов; Относительно не высокий уровень требований к разработчику и пользователю. Минусы Joomla: Отсутствие технической поддержки. Вторая CMS по числу взломов. Joomla применяется в следующих сферах: В Украине 907  сайтов используют эту CMS и 3800 сайтов - в Российской Федерации. Есть определенная тенденция по снижению популярности CMS Joomla: 3) Drupal Впервые вышедшая в 2000 году, CMS Drupal является мощным, удобным для разработчиков инструментом для создания сложных сайтов. Как и большинство мощных инструментов, Drupal требует определенных знаний и опыта для работы. На основе Drupal часто создают порталы, новостные сайты, форумы, интернет-магазины - одни из самых продвинутых сайтов. Тем не менее Drupal является самым сложным для пользователя движков из тройки лидеров. Хотя его использование с каждым выпуском и становится все проще, если вы не готовы погрузиться в изучение этого программного обеспечения или не можете нанять кого-то, кто его знает, возможно, это не лучшая система управления контентом для вас. Официальный сайт: https://www.drupal.org/   Особенности Drupal CMS: Последняя версия 8.6.10; Ядро предоставляет только минимальный функционал, нужный для работы CMS, остальной функционал добавляется за счет плагинов. Установка модулей происходит в связке. Если для реализации функционала какого-то модуля нужны другие модули – они установятся автоматически в связке с первым модулем. Минимальные требования к хостингу для CMS Drupal 8: PHP 5.x/7.x для x86 и PHP 5.x для x64; MySQL 5.5.3 или MariaDB 5.5.20, или Percona Server 5.5.8, или PostgreSQL 9.1.2, или SQLite 3.6.8; Microsoft SQL Server и MongoDB поддерживаются благодаря отдельным модулям; Apache 2.x (используется в качестве Web-сервера для Drupal чаще всего) или Nginx (0.7.x, 0.8.x, 1.0.x, 1.2.x), стабильная версия 1.8.x или 1.9.x. Плюсы Drupal: Бесплатная CMS с открытым исходным кодом GNU GPL 2+. Стабильная работа ядра движка. Большое количество бесплатных тем, и различных расширений. Достаточно развитое сообщество разработчиков. Для решения типовых задач есть готовые наборы плагинов. Drupal известен своей мощной таксономией и способностью отмечать, классифицировать и организовывать сложный контент. Минусы Drupal: Сложность использования для начинающих пользователей. Меньшее количество доступных бесплатных плагинов чем у предыдущих CMS. Отмечают большую требовательность к хостингу за счет более частых обращений движка к базе данных, чем у других движков. Сегодня эту CMS используют в 7110 сайтов в Украине и 45189 сайтов в Российской Федерации. Можно наблюдать определенное снижение интереса к этой CMS по сравнению с 2016 годом:   4) Magento CMS Magento — движок для интернет-магазинов и других вариантов электронной коммерции. В основном популярен в западных странах и слабо представлен в русскоязычной части Интернета из-за слабой интеграции с местными сервисами. В настоящий момент является собственностью Adobe Inc. В основном Magento используется для крупных проектов. Считается не рентабельным использовать его для магазинов с несколькими сотнями позиций в обороте из-за относительно высокой стоимости разработки. Официальный сайт: https://magento.com/. Особенности CMS Magento: Написан на PHP. Последняя версия 2.3.0 от 28.11.2018. Требования к хостингу: LAMP (Linux, Apache, MySQL, and PHP) или LNMP; Apache 2.x или Nginx 1.7.x; PHP 5.6 или 5.5 или 5.4; MySQL 5.6 (Oracle or Percona); HTTPS; Доступ к crontab и к записи в .htaccess. Плюсы Magento: Бесплатная система с открытым исходным кодом. Движок оптимизирован под требования поисковых систем «из коробки». Готовая функциональность движка в базовой версии. Являясь собственностью Adobe Inc., отлично поддерживает интеграцию с сервисами Adobe. Минусы Magento: Несмотря на открытый исходный код, многими разработчиками считается не удобным работать с этой CMS из-за особенности организации ее кода. В бесплатной версии нет технической поддержки, платная версия будет стоить несколько тысяч долларов в год. Отсутствует интеграция с платежными средствами и другими локальными сервисами на постсоветском пространстве. Низкая скорость загрузки страниц сайта «из коробки». Большая часть настроек сайта потребует специфических знаний и навыков.   В Украине на сегодня 1113 сайтов используют CMS Magento и 1774 используют ее в Российской Федерации. После 2016 года можно наблюдать некоторое снижение числа сайтов на этой CMS:    5) PrestaShop PrestaShop – это еще один пример простой CMS с открытым исходным кодом для создания интернет-магазина. Созданный в 2008 году, этот движок достаточно быстро обрел популярность и продолжает ее наращивать. Это достаточно простая бесплатная CMS создана для организации торговых площадок и интернет магазинов. Официальный сайт: https://www.prestashop.com Особенности PrestaShop: Текущая версия – 1.7.5.1 от 18.02.2019. Написан на PHP с применением фреймворка Symfony. Минимальные требования к хостингу: PHP 5.6; MySQL 5.0; Server RAM – чем больше, тем лучше; Unix, Linux или Windows; Apache 2.2 или Nginx 1.0 или Microsoft’s IIS Web server 6.0. Плюсы PrestaShop: Бесплатный движок с открытым исходным кодом. Большое количество доступных тем оформления и расширений. Достаточный для начала работы интернет-магазина стандартный набор базовой версии движка. Имеет отличную русскую локализацию. Богатый выбор модулей для развития интернет-магазина. Хорошая интеграция с различными сервисами на постсоветском пространстве. Простота установки и работы. Удобная интуитивно понятная панель администрирования. Базовая версия имеет хорошую SEO-оптимизацию. Активные сообщества разработчиков. Минусы PrestaShop: Качественные темы и расширения являются платными. Более требователен к ресурсам чем WordPress. Низкая безопасность у бесплатных тем и плагинов. Наблюдаются баги при проведении внутренней оптимизации. Можно видеть рост популярности CMS PrestaShop. Например, на сегодня уже 2461 сайт работает на этом движке в Украине, и 8423 сайтов - в Российской Федерации.    6) Typo3 Typo3 это CMS с открытым исходным кодом. Впервые этот относительно универсальный движок был представлен в 1998 году. Typo3 часто применяется для новостных порталов, интернет-магазинов, корпоративных сайтов и других вариантов сайтов.   Официальный сайт: https://typo3.org/.   Особенности Typo3: Написан на PHP. Последняя версия 9.5.4 от 22.01.2019. Особенностью Typo3 является то, что в проектах на этой CMS вся информация публикуется от администратора и сайты не работают с пользовательским контентом. Typo3 не приспособлена для создания блога, активно взаимодействующего с пользователем портала или социальной сети. Минимальные требования к хостингу: Linux, Windows или Mac; PHP> = 7.2; PostgreSQL / Microsoft SQL Server / MariaDB >= 10.2 / MySQL >= 5 <= 5.7 / SQLite; Apache httpd или Nginx или Microsoft IIS, Caddy Server. Плюсы Typo3: Простота администрирования сайта. Возможность управления несколькими проектами из одной панели администратора. Возможность создания отдельных разделов на сайте с раздельным доступом для разных типов пользователей. Минусы Typo3: Относительно высокая требовательность движка к ресурсам сервера. Сложность изучения документации. Основная часть материалов не переведена с английского. Также, как и у ряда предыдущих CMS, у Typo3 наблюдается снижение популярности с 2016 года. В свою очередь в Украине на этом движке зарегистрировано 399 сайтов, в Российской Федерации - 1327. Полезным будет рассмотреть и сравнение производительности среди ТОП CMS.   Популярные CMS. Сравнение производительности. Согласно опубликованным данным тестирования ряда CMS, можно сделать вывод о наиболее быстром движке (пусть и в искусственных  - «тепличных» условиях теста). Указанные данные в таблице – это количество обрабатываемых запросов в секунду. Наиболее быстрой в данном исследовании среди популярных CMS показала себя WordPress 5.0 с версией PHP 7.3.   Вывод В нашем кратком обзоре CMS мы рассмотрели ТОП 6 наиболее распространенных CMS в мире. Как мы видим, каждая из них имеет свою специфику и особенности. Из-за разных возможных сфер применения сложно выбрать лучшую систему управления сайтом. Как лучшая CMS для блогов многими пользователями отмечается WordPress, а PrestaShop многими определяется как лучшая CMS для сайта интернет-магазина. Стоит понимать, что большая часть представленных в нашем ТОП CMS движков являются относительно универсальными. Кроме PrestaShop и Magento, ориентированных на интернет-коммерцию, с помощью других движков можно делать разнотипные проекты. Однако многими разработчиками признается, что никакая универсальная CMS не будет работать в конкретной сфере также хорошо, как специально разработанная для этой цели CMS. Поэтому, полезно кроме данного обзора ТОП CMS, рассмотреть отдельно ТОП CMS для блогов, ТОП CMS для интернет-магазинов, ТОП CMS для форумов, и далее. Такие обзоры помогут лучше понять, как правильно выбрать движок для сайта с вашими уникальными потребностями. Как вы могли заметить, рассмотренные CMS из ТОП движков для сайтов написаны на PHP. Если вы определились с CMS для своего проекта и хотите его сами доработать, или просто хотите научиться работать с топовыми проектами сети Интернет - вам, вероятно, будет интересен наш набор курсов  и вебинаров на портале ITVDN: WordPress Starter и WordPress Essential WordPress: создаем блог за час Интеграция верстки лендинга на CMS WordPress PHP Starter How To PHP Starter PHP Essential 
400+ питань на співбесіді щодо С++

Автор: Влад Сверчков

Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 5 апреля 2021 года. Оригинальная версия на украинском языке доступна по ссылке. Junior 1.1 Общие вопросы 1.2 Метапрограммирование 1.3 Препроцессор и компиляция 1.4 Язык C 1.5 Язык С++ и ООП 1.6 STL / Algorithms 1.7 Многопоточность 1.8 Networking 1.9 OS/Linux 1.10 SCM / CI / CD 1.11 Практические задания Middle 2.1 Общее 2.2 Препроцессор и компиляция 2.3 Язык С 2.4 Язык С++ 2.5 Паттерны проектирования 2.6 Метапрограммирование 2.7 OOP/OOD 2.8 STL / Algorithms 2.9 Многопоточность 2.10 Networking 2.11 SCM / CI / CD 2.12 Практические задания Senior 3.1 Общее 3.2 Препроцессор и компиляция 3.3 C/C++ 3.4 OOP/OOD 3.5 STL / Algorithms 3.6 Многопоточность 3.7 SCM / CI / CD 3.8 Практические задания Предлагаем список технических вопросов, которые, вероятно, вам поставят на собеседованиях по C++. Вопросы предоставили специалисты, принимающие участие в проведении технических интервью по этому языку. Учтите, что есть широкий спектр специализаций, поэтому выбирайте свое направление и готовьтесь.   Junior   Общие вопросы   1. В чем заключаются основные принципы ООП? 2. Что такое сложность алгоритма? 3. Код работает неправильно. Что делать? 4. Объясните такие структуры данных, как стек и очередь. 5. Какие книги, связанные с программированием, читали? Чему с них научились? 6. Что интересного нашли в новых стандартах С++17, С++20? 7. Что такое таблица ASCII? 8. Что такое Unicode? 9. Что такое паттерны проектирования и для чего их используют? 10. Патерны Singleton, Strategy, Template-Method, Decorator? 11. Для чего нужны модульные тесты? 12. Какая разница между модульными и интеграционными тестами? 13. Что такое TDD?   Метапрограммирование   14. Что такое шаблонный класс и шаблонная функция? 15. Что такое конструкторы? Какие типы знаете? 16. Может ли конструктор быть шаблонной функцией? 17. Может ли виртуальная функция быть шаблонной? 18. Что такое инстанциация шаблона? 19. Что такое специализация шаблона? Частичная специализация шаблона? 20. Расскажите об имплементации шаблонных классов в срр-файле?   Препроцессор и компиляция   21. Как проходит процесс компиляции срр-файлов в бинарный файл? 22. Что такое препроцессор? 23. Как работает препроцессор? 24. Какие знаете команды препроцессора? 25. Как работает директива include? 26. Как работает директива define? 27. Что именно линкует линкер? 28. Что такое оптимизация компилятора? 29. Что такое флажки компиляции? 30. Как защитить хедер от повторного включения? 31. Что делает директива include? 32. Как работают макросы?   Язык C   33. Как static влияет на глобальные/локальные переменные? 34. Как сonst влияет на переменную? 35. Какие варианты использования extern знаете? 36. Какие варианты использования volatile знаете? 37. Какие есть битовые операции? 38. Что такое булевая алгебра? 39. Расскажите об этапах разработки библиотеки или программы. 40. Что такое алгоритмы сортировки и какие вы знаете? 41. Какие алгоритмы работы со строками знаете? 42. Какие алгоритмы на графах знаете? 43. Где может храниться переменная? 44. Какая разница между calloc и malloc? 45. Для чего используют realloc? 46. Что такое указатель? 47. Каков размер указателя и от чего он зависит? 48. Какие есть операции с указателями? 49. Что такое struct? 50. Как определить размер структур? 51. Что такое выравнивание в структурах? 52. Что такое union? 53. Какой размер union?   C++/OOP   54. Что такое класс? 55. Какие есть основные типы данных в C++? 56. Что такое инкапсуляция? Как она реализуется в C++? 57. Какие есть встроенные типы в С++? 58. Что такое enum? 59. Как соотносится класс и объект? 60. Какая разница между структурой и классом? 61. Разница между private/protected/public и где они используются? 62. Какие методы класса являются стандартными для класса? 63. Что такое абстрактный класс и зачем он? 64. Сколько памяти занимает объект пустого класса class A {}; ? 65. Что случится с функцией, если к ней добавить ключевое слово static? В контексте члена класса? В контексте метода класса? 66. Какие особенности статических полей класса? 67. Какая особенность константных методов-членов класса? 68. Как изменить поле класса в константном методе класса? 69. Какие методы можно вызвать из константных объектов? 70. Что такое куча и стек? Различия, принцип работы. 71. В чем разница между указателем и ссылкой? 72. Для чего нужен указатель на функцию? Как его объявить? 73. Что будет, если забыть вызвать delete? Когда освободится эта память? 74. Что такое умный указатель? Какие умные указатели есть в стандартной библиотеке? 75. Как работает std::unique_ptr? 76. Как работает std::shared_ptr? 77. Расскажите о константности переменной, ссылки, указателя. Что такое константный указатель и указатель на константу? Размер указателя в памяти? 78. Расскажите о передаче аргументов по значению, по ссылке и по указателю. 79. Расскажите о порядке вычисления аргументов функции? 80. Что произойдет, если вернуть ссылку на временный объект? 81. Что такое перегрузки функции? Виды перегрузки. 82. Что такое явное и неявное приведение типов в С++? Расскажите о функциях явного приведения типов в C++. 83. Что такое инициализация переменной в if? 84. Что такое ленивые вычисления в С++? 85. Расскажите о циклах for и range-for. 86. Что делает ключевое слово auto? auto-определение return-типа, аргументов функции? 87. Чем отличаются delete и delete [ ] ? Что случится, если вызвать delete у объекта, созданного через new [ ] ? 88. Обработка ошибок в С++. Какие конструкции используют при обработке exception? 89. Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены? 90. Что такое memory leak? 91. Можно ли выбрасывать exception из деструктора? 92. Как отловить деление на 0 в С++? 93. Как работают константные методы? 94. Что такое лямбда-функция в С++? Как получить доступ к переменным во внешней области видимости? 95. Для чего использовать namespace, anonymous namespace? 96. Как вызвать объект из nested namespace? 97. Как работают inline-функции? Может ли такая функция быть рекурсивной? 98. Что такое полиморфизм? 99. Для чего используется наследование? 100. Какие бывают типы наследования? 101. Для чего используют виртуальное наследование? 102. Как можно решить проблему ромбовидного наследования без использования виртуального наследования? 103. Что случится, если класс-наследник передать по значению в функцию, которая принимает базовый класс? 104. Что случится, если пронаследоваться от базового класса, который не имеет виртуального конструктора? 105. Что случится, если вызвать переопределенную virtual function из конструктора? Может ли конструктор быть виртуальным? 106. Может ли pure virtual function иметь имплементацию? Что случится, если вызвать pure virtual function из конструктора? 107. Какие методы генерируются для класса по умолчанию? В каком случае такие методы не будут генерироваться? Как заставить компилятор добавить/удалить эти методы? 108. Как запретить наследовать класс? 109. Какой порядок конструирования и разрушения классов в иерархии? Порядок инициализации полей класса? 110. Какие есть способы инициализации полей класса? 111. Может ли деструктор быть виртуальным? 112. Что делает ключевое слово virtual? 113. Для чего используют виртуальный деструктор? 114. Что такое глубокое копирование? 115. Что такое виртуальные функции и зачем они нужны? 116. Как защитить объект от копирования? 117. Что такое семантика перемещения?   STL / Algorithms   118. Из чего состоит STL? 119. Какие алгоритмы применяли с STL? В чем преимущество использования алгоритмов перед собственноручно написанными функциями? 120. Расскажите о контейнерах стандартной библиотеки vector, list, map, unordered_map. 121. Какие знаете типы итераторов? Чем они отличаются? В каких контейнерах используются? 122. Какая разница между std::set, std::map, std::unordered_multimap? 123. Что такое идиома remove-erase? 124. Как получить наименьшее значение типа? 125. Какая разница между std::map и std::hashmap? 126. Как подсчитать количество элементов в std::list? 127. Что такое сложность алгоритма и от чего она зависит? 128. В чем разница между vector и list и в каких случаях их лучше использовать?   Многопоточность   129. Что вам известно о многопоточности? 130. Что общего и различного в процессах и потоках? 131. Как синхронизировать передачи информации между потоками? 132. Какая разница между мьютексом и семафором? 133. Что такое deadlock? 134. Является ли С++ thread-safe? 135. Что такое race-condition? 136. Как избежать состояния гонки? 137. Что такое атомарная операция? 138. Как работать с std::mutex?   Networking   139. Что такое сокет? 140. Какие операции можно делать с сокетом? 141. Какая информация нужна, чтобы создать сокет? 142. Какие бывают модели сетей? 143. Расскажите об уровнях модели OSI. 144. Расскажите об уровнях модели TCP/IP. 145. Что такое IP-адрес? 146. Для чего используется маска подсети? 147. Какая разница между IPv4 и IPv6? 148. Сколько памяти необходимо для хранения IPv4? 149. Для чего нужен порт? 150. Сколько максимально может быть портов? 151. Какая разница между TCP и UDP? 152. Для чего такой ненадежный UDP-протокол?   OS/Linux   153. Что такое менеджер пакетов? 154. Какие бывают менеджеры пакетов? 155. Какие бывают дистрибутивы Linux? 156. Что такое PID? 157. Для чего используют файловые дескрипторы? 158. Расскажите о стандартных файловых дескрипторах процесса. 159. Что такое Pipe? 160. Что такое Named Pipe? 161. Что такое UID? 162. Расскажите о командах bash.   SCM / CI / CD   163. Какие есть виды SCM? 164. Для чего используют системы контроля версий? 165. Какие есть команды git? 166. Какие этапы во время комита изменений? 167. Разница между git fetch и git pull? 168. Какие есть этапы решения merge conflict?   Практические задания   169. Посчитайте количество единиц в произвольном числе. 170. Есть структура по типу «односвязный список». Напишите функцию, которая разворачивает список. То есть, первый элемент становится последним, а последний - первым. 171. Напишите реализацию функции int atoi (const char *str); преобразования строки в число. 172. Для структуры типа односвязный список напишите функцию вставки элемента. 173. Реализуйте класс vector. 174. Реализуйте бинарный поиск в массиве. 175. Реализуйте любую сортировку. 176. Реализуйте макрос для сравнения двух строк. 177. Реализуйте реверс строк. 178. Реализуйте перевода числа из строки в int. 179. Реализуйте подсчет слов в предложении. 180. Реализуйте подсчет чисел Фибоначчи. 181. Найдите такие элементы двух массивов, которые попадаются только в каждом из них. Желательно использовать STL. 182. Удалите из unordered_map элементы, которые делятся на 2 и выведите ключи этих элементов. 183. Напишите класс для логирования, который мог бы логировать к консоли или файлу. 184. Напишите функцию для определения, является ли определенный год високосным. 185. Напишите функцию для определения, является ли определенное слово палиндромом. 186. Напишите реализацию паттерна Singleton. 187. Напишите реализацию std::vector с операциями: push_back, push_front, pop_back, pop_front, size, clear. 188. Напишите рекурсивный поиск значения в дереве бинарного поиска. 189. Напишите функцию, которая проверяет, является ли дерево сбалансированным. 190. Напишить функцию для поиска уникального элемента в массиве.   Middle   Общее   1. Какие курсы прошли или книги прочитали за этот год? Чему научились? 2. Что нравится и не нравится в С++? Чего не хватает? 3. Что интересного нашли в новых стандартах С++17, С++20 (конкретные фичи)? 4. Расскажите о фичах, которые появились в разных версиях языка. 5. Расскажите о модели памяти, которая появилась в С++11 стандарте. 6. Что такое сериализация? Какие библиотеки знаете? 7. Какие знаете паттерны проектирования? 8. Что такое операционная система? Какие существуют типы по назначению? 9. Назвать основные составляющие и принципы работы ОС Linux в качестве примера системы общего назначения. 10. Что такое SFINAE и PIMPL? 11. Назовите порождающие, структурные и поведенческие паттерны программирования и приведите примеры их использования.   Препроцессор и компиляция   12. Расскажите о системах автоматизации билд-процесса. 13. Какая разница между статической и динамической библиотеками? 14. Какая разница между исполнительным файлом и динамической библиотекой? 15. Что такое DLL hell? 16. Что такое флажки компиляции (fPIC)? 17. В чем разница между дебаженной и релизной сборкой? 18. Что нужно для использования сторонней библиотеки? 19. Что такое internal linkage?   C   20. Что будет, если дважды вызвать free? 21. Как происходит вызов функции? 22. Как происходит передача параметров в функцию? 23. Как прорабатывается константа переменных? 24. Что означает ключевое слово inline? 25. Для чего используют выравнивания, можно ли его контролировать? 26. Расскажите о битовых полях. 27. Для чего нужен extern "C"? 28. Что будет, если в двух файлах сделать функцию с одинаковым именем и параметрами? На каком этапе возникнет ошибка? 29. Как экспортировать/импортировать функции из динамической библиотеки? 30. Какая разница между С-style приведением типов и C++ приведением?   C++   31. Что такое явное и неявное приведение типов в С++? Зачем делать explicit-конструктор? 32. Что такое Uniform initialization? Aggregate initialization? 33. Что такое Reference to temporary object? Как продлить время жизни временного объекта? 34. Что такое делегирующий конструктор? 35. Что такое список инициализации? 36. Какой порядок инициализации полей класса? Что случится, если конструктор инициализирует поля в другом порядке? 37. Что случится, если инициализировать поле другим полем? 38. Что такое copy elision? Сколько раз будет вызван конструктор/деструктор у объекта, которого возвращают по значению? 39. Что такое move-семантика? 40. В каких случаях не будет сгенерирован конструктор копирования? 41. Чем отличается конструктор копирования от оператора присваивания? 42. При каких условиях в конструкторе можно выбросить exception? 43. Что такое конструктор по умолчанию? Для чего нужны default и delete? 44. Чем отличается интерфейс от абстрактного класса? 45. Какие виды полиморфизма в С++? 46. Как реализовано наследование в большинстве компиляторов? 47. Множественное наследование: за и против? 48. Виртуальное наследование и порядок конструирования? 49. Зачем использовать override? 50. Какие есть правила вывода типа при использовании auto? В каких случаях auto может привести к нежелательному копированию объекта? 51. Расскажите обо всех возможных способах использования ключевого слова static в С++. Что такое static initialization order fiasco? 52. Что делает вызов throw; в блоке catch? 53. Чем отличается constexpr от const? 54. Что такое const correctness? 55. В каком случае можно использовать const_cast? 56. Что такое ключевое слово mutable и когда его нужно использовать? 57. Что такое ключевое слово friend и когда его нужно использовать? 58. Расскажите о лямбда-выражениях в С++ и доступ к переменным во внешней области видимости, захват this в лямбду и время жизни лямбды и захваченных переменных? 59. Что такое функтор? Напишите пример. 60. Что такое специализация шаблона? 61. Что такое dynamic_cast и run-time type identification? 62. Что такое exception? Как бросить и поймать? 63. Что будет, если бросить exception из конструктора? А из деструктора? 64. Что будет, если не поймать exception? 65. Что произойдет, если exception выйдет за пределы блока noexcept функции? 66. Для чего можно использовать приватное наследование? 67. Что такое контракт функции? 68. Что такое vptr и vtable? 69. Где содержится vptr? 70. Где содержится vtable? 71. Какая разница между overload and override? 72. Как компилятор различает члены класса и обычные переменные в функциях? 73. Зачем используют exceptions? 74. Что такое блоки try-throw-catch? 75. Расскажите о логике catch-блоков. 76. Что такое move constructor? 77. В чем разница между константным методом и неконстантным? 78. Что такое В-нотация и как определить сложность любого алгоритма? 79. Что такое таблица виртуальных методов? 80. Какие функции класса автоматически генерирует компилятор, если их не определить? 81. Что такое выравнивание данных? 82. Что такое exception? 83. Какие есть стандартные контейнеры и на основе каких структур они построены? 84. Что такое Undefined behavior? Приведите примеры. 85. Как определить, что в программе есть memory leak? 86. Для чего нужен std::make_shared? Чем он лучше создания std::shared_ptr через конструктор? 87. Что будет, если выделить один объем памяти, а записать больше? 88. Что такое переполнение stack?   Паттерны проектирования   89. Зачем нужны паттерны? Какие типы паттернов различают? 90. Недостатки паттерна Singleton? Когда он уместен? 91. Преимущества и недостатки PIMPL? 92. В чем разница между паттерн-фабрикой и фабричным методом? Когда использовать какой из них? 93. Что такое паттерн Observer? 94. Як контролировать состояние программы? Машину состояний? Паттерн состояние? 95. Что такое паттерн Visitor?   Метапрограммирование   96. Какие есть правила вывода типа в шаблоне? 97. Чем отличается using от typedef? 98. Сколько памяти занимает произвольная структура? Что такое выравнивание объекта? 99. Почему пустая структура занимает 1 байт? Какая минимальная единица адресации в С++?   OOP/OOD   100. Что такое SOLID? Что означает каждый из этих принципов? 101. Расскажите о паттернах проектирования. 102. Что такое Dependency Injection? Приведите пример. 103. Какие преимущества и недостатки функционального подхода? 104. Что такое принцип RAII? 105. Что такое принцип DRY? 106. Что такое принцип KISS? 107. Какие преимущества композиции перед наследованием?   STL / Algorithms   108. Какие алгоритмы с STL использовали? Каких не хватает? 109. Какими особенностями должен обладать класс, чтобы он был итератором? 110. Какие бывают итераторы? 111. Расскажите об инвалидации итераторов. 112. Как оптимизировать удаление элемента со средины вектора? 113. Как реализован vector? 114. Как реализован list? 115. Как расширить STL-контейнеры? 116. Какие есть алгоритмы в STL? 117. В чем разница между vector, deque, list, set e STL? 118. Когда надо использовать map? Когда - unordered_map? Какая сложность поиска и вставки в этих контейнерах? 119. Как проверить, есть ли в контейнере элементы? Почему вызов container.size() является плохой практикой? 120. Что такое exception safety guarantee? Какую exception safety guarantee имеют STL-контейнеры? 121. Расскажите о типах умных указателей и о подсчете ссылок в них.   Многопоточность   122. Является ли С++ thread-safe? 123. В чем разница между многопоточностью и асинхронностью? 124. Что такое многопоточность? Какую функциональность предоставляет С++ для разработки многопоточных приложений? Какие основные проблемы многопоточных приложений? 125. Как передать информацию между несколькими процессами? 126. Как синхронизировать между собой несколько процессов? 127. Какие есть особенности работы с shared memory? 128. Как работает spinlock? 129. Какие вы знаете особенности использования recursive mutex? 130. Расскажите о read-write mutex. 131. Что такое race-condition? Взаимная блокировка? Что такое критическая секция? 132. Как избежать состояния гонки? 133. Чем отличается мьютекс от семафора? 134. Какие примитивы синхронизации реализованы в C++? Преимущества lock_guard? 135. Что случится, если exception выйдет за пределы потока? Какие инструменты есть для безопасной асинхронности в С++? 136. Чем отличается std::launch::async от std::launch::deferred? 137. Что такое атомарная операция? std::atomic? 138. Как работать с std::conditional_variable? 139. Как создать поток с помощью std::thread? 140. На сколько потоков лучше разбить задачу? От чего это зависит? 141. Как работать с std::async? 142. Thread-safe гарантии контейнеров в С++? В чем недостаток интерфейса front() + pop_front()?   Networking   143. Что такое TCP handshake? 144. Какая разница между TCP и UDP? 145. Расскажите о протоколах верхнего уровня. 146. Какая разница между HTTP и HTTPS? 147. Расскажите об SSL/TLS handshake.   SCM / CI / CD   148. Расскажите о процессах CI. 149. Как отредактировать комит? 150. Расскажите об интерактивном rebase. 151. Какие могут быть способы дебаггинга кода? 152. Для чего нужны Unit test? Чем отличается от Functional Test? 153. Как тестировать код? Какой используете фреймворк? 154. Какие библиотеки знаете для написания тестов? 155. Что такое mock? 156. Сколько тестов нужно написать на одну функцию? 157. Что такое побочный эффект, идемпотентность и чистые функции? 158. Что такое контейнеризация и в чем преимущества и недостатки? Что такое Docker или иной инструмент контейнеризации? 159. Что такое CI/CD и какие преимущества приносит для разработчика? 160. Какие принципы итеративных методологий? 161. Какие преимущества и недостатки code-convention?   Практические задания   162. Напишите максимально корректную реализацию класса string с конструктором копирования и оператором присваивания. 163. Напишите реализацию очереди. 164. Реализуйте функцию, которая за один проход найдет уникальный элемент в контейнере. 165. Напишите thread-safe пул потоков. 166. Напишите игру жизни в ООП стиле. 167. Напишите класс, который достает из базы список товаров по фильтру и показывает на консоли. Напишите тесты для него. 168. Любая задача на написание кода, чтобы проверить умение проектировать интерфейсы и придерживаться принципов SOLID, DRY, KISS. 169. Напишите свою реализацию std::atomic. 170. Напишите программу для анализа графов: нахождение циклов, deadlock-состояний, циклов, недоступных состояний. 171. Напишите программу, которая бы проверяла, что в системе запущен только один ее экземпляр. Решение должно быть cross-platform. 172. Проанализируйте C++ код с точки зрения качества: выявить потенциальные memory leak, нерациональное использование STL-контейнеров, алгоритмов, неоптимальные конструкции и тому подобное. 173. Напишите код для решения судоку. 174. Напишите код, который найдет зацикливание в односвязном списке.   Senior   Общее   1. Как вы понимаете SOLID? 2. Как разработать систему плагинов на С++? 3. Что такое RPC? Какие библиотеки знаете? 4. На что обращать внимание при проведении code review? 5. Какие есть проблемы при написании кроссплатформенного кода? На что обращать внимание? 6. Что делать, если код работает медленно? 7. Какие есть способы и методологии измерения быстродействия кода? Как можно устранить/уменьшить влияние замеров на быстродействие? 8. Что такое SFINAE? Для чего используется? 9. Что такое метапрограммирование? С помощью чего реализуется на С++? 10. Как использовать variadic templates? 11. Как тестировать закрытые методы? 12. Как считать покрытие тестами? Нужно ли это делать? 13. Что такое cache miss и как это выявить? 14. Что такое SIMD-инструкции? Какие необходимые условия и способы их использования? 15. Что такое покрытие кода и как обеспечивается? 16. Опишите принципы lock-free структур данных и свой опыт работы с ними.   Препроцессор и компиляция   17. Расскажите о построении билд-системы. 18. Как работать с билд-системами: Make, CMake. 19. Как интегрировать third-party в проект? 20. Что такое барьеры памяти? 21. Расскажите о работе с сырыми указателями и о ручном управлении памятью. 22. Что такое статический анализатор кода? Какие знаете? 23. Что такое динамический анализатор кода? Какие знаете? 24. Проект медленно собирается. Как можно ускорить?   C/C++   25. Расскажите об использовании realloc в контейнерах. 26. Как работают шаблоны? 27. Расскажите о специализации шаблонов. 28. Как работает RTTI? 29. Можно ли использовать exception в конструкторе/деструкторе? 30. Что такое rvalue и lvalue? 31. В чем особенности контейнеров std::set, std::map, std::unordered_map, std::hash? 32. Что такое placement new? Для чего используют? Как сделать placement delete? 33. Как размещается в памяти класс со множественным наследованием и виртуальными функциями? 34. Как работают точки остановки? 35. Что такое уязвимости? Каков механизм их работы? 36. Как написать собственный std::shared_ptr? 37. Что такое curiously recurring template pattern? 38. Опишите назначение и принцип работы std::shared_ptr, std::unique_ptr и std::weak_ptr. 39. Какое назначение и отличия использования std::variant и std::any? 40. Какие улучшения получил std::search в С++17 ? 41. Что такое copy elision и когда он становится возможным? Какие особенности для разных стандартов? 42. Что такое Return Value Optimization?   OOP/OOD   43. Объясните принципы SOLID. 44. Объясните принципы KISS. 45. Объясните принципы YAGNI. 46. Какие есть подходы к оптимизации кода? 47. На что стоит обращать внимание при code review? 48. Какие есть паттерны проектирования? Почему не советуют использовать Singleton? 49. Что такое статический полиморфизм?   STL / Algorithms   50. Когда std::vector может использовать std::move? 51. Расскажите о своем любимом алгоритме поиска. 52. Что такое lock-free и wait-free алгоритмы? В чем их отличия и способы реализации? 53. Опишите назначение execution policy для параллельных алгоритмов.   Многопоточность   54. Расскажите о построении API, рассчитанных на многопоточное использование. 55. В чем разница между kernel-level и user-level потоками? 56. Что такое coroutine? 57. Что делает спецификатор thread_local? 58. Как реализовать синхронизацию в задаче producer-consumer? 59. Як синхронизироваться между различными процессами?   SCM / CI / CD   60. Расскажите о настройке процесса менеджмента ветвей репозитория. 61. Расскажите о стратегии разветвления (branching).   Практические задания   62. Напишите базовую реализацию std::shared_ptr. 63. Реализуйте алгоритм сортировки. 64. Реализуйте алгоритм хеширования. 65. Реализуйте shared_ptr с расширением для weak_ptr. 66. Реализуйте простейший producer-consumer, используя условные переменные. 67. Опишите как можно подробнее, что происходит в системе, когда приложение делает сетевой запрос. 68. Детально описать дизайн программного компонента, например, системы голосования; учесть при этом высокую нагрузку и сделать ее расширяемой и отказоустойчивой.   Выражаем благодарность за участие в статье Александру Жакуну, Ярославу Пушко, Назару Семенишину, Сергею Подоброму, Владимиру Кочуну, Владимиру Новикову, Сергею Кривоносу, Марку Цирульнику, Кириллу Пшеничному, Виктору Шуму, Сергею Братусю.    
ТОП 20 тестових завдань на інтерв'ю для Java розробника

Автор: Армен Маїлян

Напишіть програму на Java для перевертання рядка, змінивши розташування символів у рядку задом наперед без використання вбудованих в String функцій Напишіть програму на Java для перевороту послідовності символів у рядку без використання вбудованої в String функції reverse() Напишіть програму на Java для того, щоб поміняти місцями значення, що зберігаються у двох змінних за допомогою третьої змінної Напишіть програму на Java, щоб поміняти місцями значення, що зберігаються у двох змінних, без використання третьої змінної Напишіть програму Java для підрахунку кількості конкретних слів у рядку, використовуючи HashMap Напишіть Java-програму для ітерації об'єкта типу HashMap з використанням циклу while та покращеного циклу for Напишіть програму на Java, щоб дізнатися, чи є число простим, чи ні Напишіть Java-програму, щоб визначити, чи є рядок або число паліндромом, чи ні Написати програму на Java для обчислення серії чисел Фібоначчі Напишіть Java-програму для обходу ArrayList з використанням циклу for, while та покращеного циклу for Напишіть програму на Java, щоб продемонструвати явну перевірку умов очікування Напишіть Java-програму для демонстрації прокручування вгору / вниз Напишіть програму на Java, щоб відкрити усі посилання на gmail.com Напишіть код для Selenium, щоб перейти до попередньої вкладки Напишіть програму на Java, щоб знайти повторювані символи в рядку Напишіть Java-програму, щоб знайти друге за величиною число в масиві Напишіть Java-програму для перевірки, чи є введене число числом Армстронга Напишіть Java-програму для видалення всіх пробілів з рядка за допомогою replace() Напишіть Java-програму для видалення всіх пробілів з рядка без використання replace() Напишіть Java-програму для читання даних із таблиці Excel У цій статті ми наведемо досить багато прикладів програм з тих, що просять написати претендентів під час проходження інтерв'ю на вакансію Java розробника. Вказані тестові завдання ми наводимо з реальними прикладами коду, заданими в інтерв'ю як початківцям, так і досвідченим кандидатам. Сьогодні серед інтерв'юерів стало звичайною практикою давати тестові практичні завдання під час інтерв'ю, не фокусуючись лише на теоретичних питаннях. Такі завдання зазвичай задають на технічному етапі інтерв'ю Java розробника. Для того, щоб допомогти претендентам на відповідні вакансії пройти такі інтерв'ю, ми хочемо перерахувати кілька дуже важливих прикладів програм на Java разом з належним описом кожного. Крім того, ми також додаємо відповідні пояснення коду. Ці пояснення дадуть вам чітке уявлення, як працює кожна програма.   Найпопулярніші питання інтерв’ю Java-програмування. Q # 1) Напишіть програму на Java для перевертання рядка, змінивши розташування символів у рядку задом наперед без використання вбудованих в String функцій.   Відповідь: Для початку ініціалізуємо рядкову змінну st і використовуємо клас StringBuilder. Об'єкт класу StringBuilder strB буде надалі використовуватися для додавання значення, що зберігається в рядковій змінній st. Після цього ми використовуємо вбудовану в StringBuilder функцію reverse() і зберігаємо нову – обернений рядок в stB. Нарешті ми виводимо на екран stB. public class FirstTask{             public static void main(String[] args) {                         // ITVDN.com 1 із ТОП 20 тестових завдань на інтерв’ю для Java розробника                         String st = "Задача1";                         StringBuilder stB = new StringBuilder();                         stB.append(st);                         stB = stB.reverse();     // використовуємо StringBuilder для перевороту рядку                         System.out.println(stB);             } } На екрані отримаємо: 1ачадаЗ   Q # 2) Напишіть програму на Java для перевороту послідовності символів у рядку без використання вбудованої в String функції reverse().   Відповідь Спосіб 1: Є кілька способів, за допомогою яких ви можете перевернути ваш рядок, якщо вам дозволено використовувати інші вбудовані функції рядка. У цьому способі ми ініціалізуємо рядкову змінну з ім'ям st значенням заданого рядка. Потім ми конвертуємо цей рядок у масив символів за допомогою функції toCharArray(). Після цього ми використовуємо цикл for, щоб взяти всі символи у зворотному порядку і вивести їх так на екран по черзі. public class SecondTask {             public static void main(String[] args) {            //ITVDN.com 2 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String st = "Вчимося програмувати";                char symbols[] = st.toCharArray();  // конвертуємо рядок у масив символів, потім виводимо символи на екран у зворотному порядку            for(int x= symbols.length-1; x>=0; x--) {                         System.out.print(symbols [x]);            }       } } На екрані отримаємо: итавумаргорп ясомичВ Спосіб 2: Це ще один спосіб виконати завдання з переворотом послідовності символів у рядку. У цьому способі ви оголошуєте рядкову змінну st, а потім використовуєте клас Scanner, оголошуючи об'єкт scannerQ для роботи зі стандартним потоком введення даних. У цьому випадку програма набуде рядкового значення через командний рядок (при його виконанні). Далі ми використовували метод nextLine(), який прочитав наш рядок під час введення його через консоль з пробілами між словами рядка. Після цього ми використовували метод split() для поділу рядка на його підрядки (тут не вказується роздільник). Потім ми виводимо рядок у зворотному порядку, використовуючи цикл for. import java.util.Scanner; public class SecondTask {             public static void main(String[] args) {            // ITVDN.com 2 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String st;            Scanner scannerQ = new Scanner(System.in);            System.out.println("Введіть ваш рядок:");            st = scannerQ.nextLine();            String[] temp = st.split("");       //використовуємо метод split для виведення рядку в зворотньому порядку            for(int x= temp.length-1; x>=0; x--)            {                         System.out.print(temp [x] + "");            }                     } } На екрані отримаємо: Введіть ваш рядок: asfasdf aasdfasdfadsf fsdafdsafdsaa fdsafsa Спосіб 3: Це спосіб майже такий, як спосіб 2, але тут ми не використовуємо метод split(). Ми використовуємо клас Scanner та метод nextLine() для читання вхідного рядка. Потім ми оголосили цілочисельну змінну stringLength, присвоюючи їй значення довжини вхідного рядка. Після цього ми вивели рядок у зворотному порядку, використовуючи цикл for. Однак ми використовували метод charAt(index), який повертатиме символ за конкретним індексом. Після кожної ітерації символ буде додано до нового рядка для отримання перевернутого значення рядкової змінної. Потім ми виводимо змінну перевернутого рядка. import java.util.Scanner; public class SecondTask {             public static void main(String[] args) {            // ITVDN.com 2 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String mainString, reverseString = "";            System.out.println("Введіть рядок, щоб отримати перевернутий:");            Scanner scannerQ = new Scanner(System.in);            mainString = scannerQ.nextLine();            int stringLength = mainString.length();            for(int x= stringLength -1; x>=0; x--) {                        reverseString = reverseString + mainString.charAt(x);   //використовуємо вбудований метод charAt(), щоб перевернути рядок            }            System.out.println(reverseString);             } } На екрані отримаємо: Введіть рядок, щоб отримати перевернутий: Введений рядок кодяр йинедевВ   Q # 3) Напишіть програму на Java для того, щоб поміняти місцями значення, що зберігаються у двох змінних за допомогою третьої змінної   Відповідь: У цьому прикладі ми створюємо об'єкт класу Scanner для роботи зі стандартним потоком даних System.in. Ця програма прийматиме значення a та b через командний рядок. Ми використали nextInt(), який буде поміщати введені користувачем значення цілочисельних змінних в a і b. Також оголошуємо тимчасову змінну. Тепер логіка програми виглядає наступним чином: ми створюємо тимчасову або третю змінну з ім'ям temp, присвоюємо їй значення, що зберігається в змінній a, а потім присвоюємо значення b, і знову присвоюємо b значення temp. Таким чином, після виконання всіх операцій temp буде зберігати в собі значення a, a отримає значення b, а b матиме значення temp (яке дорівнює a).   import java.util.Scanner; public class ThirdTask {             public static void main(String[] args) {            // ITVDN.com 3 з ТОП 20 тестових задач на інтерв’ю для Java розробника            int a, b, temp;            System.out.println("Введіть значення a та b");            Scanner scannerQ = new Scanner(System.in);            a = scannerQ.nextInt();            b = scannerQ.nextInt();            System.out.println("До обміну значеннями " + a + b);            temp = a;            a = b;            b = temp;            System.out.println("Після обміну значеннями " + a + b);                          } }   На екрані отримаємо: Введіть значення a і b 23 45 До обміну значеннями 2345 Після обміну значеннями 4523   Q # 4) Напишіть програму на Java, щоб змінити місцями значення, що зберігаються у двох змінних, без використання третьої змінної.   Відповідь: Спочатку все буде так само, як і в наведеному вище прикладі. Лише подальша логіка зміниться. Тут ми спочатку присвоюємо змінній a значення a + b, что означає, що a буде тепер мати в собі значення як a, так і b. Потім ми присвоюємо змінній b значення a - b, що означає, що ми віднімаємо значення b із суми (a + b). Досі a все ще зберігає у собі суму початкових a і b. Але b має тепер значення первісного a. Нарешті, на третьому кроці ми присвоюємо a значення a - b, що означає, що ми віднімаємо значення змінної b (яка зараз вже має в собі значення a) із суми (a + b). В результаті цих дій ми змінили місцями значення, які зберігаються у змінних.   import java.util.Scanner; public class FourthTask {    public static void main(String args[])    {             int a, b;             System.out.println("Введіть потрібні значення a та b");             Scanner scannerQ = new Scanner(System.in);             a = scannerQ.nextInt();             b = scannerQ.nextInt();             System.out.println("До обміну значеннями\na = "+a+"\nb = "+b);             a = a + b;             b = a - b;             a = a - b;             System.out.println("Після обміну значеннями без проміжної змінної\na = "+a+"\nb = "+b);    } }   На екрані отримаємо: Введіть потрібні значення a та b 23 45 До обміну значеннями a = 23 b = 45 Після обміну значеннями без проміжної змінної a = 45 b = 23   Q # 5) Напишіть програму Java для підрахунку кількості конкретних слів у рядку, використовуючи HashMap.   Відповідь: Ця програма працює з класом-колекцією, в якій ми використовували HashMap для зберігання рядка. Насамперед, ми оголосили нашу рядкову змінну з іменем st. Потім ми використовували функцію split() з одиночним пробілом, щоб можна було розбити рядок на масив з декількох слів. Після цього ми створили екземпляр HashMap та цикл for. Всередині циклу for ми використовуємо оператор if else. Ми заходимо до кожного елементу масиву split та додаємо елементи цього масиву. Слова ми додаємо як ключі екземпляру HashMap. У якості значень HashMap ми будемо додавати те число, скільки разів при обході масиву слів нам це слово зустрілося. Якщо в наш екземпляр HashMap ми вже додали дане слово – при обході ми збільшимо значення, записане в HashMap відповідно до даного слова-ключа. Щоразу, коли слово буде зустрічатися повторно (ми бачимо, що слово в екземпляр HashMap ми вже додавали) – значення-лічильник збільшується на 1. Якщо таке слово раніше не зустрічалося – значення-лічильник встановлюється на 1. Зрештою, ми виводимо на екран HashMap. Зверніть увагу: ту ж програму можна використовувати і для підрахунку кількості символів у рядку. Все, що вам потрібно зробити, це видалити один пробіл (видалити пробіл, вказаний в методі split) і прописати String [] words = st.split (“”); import java.util.HashMap; public class FifthTask{             public static void main(String[] args) {            // ITVDN.com 5 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            String st = "Current task posted for Java developers developers";            String[] words = st.split(" ");            HashMap<String,Integer> keyValue = new HashMap<String,Integer>();            for (int i=0; i<= words.length-1; i++) {                         if (keyValue.containsKey(words[i])) {                                     int counter = keyValue.get(words[i]);                                     keyValue.put(words[i], counter+1);                         }                         else {                                     keyValue.put(words[i], 1);                         }            }            System.out.println(keyValue);             } } На екрані отримаємо: {Java=1, task=1, developers=2, for=1, Current=1, posted=1}   Q # 6) Напишіть Java-програму для ітерації об'єкта типу HashMap з використанням циклу while та покращеного циклу for.   Відповідь: Тут ми спочатку вставили три елементи в змінну типу HashMap з ім'ям keyValue, використовуючи функцію put(). Розмір змінної keyValue можна одержати за допомогою методу size(). Після цього ми використовували цикл While для обходу keyValue, яка містить по одній парі ключ-значення для кожного елемента. Ключі та значення можуть бути отримані за допомогою методів getKey() та getValue(). Аналогічно ми використовуємо розширений цикл for, на елементах «qurentMe2» у HashMap. import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SixthTask{             public static void main(String[] args) {            // ITVDN.com ТОП 20 тестових завдань на інтерв’ю для Java розробника            HashMap<Integer,String> keyValue = new HashMap<Integer,String>();            keyValue.put(1, "Hello");            keyValue.put(2, "World");            keyValue.put(3, "Have a nice day!");            System.out.println(keyValue.size());            System.out.println("Цикл While:");            Iterator iter = keyValue.entrySet().iterator();            while(iter.hasNext()) {                         Map.Entry qurentMe = (Map.Entry) iter.next();                         System.out.println("Ключ это " + qurentMe.getKey() + " Значення це " + qurentMe.getValue());            }            System.out.println("Цикл For:");            for(Map.Entry qurentMe2: keyValue.entrySet()) {                         System.out.println("Ключ це: " + qurentMe2.getKey() + " Значення це: " + qurentMe2.getValue());            }             } } На екрані отримаємо: 3 Цикл While: Ключ це 1 Значення це Hello Ключ це 2 Значення це World Ключ це 3 Значення це Have a nice day! Цикл For: Ключ це: 1 Значення це: Hello Ключ це: 2 Значення це: World Ключ це: 3 Значення це: Have a nice day!    Q # 7) Напишіть програму на Java, щоб дізнатися, чи є число простим, чи ні.   Відповідь: Ми оголосили дві цілочисельні змінні temp та number і використали клас Scanner з nextInt (оскільки у нас може бути на розгляді тільки ціле число). Оголошуємо логічну змінну numberIsPrime і встановлюємо її значення – true. Після цього ми використовуємо цикл for зі значенням змінної ітератора, що починається з 2. Кількість ітерацій, необхідне нам, дорівнюватиме половині введеного числа. Лічильник ітерацій збільшується на 1 після кожної ітерації. У змінну tempNumber ми поміщуватимемо залишок від поділу значення введеного числа на значення лічильника. Якщо залишок від поділу в одній з ітерацій дорівнюватиме 0, тоді numberIsPrime буде встановлений у false, введене число не буде простим, і ми виходимо з циклу. Якщо у всіх ітераціях ми отримуватимемо в temp деякі залишки від розподілу, відмінні від нуля – число буде простим. Ґрунтуючись на значенні numberIsPrime, ми приходимо до висновку, чи є наше число простим, чи ні. import java.util.Scanner; public class SeventhTask {             public static void main(String[] args) {            // ITVDN.com ТОП 20 тестових завдань на інтерв’ю для Java розробника            int temp, number;            boolean numberIsPrime = true;            Scanner scannerQ = new Scanner(System.in);            number = scannerQ.nextInt();            scannerQ.close();            for (int x = 2; x<= number /2; x++) {                         tempNumber = number %x;                                     if (tempNumber == 0) {                                     numberIsPrime = false;                                     break;                         }            }            if(numberIsPrime)                         System.out.println(number + " число є простим");                         else                                     System.out.println(number + " число не є простим");                      } } На екрані отримаємо: 27 27 число не є простим   Q # 8) Напишіть Java-програму, щоб визначити, чи є рядок або число паліндромом, чи ні.   Відповідь: Щоб перевірити, чи є число або рядок паліндромом, чи ні, ви можете використовувати будь-яку програму, що перевертає рядки, з описаних вище. Що вам потрібно зробити, то це додати один оператор if-else. Якщо вихідний рядок дорівнює перевернутому рядку, то число є паліндромом, інакше – ні. import java.util.Scanner; public class EighthTask{             public static void main (String[] args) {            // ITVDN.com ТОП 20 тестових завдань на інтерв’ю для Java розробника            String inputString, reversedString = "";            Scanner scannerQ = new Scanner(System.in);            int stringLength;            System.out.println("Введіть число або рядок");             inputString = scannerQ.nextLine();            stringLength = inputString.length();            for (int x = stringLength -1; x>=0; x--) {                         reversedString = reversedString + inputString.charAt(x);            }            System.out.println("перевернутое значение: " + reversedString);                         if(inputString.equals(reversedString))                         System.out.println("Введене значення є паліндромом");            else                         System.out.println("Введене значення не є паліндромом");                          } } На екрані отримаємо: Для рядка- Введіть число або рядок dfggg перевернуте значення: gggfd Введене значення не є паліндромом Для числа- Введіть число або рядок 777 перевернуте значення: 777 Введене значення є паліндромом   Q # 9) Написати програму Java для обчислення серії чисел Фібоначчі.   Відповідь: Ряд Фібоначчі - це така серія чисел, де після перших двох чисел кожне число, яке зустрічається, є сумою двох попередніх чисел. Приклад: 0,1,1,2,3,5,8,13,21 ……… У цій програмі ми знову використали клас Scanner з nextInt (описувалося вище). Спочатку ми вводимо (через командний рядок) деяке число, яку кількість чисел Фібоначчі ми повинні отримати. Ми оголосили цілочисленні змінні number, x, y та z, ініціалізували x та y нулем, а z – одиницею. Потім ми використовували цикл for для ітерації. Процес рішення в циклі виглядає так – ми присвоюємо x значення, рівне y (яке в першій ітерації дорівнює 0), потім y присвоюємо значення змінної z (рівне у першій ітерації 1). Потім змінної z привласнюємо значення, що дорівнює сумі значень x та y. import java.util.Scanner; public class NinthTask{             public static void main(String[] args) {            // ITVDN.com 9 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            int number, x = 0, y=0, z =1;            Scanner scannerQ = new Scanner(System.in);            System.out.println("Введіть кількість значень");            number = scannerQ.nextInt();            System.out.println("Серія чисел Фібоначчі: ");            for (int i=0; i<= number; i++) {                         x = y;                         y = z;                         z = x+y;                         System.out.println(x + "");       // якщо ви хочете вивести в поточному рядку – використовуйте print()            }                          } } На екрані отримаємо: Введіть кількість значень 10 Серія чисел Фібоначчі: 0 1 1 2 3 5 8 13 21 34 55   Q # 10) Напишіть Java-програму для обходу ArrayList з використанням циклу for, while та покращеного циклу for.   Відповідь: У цій програмі ми додали три елементи до ArrayList і вивели його розмір. Потім ми використовуємо цикл While з ітератором. Щоразу, коли ітератор отримує наступний елемент, він буде відображати цей елемент, доки ми не досягнемо кінця списку. У нашому випадку це повторюватиметься тричі. Аналогічно ми зробили для покращеного циклу for, де ми створили об'єкт o для ArrayList з ім'ям testList. Потім вивели на екран значення об'єкта. Після цього ми створили цикл for, де ітератор i встановлено спочатку на індекс 0, а потім збільшується на 1 при кожній ітерації, поки не буде досягнута межа ArrayList. Нарешті, ми виводимо на екран кожен елемент, використовуючи метод get(index) для кожної ітерації циклу for. import java.util.*; public class arrayList {             public static void main(String[] args) {            // ITVDN.com 10 з ТОП 20 тестових завдань на інтерв’ю для Java розробника            ArrayList testList = new ArrayList();            testList.add("50");            testList.add("60");            testList.add("70");            System.out.println(testList.size());            System.out.println("Цикл While:");            Iterator iter = testList.iterator();            while(iter.hasNext()) {                         System.out.println(iter.next());            }            System.out.println("Покращений цикл For:");            for(Object o : testList) {                         System.out.println(o);             }            System.out.println("Цикл For:");            for(int i=0; i< testList.size(); i++) {                         System.out.println(testList.get(i));            } } } На екрані отримаємо: 3 Цикл While: 50 60 70 Покращений цикл For: 50 60 70 Цикл For: 50 60 70   Q # 11) Напишіть програму Java, щоб продемонструвати явну перевірку умов очікування.   Відповідь: У Selenium є два основні типи очікування – неявне (Implicit Wait) і явне (Explicit Wait). (Ми не розглядаємо явне (вільне) очікування у цьому прикладі). Неявне очікування – оголошується один раз у коді поза операцією пошуку та діє до зміни. Це очікування виконується незалежно від будь-якої умови і застосовується до всіх наступних операцій пошуку неявно. У наведеній нижче програмі ви можете бачити застосування такого очікування для Google Chrome. Ми використовували кілька вбудованих методів для встановлення властивості, максимізації вікна, навігації по URL та пошуку веб-елементів. WebDriverWait waitWD = new WebDriverWait(curentDriver, 20); WebElement secondElement = waitWD.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Тестування програмного забезпечення - Вікіпедія"))); secondElement.click(); У наведеному вище фрагменті коду можна побачити, що ми створили об'єкт waitWD для WebDriverWait, а потім ми здійснили пошук WebElement з ім'ям secondElement. Умову встановлено таким чином, що веб-драйверу доведеться чекати, поки ми не побачимо посилання «Тестування програмного забезпечення – Вікіпедія» на веб-сторінці. Команда не виконається, якщо не знайде це посилання. Якщо посилання буде знайдено, веб-драйвер виконає клацання мишею за цим посиланням. package Codes; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class EleventhTask{             public static void main(String[] args) {                         // ITVDN.com 11 з ТОП 20 тестових завдань на інтерв’ю для Java розробника                         System.setProperty("webdriver.chrome.driver", "C:\\driver\\chromedriver.exe");                         ChromeOptions cOptions = new ChromeOptions();                         cOptions.addArguments("--disable-arguments");                         WebDriver curentDriver = new ChromeDriver();                         curentDriver.manage().window().maximize();                         curentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);                         curentDriver.navigate().to("https://www.google.com.ua");                         WebElement curentElement = curentDriver.findElement(By.name("q"));                         curentElement.sendKeys("Testing");                         curentElement.submit();                         WebDriverWait waitWD = new WebDriverWait(curentDriver, 20);                      WebElement secondElement = waitWD.until(ExpectedConditions.visibilityOfElementLocated(By.partialLinkText("Тестування програмного забезпечення – Вікіпедія"))); secondElement.click(); } }   Q # 12) Напишіть програму на Java для демонстрації прокручування вгору/вниз.   Відповідь: Усі рядки кодів легко співвідносяться з кодом попереднього прикладу. У код цієї програми ми включили JavascriptExecutor jscript, який виконуватиме прокручування. На останньому рядку коду ми передаємо window.scrollBy(argument1, argument2). Якщо нам потрібно виконати прокручування вгору, тоді передаємо деяке значення в argument1, якщо нам потрібно прокрутити вниз – передаємо деяке значення в argument2.   package Codes; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebElement; public class TwelfthTask{             public static void main(String[] args) {                         // ITVDN.com 12 з ТОП 20 тестових завдань на інтерв’ю для Java розробника                         System.setProperty("webdriver.chrome.driver", "C:\\driver\\chromedriver.exe");                         WebDriver qurentDriver = new ChromeDriver();                         JavascriptExecutor jscript = (JavascriptExecutor) qurentDriver;                         qurentDriver.manage().window().maximize();                         qurentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);                         qurentDriver.get("https://www.google.com.ua");                         WebElement qurentElement = qurentDriver.findElement(By.name("q"));                         qurentElement.sendKeys("SoftwareTestingHelp");                         qurentElement.sendKeys(Keys.ENTER);                         jscript.executeScript("window.scrollBy(0,900)"); } }   Q # 13) Напишіть програму на Java, щоб відкрити всі посилання на gmail.com.   Відповідь: Це типовий приклад застосування покращеного циклу for, який ми бачили у наших попередніх прикладах. Після того, як ви відкрили веб-сайт, такий як Gmail, використовуючи get() або navigate().to(), ви можете використовувати локатор tagName, щоб отримати всі посилання на веб-сайті, які мають однакові теги. У нас є покращений цикл for, в якому ми обходимо всі знайдені посилання за нашим тегом. Для кожного посилання типу WebElement у нашому листі посилань ми отримуємо самі посилання через getAttribute(«href») і тексти через getText(). package Codes; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class ThirteenthTask{             public static void main(String[] args) {             // ITVDN.com 13 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             System.setProperty("webdriver.chrome.drive", "C:\\driver\\chromedriver.exe");             WebDriver curentDriver = new ChromeDriver();             curentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);             curentDriver.manage().window().maximize();             curentDriver.get("https://www.gmail.com/");             java.util.List<WebElement> linkList = curentDriver.findElements(By.tagName("a"));             System.out.println(linkList.size());             for (WebElement thisLink: linkList) {             //виводимо на екран посилання http://google.com або https://www.gmail.com             System.out.println(qurentLink.getAttribute("href"));             //виводимо на екран текст посилання             System.out.println(qurentLink.getText()); } } } На екрані отримаємо: Starting ChromeDriver 2.38.551601 (edb21f07fc70e9027c746edd3201443e011a61ed) on port 16163 Only local connections are allowed. 3 https://support.google.com/accounts?hl=ru Довідка https://policies.google.com/privacy?gl=IN&hl=ru Політика конфіденційності https://policies.google.com/terms?gl=IN&hl=ru Умови використання   Q # 14) Напишіть код для Selenium, щоб перейти на попередню вкладку.   Відповідь: Ми використовуємо клас Robot. Цей приклад досить важливий, тому що, якщо ви знаєте поєднання клавіш, ви можете використовувати різну навігацію в браузері та його вкладках. Наприклад, якщо у вас у Chrome відкрито три вкладки, і ви хочете перейти на середню вкладку, то вам потрібно натиснути + 2 на клавіатурі. Те саме можна досягти за допомогою коду. Використовуйте наступний код (відразу після того, як ми побачимо створення екземпляру класу Robot). Ми використовували об'єкт qurentRobot класу Robot, з двома вбудованими методами keyPress(KeyEvent.VK_*) та keyRelease(KeyEvent.VK_*). package Codes; import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class FourteenthTask{             public static void main(String[] args) throws AWTException {            // ITVDN.com 14 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             System.setProperty("webdriver.chrome.driver", "C:\\driver\\chromedriver.exe");             WebDriver curentDriver = new ChromeDriver();             curentDriver.manage().window().maximize();             curentDriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);             curentDriver.get("https://www.google.com");             WebElement firstElement = curentDriver.findElement(By.name("q"));             firstElement.sendKeys("software testing help");             firstElement.sendKeys(Keys.ENTER);             String str = Keys.chord(Keys.CONTROL,Keys.RETURN);              curentDriver.findElement(By.partialLinkText("Software Testing Help - A Must Visit Software Testing Portal")).sendKeys(str);             Robot qurentRobot = new Robot(); // Ініціалізуємо екземпляр класу Robot              qurentRobot.keyPress(KeyEvent.VK_CONTROL); // застосовуючи клас Robot ви легко можете отримати необхідний результат, якщо ви знаєте потрібні комбінації кнопок             qurentRobot.keyPress(KeyEvent.VK_2); // тут ми натискаємо ctrl+2              qurentRobot.keyRelease(KeyEvent.VK_CONTROL); // як тільки ми натиснемо та відпустимо ctrl+2, ми перейдемо на другу вкладку.             qurentRobot.keyRelease(KeyEvent.VK_2); //якщо ви хочете знову повернутися до першої вкладки, натисніть і відпустіть vk_1             } }   Q # 15) Напишіть програму на Java, щоб знайти повторювані символи в рядку.   Відповідь: У цій програмі ми створюємо рядкову змінну st та ініціалізуємо цілочисельний лічильник, починаючи з нуля. Потім ми створили масив символів для перетворення нашої рядкової змінної на цей масив. За допомогою двох циклів for ми проводимо порівняння символів із різними індексами. Якщо два символи послідовного індексу збігаються, цей символ буде виведений на екран і лічильник кількості символів, що збігаються, збільшиться на 1.  public class FifteenTask{             public static void main(String[] args) {                         // ITVDN.com 15 з ТОП 20 тестових завдань на інтерв’ю для Java розробника                         String st = new String("Hello");                         int counter = 0;                         char[] charsArray = st.toCharArray();                         System.out.println("Повторювані символи тут:");                         for (int i=0; i<st.length();i++) {                                     for(int j=i+1; j<st.length();j++) {                                                 if (charsArray [i] == charsArray [j]) {                                                            System.out.println(charsArray [j]);                                                            counter ++;                                                      break;                                                }                                     }                         }             } } На екрані отримаємо: Повторювані символи тут: l   Q # 16) Напишіть Java-програму, щоб знайти друге за величиною число в масиві.   Відповідь: У цій програмі ми ініціалізували масив із 10 випадковими елементами, з яких ми збираємося знайти друге за величиною число. Далі ми створили дві цілочисельні змінні, яким присвоюватимемо значення двох цілих чисел з масиву – найбільшого і другого за величиною. Обидві змінні спочатку набувають значення першого за індексом елемента масиву. Потім ми виводимо на екран усі елементи, використовуючи цикл for. Подальша логіка роботи програми полягає в тому, щоб використовувати цикл for для обходу масиву. При обході, якщо елемент масива з поточним індексом більше, ніж значення, що зберігається в змінній biggest, тоді змінній secondBiggest присвоюємо значення, що зберігається в biggest, а змінній biggest – нове найбільше значення відповідно до значення поточного елемента масиву. Знову ж таки, якщо елемент за поточним індексом більше, ніж secondBiggest, то привласність secondBiggest значення цього елементу. Це буде повторюватися для кожної ітерації і, зрештою, після завершення обходу масиву в циклі ви отримаєте елементи – найбільший і другий за величиною елементи масиву в змінних biggest і secondBiggest відповідно.   public class SixteenthTask { public static void main(String[] args)             {             // ITVDN.com 16 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             int numbersArray[] = { 10, 15, 32, 100, 16, 11, 98, 36, 95, 33 };             int biggest= numbersArray[0];             int secondBiggest = numbersArray[0];             System.out.println("Отриманий масив: ");             for (int i = 0; i < numbersArray.length; i++)             {             System.out.print(numbersArray[i] + "\t");             }             for (int i = 0; i < numbersArray.length; i++)             {             if (numbersArray[i] > biggest)             {                         secondBiggest = biggest;                         biggest = numbersArray[i];             }             else if (numbersArray[i] > secondBiggest && numbersArray[i] != biggest)             {                         secondBiggest = numbersArray[i];             }             }             System.out.println("\nДруге за величиною число:" + secondBiggest);             } }   На екрані отримаємо: Отриманий масив: 10        15        32        100      16        11        98        36        95        33        Друге за величиною число: 98   Q # 17) Напишіть Java-програму для перевірки, чи введене число є числом Армстронга.   Відповідь: Насамперед, нам потрібно зрозуміти, що таке число Армстронга. Число Армстронга – це число, значення якого дорівнює сумі цифр, з яких воно складається, зведених у ступінь, що дорівнює кількості цифр у цьому числі. Як приклад – число 371: 371 = 3 * 3 * 3 + 7 * 7 * 7 + 1 * 1 * 1 = 27 + 343 + 1 = 371 Якщо у вас число чотиризначне: 8208 = 8 * 8 * 8 * 8 + 2 * 2 * 2 * 2 + 0 * 0 * 0 * 0 + 8 * 8 * 8 * 8 = 4096 + 16 + 0 + 4096 = 8208 Виконуючи рішення, спочатку ми оголошуємо цілочисленні змінні tempNumber, x і y. Ми ініціалізували змінну y значенням 0. Потім ми створюємо змінну qurentNumber і присвоюємо їй ціле значення, яке ми збираємося перевірити, чи є воно числом Армстронга (у нашому випадку це 371). Потім ми надали нашій змінній tempNumber те значення, яке зберігається в перевіреній змінній qurentNumber. Далі в циклі while ми змінній a привласнюємо залишок від ділення числа qurentNumber на 10 – і отримаємо число одиниць у початковому числі qurentNumber. Потім ми замінюємо значення змінної qurentNumber на результат діленого введеного числа на 10. Нашій змінній y, значення якої спочатку було встановлено як 0, присвоюється результат y + (x * x * x). Таким чином під час першої ітерації до y потрапить результат зведення в потрібний ступінь значення числа одиниць у початковому числі, при наступній ітерації до y до ступеня числа одиниць додасться результат зведення в ступінь числа десятків, і так далі по всіх розрядах до кінця числа qurentNumber з права на ліво. Нарешті, ми використовуємо оператор if-else для перевірки, чи буде отримане значення змінної y дорівнювати значення змінної tempNumber (у якій зберігається вихідне число). Якщо y = tempNumber, то загадане число є числом Армстронга, інакше – ні.   public class SeventeenthTask{  public static void main(String[] args)  {             // ITVDN.com 17 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             int y=0, x, tempNumber;             int qurentNumber=371; //Дане число ми перевірятимемо на те, чи є воно числом Армстронга             tempNumber = qurentNumber;             while(qurentNumber >0)             {             x= qurentNumber %10;             qurentNumber = qurentNumber /10;              y=y+(x*x*x);                         }                         if(tempNumber ==y)                         System.out.println("Дане число є числом Армстронга");                          else                         System.out.println("Дане число не є числом Армстронга");     } } На екрані отримаємо: Дане число є числом Армстронга   Q # 18) Напишіть Java-програму для видалення всіх пробілів з рядка за допомогою replace().   Відповідь: Це проста програма, в якій ми маємо рядкову змінну st1. Інша рядкова змінна st2 ініціалізується за допомогою методу replaceAll, який є вбудованим методом для видалення n числа пробілів. У результаті ми виводимо на екран st2, яка вже не містить пробілів. public class EighteenthTask {             public static void main(String[] args)             {             // ITVDN.com 18 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             String st1 = "Ми готуємось   до інтерв’ю   на вакансію     Java розробника";             //Використовуємо метод replaceAll()             String st2 = st1.replaceAll("\\s", "");             System.out.println(st2);             } } На екрані отримаємо: Миготуємосядоінтерв'юнавакансіюJavaрозробника   Q # 19) Напишіть Java-програму для видалення всіх пробілів з рядка без використання replace().   Відповідь: Це ще один підхід до видалення всіх пробілів. Знову ж таки, для початку у нас є одна рядкова змінна st1 з деяким значенням. Ми перетворюємо цей рядок на масив символів, використовуючи toCharArray(). Потім ми маємо один об'єкт StringBuffer strB, який буде використовуватися для додавання значення, що зберігається за індексом chars [i] після того, як ми додали цикл і одну умову if. Умову встановлено так, що елемент з індексом i масиву символів не повинен дорівнювати символу пробілу або табуляції. Зрештою, ми виводимо на екран наш об'єкт StringBuffer strB. public class NineteenthTask {             public static void main(String[] args)             {                         // ITVDN.com 19 з ТОП 20 тестових завдань на інтерв’ю для Java розробника             String st1 = " Ми готуємось  до інтерв’ю   на вакансію     Java розробника";             char[] charsArray = st1.toCharArray();             StringBuffer strB = new StringBuffer();             for (int i = 0; i < charsArray.length; i++)             {             if( (charsArray[i] != ' ') && (charsArray [i] != '\t') )             {                         strB.append(charsArray [i]);             }             }             System.out.println(strB);                      } } На екрані отримаємо: Миготуємосядоінтерв'юнавакансіюJavaрозробника   Q # 20) Напишіть Java-програму для читання даних із таблиці Excel.   Відповідь: Ці типи програм зазвичай використовують у рамках Selenium framework. Ми додали докладні коментарі для кожного кроку, щоб зробити програму більш зрозумілою. Логіка починається з того моменту, як ми завантажили лист, на якому зберігаються дані. Ми намагаємося імпортувати електронну пошту та пароль. Для цього ми виймаємо комірку за допомогою методів getRow() та getCell(). Припустимо, у нас є електронна пошта та паролі в 1-й та 2-й комірці. Далі ми встановлюємо тип комірки – рядкова. Після цього ми виконуємо звичайну операцію локатора веб-елемента (By.id), куди ми передали унікальні значення локатора, такі як "email" та "пароль", які ідентифікуватимуть ці елементи. Нарешті, ми надсилаємо ключі, використовуючи element.sendKeys, де cell.getStringCellValue() – це ключ. Ця операція поверне вам значення, збережене в комірках № 1 і 2 відповідно. @Test  public void ReadData() throws IOException  {            // Імпортуйте лист Excel з директорії web диску c.              //QurentSourceFile – це ім’я потрібного файлу excel              File sourceFile=new File("C:\\web\\QurentSourceFile.xls");              // На цьому кроці ми завантажуємо файл. Ми використовуємо FileInputStream для читання з // файлу Excel. Якщо ви хочете проводити запис у файл – // ви повинні використовувати FileOutputStream. Шлях до файлу передається // в якості аргументу FileInputStream              FileInputStream fileInput = new FileInputStream(sourceFile);                          // На цьому кроці ми завантажуємо робочу книгу Excel             // за допомогою HSSFWorkbook,             // в який ми передаємо fileInput в якості аргументу             HSSFWorkbook book = HSSFWorkbook(fileInput);             // На цьому кроці ми завантажуємо конкретний лист excel,             // на якому зберігаються дані.             qurentSheet= book.getSheetAt(0);              for(int i=1; i<= qurentSheet.getLastRowNum(); i++)              {             // Import data for Email.             qurentCell = qurentSheet.getRow(i).getCell(1);             qurentCell.setCellType(Cell.CELL_TYPE_STRING);                          driver.findElement(By.id("email")).sendKeys(qurenrCell.getStringCellValue());             // Імпортуємо дані з комірок з паролями             qurentCell = qurentSheet.getRow(i).getCell(2);             qurentCell.setCellType(Cell.CELL_TYPE_STRING);             driver.findElement(By.id("password")).sendKeys(qurenrCell.getStringCellValue());             }   } Резюме У цій статті ми розглянули найпоширеніші тестові завдання для розробників Java з прикладами коду. Ці завдання застосовуються на більшості технічних інтерв'ю Java розробників. Ми розглянули такі прийоми роботи з даними за допомогою Java, як базові маніпуляції з рядками, цілими числами та символами, використання Selenium, читання даних із файлу. Теперь у вас є достатньо інформації про те, як проходити технічний етап інтерв'ю на вакансію Java розробника. Звичайно, вам потрібні будуть інші навички. Вивчення напам'ять рішень 20 завдань може бути головним способом підготуватися до інтерв'ю. Вам слід мати гарний набір теоретичних знань та практичних навичок. З нашого боку портал ITVDN.com готовий запропонувати програму підготовки Java розробника, що включає відео курси як із Java, так і за супутніми технологіями. Також рекомендуємо вам ознайомитись із серією відео «Підготовка до співбесіди в IT компанії. Питання та відповіді. Хитрощі. Трюки» За матеріалами статті.
ТОП-7 найкращих Linux дистрибутивів для розробника в 2019 році

Автор: Армен Маїлян

ТОП 7 дистрибутивов Linux 7-е место - Gentoo 6-е место - Gentoo 5-е место - Linux Mint 4-е место - Fedora 3-е место - Debia 2-е место - Arch Linux 1-е место - Ubuntu Несколько не вошедших в ТОП рейтинга, но все еще интересных дистрибутивов Linux Antergos Puppy Linux Manjaro Linux   Существует большое разнообразие операционных систем, используемых на рабочих станциях как простыми пользователями, так и разработчиками ПО. Какую же операционную систему следует выбрать разработчику в 2019 году? Согласно опросу, проведенному среди более чем 76 000 разработчиков и опубликованному в ежегодном отчете Stack Overflow’s 2018 Developer Survey, лидирующее положение в качестве основной операционной системы все еще занимает OS Windows. Однако, уже почти четверть из числа разработчиков используют в качестве основной ОС – Linux, или правильнее сказать Linux-based операционную систему. Этот немалый процент пользователей не может не заставить задуматься – а какие плюсы дает использование Linux в качестве операционной системы для разработчика? Возможно, имеет смысл мигрировать на Linux с OS Windows и MacOS? Но давайте для начала уточним несколько моментов.   Что такое Linux История UNIX-подобных операционных систем начинается в 1960-х годах с совместного проекта Массачусетского Технологического Института и компаний General Electric и Bell Labs. В последствии компании прекратили финансирование проекта и его развитие продолжилось энтузиастами. Это привело к появлению в 70-х годах системы UNICS, затем сменившей название на UNIX. В 1980-х годах набор дистрибутивов UNIX был выпущен под коммерческой лицензией компанией AT&T, в которую входила Bell Labs. Однако, по политическим причинам, AT&T была вынуждена предоставить исходный код OS UNIX, под ограничивающей возможности лицензией, ряду вузов, включая университет Беркли. Так, начиная с 1978 года, появилось одно из первых ответвлений Unix-подобных систем – BSD Unix. (BSD - Berkeley Software Distribution). Работавший в начале 1980-х в MIT Ричард Столлман был недоволен коммерциализацией и закрытостью лицензий UNIX. В 1983 году он объявил о новом проекте – GNU (GNU – рекурсивный акроним GNU’s Not UNIX). В рамках этого проекта получила начало разработка Unix-подобной операционной системы под свободной лицензией GNU GPL. Стоит отметить, что данная лицензия не только дает право разработчику свободно использовать программы, выпущенные под этой лицензией, но и обязывает разработчика выпускать все производные программы также под данной лицензией. Операционная система Linux появилась на свет в 1991 году благодаря Линусу Торвальдсу, разочаровавшемуся в существующих на тот момент операционных системах, бывших либо платными, либо выпущенными под лицензией BSD – с правом применения только в образовательных целях. В новой операционной системе Линусом Торвальдсом было переписано ядро, задачей которого является, в основном, координация доступа приложений к ресурсам системы. Возникшая на основе UNIX-подобной системы MINIX, работавшей под лицензией BSD, операционная система Linux в дальнейшем претерпела значительных изменений. Так были заменены многие компоненты на те, что написаны под лицензией GNU. В последствии произошло более глубокое слияние проектов GNU и Linux с образованием операционной системы GNU/Linux или той, что сейчас зачастую называют просто - Linux. До сих пор существует путаница в том, какие дистрибутивы ОС следует относить к Linux, а какие – нет. Ряд пользователей называет Linux-ом все операционные системы, использующие ядро Linux. В число таких ОС входит, в частности – Android. Другие пользователи признают под Linux только те дистрибутивы, которые состоят как из стандартного ядра, так и из обязательно включенной части ПО GNU (в число таких Android входить, соответственно, не будет). В рамках данной статьи, мы примем за определение Linux следующее: Операционная система Linux – это продукт, состоящий из ядра Linux, и набора внешних модулей GNU. Часто многие обзорные статьи и рейтинги операционных систем под заголовками «ТОП ... лучших Linux дистрибутивов» включают в себя не только сборки из семейного дерева Linux, но и те, которые фактически относятся к другим ветвям Unix-подобных систем, в частности - FreeBSD. Такая путаница действительно существует. Но не стоит забывать – это разные «ветви» развития операционных систем, имеющих общий исторический «корень» – Unix.   Преимущества Linux, как системы для разработчиков Почему Linux хорошая альтернатива для разработчика? Рассмотрим отдельно преимущества и недостатки использования Linux как основной операционной системы.   Общие преимущества для пользователей: Выбор. Огромное разнообразие дистрибутивов Linux, с разным набором компонентов, позволяет профессиональному пользователю найти тот, который будет удовлетворять его потребности как в работе, так и в быту. Настраиваемость и гибкость системы. Являясь, вероятно, самой настраиваемой и гибкой системой, Linux позволяет подогнать операционную систему под себя буквально. Бесплатное распространение. Распространяясь под лицензией GNU GPL, сами дистрибутивы Linux являются бесплатными. Однако ряд дистрибутивов являются коммерческими и полный спектр возможностей (поддержка, доступ в ряд репозиториев и т.п.) предоставляют на платной основе. Открытое программное обеспечение – Open Source. Огромное количество разнообразных программ с отрытым исходным кодом, бесплатных и общедоступных. Значительное количество специфических программ для обучения. При этом сохраняется возможность установки проприетарных программ. Использование эмулятора Wine позволяет запускать  на Linux многие приложения операционной системы Windows. Низкие системные требования и высокая скорость работы. Благодаря глубокой кастомизации дистрибутивов, обеспечивается более высокая скорость работы операционной системы и приложений. Это позволяет с большим комфортом пользоваться относительно старым железом при правильном подборе дистрибутива ОС. Активное сообщество пользователей и разработчиков. Безопасность. Конечно безопасность операционной системы в первую очередь зависит от пользователя, но нельзя не признать, что количество вирусов под Linux на порядки меньше чем под Windows. Кроме того, благодаря доступу к публичным, контролируемым репозиториям для установки ПО, нет необходимости брать программы из непроверенных источников. Также нельзя не отметить глубокую настраиваемость механизмов, обеспечивающих безопасность в Linux.   Преимущества Linux для разработчиков: Возможность тестировать разрабатываемое ПО прямо в том же окружении, в котором оно будет работать после выхода в продакшн. Вы можете иметь на вашем персональном компьютере весь тот же самый софт, с теми же версиями и настройками, как тот, который будет «крутиться» на сервере для вашего приложения. Удобство при активном использовании механизмов командной строки, Git и текстового редактора Vim отмечают многие разработчики. Стабильность в работе без перезагрузок. Многие пользователи не перезагружают операционную систему, пока не появляется необходимость в обновлении. Параноикам от мира разработчиков будет приятно знать, что Linux не собирает статистику на пользователя, в отличие от той же Windows   Недостатки Linux, как системы для разработчиков: Отсутствие ряда профессиональных программ, сравнимых с таковыми под Windows. Несмотря на возможность запуска многих программ под Wine нехватка профессиональных приложений ощущается. Особенно это заметно при необходимости работы с графикой и моделированием. Сложность разработки под Windows. Если вы работаете под Linux, это не значит, что в ваши задачи не будет входить написание кода под Windows. К сожалению полноценная Visual Studio под Linux не работает, а эта IDE сейчас является основной для Windows-разработки. Определенная сложность в обучении работы с инструментами. Нельзя не отметить, что порог вхождения в работе под Linux заметно выше.   Мы выделили основные плюсы и минусы в работе на Linux для программиста. Теперь давайте рассмотрим наиболее приемлемые Linux дистрибутивы. Разнообразие дистрибутивов Linux и статистика История дистрибутивов Linux насчитывает уже более 28 лет. Не удивительно, что из года в год появляющиеся и отмирающие ветви дистрибутивов этой операционной системы сегодня представляют уже целый зоопарк – фигурально выражаясь. Для примера можно посмотреть на стилизованный под периодическую систему список наиболее используемых дистрибутивов Linux, отсортированных по материнским версиям операционных систем. Как видно из этой схемы, таких дистрибутивов – не мало. И это только наиболее популярные. Известный портал distrowatch.com насчитывает только активных более 260 дистрибутивов. Чтобы помочь определиться с тем, какой дистрибутив Linux лучше выбрать разработчику, рассмотрим несколько рейтингов дистрибутивов Linux. Статистика использования пользователями разных дистрибутивов Linux согласно порталу phoronix.com Согласно данным опроса, проведенного в 2017 году порталом phoronix.com среди почти 30 000 людей, использовавших Linux дистрибутивы на ноутбуках, лидером по применению  является дистрибутив Ubuntu. Этот дистрибутив линукс получил 38,9% голосов. Следом за Ubuntu по популярности идет дистрибутив Arch Linux, получивший 27,1% пользователей.  Затем идут, Debian, Fedora и Linux Mint, получившие, соответственно, 15,3%, 14,8% и 10,8% аудитории. Шестое место в этом рейтинге дистрибутивов Linux занял openSUSE с 4,2%, а седьмое – Gentoo с 3,9% аудитории. Стоит отметить, что почти три четверти этих пользователей (73,1%) использовали указанную ими операционную систему для разработки ПО. Топ дистрибутивов Linux по статистике портала gamingonlinux.com По данным опроса, проведенного порталом gamingonlinux.com среди более 2 500 своих пользователей и действительному на 01.01.2019 – большая часть их пользователей использует Arch Linux - 21,2%. Затем идут Ubuntu – 19,15%, Linux Mint – 9,37%, Manjaro – 7,36%, Debian – 6,28%, Fedora – 4,72%, Antergos – 4,61%.   Опрос для рейтинга дистрибутивов линукс на портале reddit.com Проведенный на портале reddit.com в 2017 году, опрос среди почти 2 500 человек в сообществе r/unixporn, показал наибольшую популярность таких дистрибутивов линукс: Arch Linux использовали 27.0% пользователей, Ubuntu – 17,9%, Debian – 11,8%, Fedora – 6,09%. Затем идут Rasbian – 5,52%, Manjaro – 5,43% Antergos – 4,67%, Linux Mint – 3,41% и Gentoo – 2,44%. Множество других дистрибутивов Linux, включая openSUSE, Puppy Linux, CentOS и т.п., использует значительно меньшая доля пользователей. При этом указанные дистрибутивы использовались на ноутбуках более чем в 80% случаев, а на стационарных компьютерах – более чем в 60% случаев. Данные Google Trends Данные Google Trends, по пяти наиболее популярным дистрибутивам, показывают существенный отрыв Ubuntu даже от других дистрибутивов первой пятерки.   Давайте рассмотрим непосредственно наш рейтинг Linux дистрибутивов, составленный на основе указанных выше статистических данных.   ТОП 7 дистрибутивов Linux   7-е место - Gentoo Дистрибутив Gentoo версии 1.0 увидел свет в 2002. Этот дистрибутив создавался Дэниелом Роббинсом на основе другой его разработки, начатой еще в 1999 году -  Enoch Linux. В 2004 году Роббинсом был создан некоммерческий Фонд Gentoo, которому он передал в последствии права на торговые марки и авторские права, после чего покинул пост главного архитектора проекта. Философия проекта Gentoo состоит в предоставлении пользователям линукс, желающим иметь полный контроль своей системы, возможность контролировать, что установлено и запущено на их компьютере.  У пользователей есть возможность собирать персональные системы и серверы очень эффективными, если они готовы потратить немалое время, для установки и настройки системы. Gentoo рекомендует пользователям создавать ядро Linux с учетом их конкретного оборудования. Пользователи могут полностью контролировать, установленные и запущенные службы. Возможно существенно уменьшить потребление системой памяти в сравнении с работой других дистрибутивов, исключив незадействованные пакеты и службы ядра. Соответственно, может быть увеличена и скорость работы операционной системы - благодаря отсечению лишнего. Само название дистрибутива, происходит от названия вида пингвинов - Gentoo penguin, самого быстрого в мире. Значительная часть версий Linux являются пакетными. Сам процесс установки дистрибутивов такого типа происходит из пакетов, заранее собранных с откомпилированными исполняемыми файлами. Gentoo, в свою очередь, дистрибутив не пакетный, а source-based. У такого типа дистрибутивов исходники пакетов хранятся в репозиториях, а при установке – пакеты собираются из исходников прямо на пользовательском компьютере. Официальный сайт – https://www.gentoo.org/   Особенности линукс дистрибутива Gentoo: source-based дистрибутив; системы менеджмента пакетами Portage, Pkgcore, Paludis; для ряда приложений (особенно долго компилируемых) есть готовые бинарные сборки; созданные при компиляции на одном компьютере бинарные пакеты можно переносить на другой, с таким же железом; скользящие обновления (rolling-релиз); возможность установки существует для таких платформ - x86, x86-64, ARM, PowerPC, PowerPC 970, SPARC, MIPS, DEC Alpha, PA-RISC, IBM/390, SuperH и 68k.   Плюсы дистрибутива линукс Gentoo: глубокая настройка ОС с компилированием под индивидуального пользователя с конкретным железом; очень большое число доступных для установки приложений; большое количество доступных репозиториев; очень высокая стабильность работы правильно настроенных приложений; благодаря rolling-релизам обновление становятся менее болезненным; развитое сообщество пользователей и разработчиков; хорошая документация; возможность продолжения компиляции пакетов в случае если она была прервана; возможность устанавливать одновременно несколько веток софта; ряд исследований показывает, что в Gentoo потребление PHP памяти может быть уменьшено на количество вплоть до 50%.   Минусы дистрибутива Gentoo: излишне высокий порог вхождения для обычного пользователя; первоначальная установка занимает много времени; необходимость в частых обновлениях; если систему долго не обновлять, то обновление потом будет по сложности сравнимо с установкой с нуля; основная работа только через командную строку; возможны проблемы в процессе установки (компиляции пакетов) на слабых компьютерах.   Минимальные системные требования Gentoo Linux для desktop: Фактически может работать на самых минимальных возможных конфигурациях, в зависимости от задач и сборки.   6-е место - openSUSE Начало дистрибутиву openSUSE положено в 1992 году, когда четыре «любителя Linux» - Роланд Дайрофф, Томас Фер, Хьюберт Мантел и Бурхард Стейнбилд запустили SuSE - свой проект по продаже локализованных наборов Slackware Linux. Начиная с 1996 года, SuSE Linux стала независимым дистрибутивом. В дальнейшем, в состав SuSE Linux добавили менеджер пакетов RPM и представили общественности YaST - графический инструмент управления системой. Частые выходы новых версий дистрибутива, доступность SuSE Linux в магазинах Европы и Америки, наличие полной печатной документации – все это смогло поднять популярность дистрибутива. Novell Inc приобрела SuSE Linux в конце 2003 года. Вскоре произошел ряд изменений в политике SuSE. Так широкой публике представили YaST, дистрибутив SuSE лицензировали под GPL, образы дистрибутива начали распространять свободно с общедоступных серверов загрузки, и, что наиболее важно, разработка дистрибутива стала открытой для участия общественности. С версии SuSE 10.0, благодаря сообществу openSUSE, дистрибутив начинает распространятся полностью бесплатно, с открытым исходным кодом. На основе кода openSUSE был создан коммерческий продукт, сначала под именем Novell Linux, но позже разделившийся на два и изменивший название на SUSE Linux Enterprise Desktop и, также, SUSE Linux Enterprise Server. Сейчас проект openSUSE финансируется как компанией SUSE, так и рядом других компаний, и энтузиастов. Сейчас openSUSE доступен в двух основных редакциях - Leap, которая обеспечивает стабильную платформу с многолетней поддержкой и Tumbleweed, который обеспечивает скользящий выпуск обновлений дистрибутива. openSUSE часто хвалят за простоту настройки (через YaST), расширенную поддержку файловой системы Btrfs, а также за автоматические снимки файловой системы и загрузочные среды. Официальный сайт - https://www.opensuse.org/ Особенности дистрибутива openSUSE: версия ядра Linux – 4.12; в качестве графических сред, использует - Cinnamon, Enlightenment, GNOME, IceWM, KDE Plasma, LXDE, LXQt, MATE, Xfce; частота обновления версий – 12 месяцев; в качестве менеджера пакетов применяется RPM; поддерживает x86-64. Плюсы дистрибутива openSUSE: комплексный и интуитивно понятный инструмент настройки; большой репозиторий доступных пакетов ПО; отличная документация проекта; файловая система Btrfs, по умолчанию. Минусы дистрибутива openSUSE: ресурсоемкая работа рабочего стола и графики зачастую замедляет работу системы. Минимальные системные требования openSUSE: Pentium 4 1,6 GHz – процессор; 1 GB – оперативной памяти; 3 GB – свободного места на жестком диске; CD-ROM или USB порт.   5-е место - Linux Mint Linux Mint - основанный на Ubuntu ирландский дистрибутив, впервые выпущенный в 2006 году. Mint доминировал во многих рейтингах с 2011 по 2017 год. Такую популярность он приобрёл за свою стабильность, разнообразие поддерживаемых настольных менеджеров и полноценные мультимедийные возможности. Изначально планировалось выпускать несколько версий дистрибутива Mint под каждый выпуск версии Ubuntu. Однако, со временем, цикл разработки удлинился, сейчас составляя 2 года. При этом теперь дистрибутив базируется только на LTS-версиях Ubuntu (. В настоящий момент разрабатывается и управляется сообществом. Разработчики Mint сосредоточены на стабильности, поэтому они предпочитают консервативный цикл выпуска. Вы не будете получать новейшие обновления, но все равно будете в курсе событий разработки. Вас также не привлекут к разработке в качестве непроизвольного бета-тестера. Официальный сайт - https://linuxmint.com/   Особенности дистрибутива Mint: основывается на LTS версиях дистрибутива Ubuntu; версия ядра линукс – 4.15; специально разработанная среда рабочего стола Cinnamon, также доступны MATE, Xfce; частота обновления версий – 2 года; в качестве системы менеджмента пакетов - применяется dpkg; поддерживает x86 архитектуру; в сравнении с Ubuntu, базовый дистрибутив включает более расширенный мультимедийный функционал; использует тот же программный репозиторий, что и Ubuntu; вход под суперпользователем по умолчанию запрещён, как и в Ubuntu; своя система как обновления, так и установки приложений.   Плюсы дистрибутива Mint: превосходная коллекция мультимедийных инструментов; высокая стабильность работы; открытое сообщество разработчиков.   Минусы дистрибутива Mint: в альтернативные «общественные» релизы редко добавлены последние функции; проект не выпускает рекомендации по безопасности.   Минимальные системные требования дистрибутива Linux Mint: x86 - процессор; 512 MB – доступной оперативной памяти; 9 GB - места на жёстком диске; CD-привод или USB-порт.   4-е место - Fedora Хотя официально год представления дистрибутива общественности - 2004, фактически история Fedora начинается в 1995. Дистрибутив, с именем Fedora, его авторами Бобом Янгом и Марком Юингом изначально был назван - Red Hat Linux. В последствии, Red Hat представила в 1997 году новый менеджер пакетов – RPM (RPM - рекурсивный акроним RPM Package Manager - менеджер пакетов), во многом признанный революционным. В 2003 году, после выхода 9й версии Red Hat, в продуктах компании произошел ряд изменений. Имя Red Hat (товарный знак) - сохранился для коммерческих продуктов, публике же был представлен дистрибутив Fedora Core (затем сменивший имя на Fedora), изначально ориентированный на сообщество «любителей Linux». Несмотря на неприятие изменений сообществом, Fedora уже через несколько выпусков смогла вернуть себе звание одной из наиболее востребованных версий дистрибутива Linux. В свою очередь компания Red Hat, благодаря внедрению множества инноваций, превосходной поддержке клиентов и ряду других моментов, смогла стать крупнейшей и прибыльнейшей Linux-компанией в мире. В 2015 году Fedora представила обновленную версию своего дистрибутива под названием Atomic Host. Используя те же пакеты, что и Fedora's Server edition, Atomic обеспечивает обновления базовой ОС используя технологию OSTree. Сегодня Fedora - это один из самых распространенных и инновационных дистрибутивов Linux. К началу 2019 года только загрузок дистрибутива с официального сайта было произведено около 1 500 000. Широко известен вклад проекта Fedora в код ядра системы Linux, в ряд библиотек и технологий. Однако, в дистрибутиве все еще отсутствует определенность в стратегии развития десктоп-сегмента, которая упростила бы использование этого линукс дистрибутива для всех тех, кто выходит за рамки цели «любителя Linux». Официальный сайт - https://getfedora.org/   Особенности дистрибутива Fedora 29: версия ядра Linux – 4.18; менеджер пакетов RPM; использует по умолчанию графическую среду GNOME 3.30; частота обновления – 6-8 месяцев; поддерживает x86, x86-64, ARM, i686, POWER, MIPS, IBM System/39 платформы; единый глобальный репозиторий с исключительно бесплатным ПО (есть ряд неофициальных репозиториев); проект как разрабатывается, так и поддерживается сообществом, при этом спонсором выступает компания Red Hat; Fedora Project запретила поставку дистрибутива в Крым, Сирию, Судан, Иран, Северную Корею, и Кубу.   Плюсы дистрибутива Fedora: значительная инновационность дистрибутива; встроенная поддержка Docker; впечатляющие возможности обеспечения безопасности; огромное количество поддерживаемых пакетов; философская концепция свободного ПО; устоявшееся сообщество разработчиков и пользователей дистрибутива; наличие Live-CD со многими графическими оболочками.   Минусы дистрибутива Fedora: приоритеты дистрибутива Fedora, ориентированы, чаще, на решения корпоративных задач, а не на удобство при использовании персональных компьютеров; некоторые передовые внедрения (к примеру - раннее переключение на KDE 4 и GNOME 3) отталкивают ряд устоявшихся пользователей настольных компьютеров.   Минимальные системные требования дистрибутива Fedora: 1 GHz - процессор; 1 GB – оперативная память; 10 GB – свободного места на жестком диске.   3-е место - Debia   OS Debian GNU анонсировали в 1993 году. Создателем дистрибутива Debian был Ян Мердок, который, совместно с сотнями разработчиков-добровольцев, проектировал новый, полностью некоммерческий дистрибутив. Несмотря на общий скепсис в отношении новой операционной системы, Debian выжил. Кроме того, он стал крупнейшим дистрибутивом и, вероятно, самым крупным совместным проектом ПО из когда-либо созданных! Успешность Debian можно проиллюстрировать следующими цифрами. Его разрабатывали более 1000 добровольных разработчиков. Репозитории Debian содержат около 50 000 бинарных пакетов (написанных для 8 различных процессорных архитектур) и участвуют в создании около 130 установочных дистрибутивов и систем LiveCD на основе Debian. Ни одна другая ОС семейства Linux не может похвастаться похожими достижениями. Фактическая разработка OS Debian происходит в четырех (включая экспериментальную) основных ветвях с повышающимися уровнями стабильности работы ПО: «нестабильная» - «sid», «тестовая» и «стабильная». Именно благодаря этой схеме постепенной стабилизации и интеграции компонентов, Debian на сегодня считается одним из наиболее протестированных и наиболее свободных от ошибок дистрибутивов Linux. Официальны сайт - https://www.debian.org/   Особенности stable дистрибутива Debian Linux: дистрибутив основан на ядре версии 4.9. работает на следующих архитектурах - Intel x86, Intel 64, AMD64, ARM, ARM с аппаратным FPU, 64-битные ARM, 32bit MIPS, 64bit MIPS, Power Systems, 64-битный IBM S/390.   Плюсы дистрибутива Debian: признанная очень высокая стабильность; глубокий и последовательный контроль качества разработки; огромная библиотека пакетов в репозиториях - более 30 000 пакетов ПО; Универсальность касательно применения с различными видами процессорных архитектур. Debian поддерживает на сегодня больше их видов, чем любые другие линукс дистрибутивы. Минусы: достаточно быстрое устаревание стабильных версий из-за длинного цикла разработки – 1-3 года на цикл; консервативный состав дистрибутива – новые технологии, зачастую, не включаются в состав дистрибутива из-за необходимости поддержки сразу многих процессорных архитектур; относительно старая версия ядра; демократичность руководства проектом зачастую приводит к неоднозначным решениям, вызывая конфликты в сообществе разработчиков и тормозя развитие проекта.   Системные требования Debian: 128 MB – оперативная память; 2 GB - свободного места на жестком диске.   2-е место - Arch Linux Дистрибутив Arch Linux был основан Джаддом Винетом на философии KISS (keep it simple, stupid - не усложняй, тупица) в 2002 году. Сначала развитие проекта Arch Linux проходило, как дистрибутива для достаточно продвинутых пользователей, и Arch был мало популярен. Ситуация изменилась после того, как к дистрибутиву была применена политика обновлений Rolling release (плавающий релиз).  Теперь операционную систему достаточно стало установить единожды, после чего мощный менеджер пакетов сам обновлял соответствующие пакеты согласно выходящим обновлениям, без необходимости переустановки ОС. Из-за этого мажорные выпуски Arch Linux немногочисленны и ограничиваются базовым установочным образом, который обновляется только при значительных изменениях в базовой версии системы. Официальный сайт - https://www.archlinux.org/   Особенности дистрибутива Arch Linux: быстрый и мощный менеджер пакетов Pacman предоставляет возможность легко управлять и настраивать под себя как пакеты, размещенные в официальных репозиториях Arch, так и собранные самостоятельно; возможность устанавливать пакеты ПО из исходного кода; доступны следующие варианты графических оболочек – GNOME, KDE, LXDE, MATE, Xfce, Cinnamon, Enlightenment. в своем базовом виде дистрибутив Arch Linux содержит тщательно отобранный набор ПО, необходимого для ежедневной работы. основанная на философии «не усложняй», Arch Linux предоставляет ПО в том виде, в котором оно изначально представлено разработчиками. Для обеспечения совместимости вносятся только минимально необходимые изменения. последняя версия работает с ядром 4.20.5.   Плюсы дистрибутива Arch Linux: отличная инфраструктура управления программным обеспечением; возможности глубокой настройки системы под себя; удобства системы обновлений Rolling release; доступность обширной библиотеки документации системы.   Минусы дистрибутива Arch Linux: опасности ошибок и нестабильности при обновлениях благодаря особенностям принципа обновлений «roll-release»; требовательность к относительно высокому уровню знаний пользователя; зачастую невозможность установки новой - «мажорной» версии ОС, поверх старой.   Системные требования Arch Linux: x86_64 - совместимый процессор; 512 MB - оперативная память; 800 MB – свободного места на жестком диске; подключение к Интернету.   1-е место - Ubuntu Топ 1 нашего рейтинга -  операционная система Ubuntu, является широко распространенной версией Linux, в свое время основанной на другом дистрибутиве – Debian. Впервые о выходе Ubuntu заявили в 2004 году. Несмотря на относительную новизну, развиваться он начал стремительно. Пройдя тернистый путь популяризации длинной в 15 лет, Ubuntu занимает место самой популярной версии Linux для настольных компьютеров. Этот проект сделал очень много для разработки простой и удобной в использовании, бесплатной операционной системы для настольных компьютеров. Сегодня дистрибутив Ubuntu успешно конкурирует как со свободными, так проприетарными ОС. В чем причины потрясающего успеха Ubuntu? Среди главных выделяют Марка Шаттлворта - автора проекта.  Участвовавший ранее до Ubuntu в разработке Debian, Шаттлворт является мультимиллионером, владеющим компанией Canonical Ltd, которая и финансирует проект в настоящее время. Во-вторых, проект Ubuntu извлек уроки из проблем в разработках схожих проектов и смог избежать их – разработчики смогли создать удобную веб-инфраструктуру с Wiki-документацией и креативным средством сообщения о багах системы, профессионально подходя к конечным потребителям. В-третьих – с помощью финансовых возможностей автора, участники проекта смогли разослать бесплатные образцы дистрибутива заинтересованным пользователям. Это напрямую поспособствовало скорейшему распространению Ubuntu. Фактически, Ubuntu основывается на нестабильной ветке дистрибутива Debian, включив в себя такие распространенные пакеты, как - GNOME, LibreOffice, Firefox и др., обновив их до стабильных версий. Этот дистрибутив Linux выходит с предсказуемым шестимесячным графиком, периодически выпуская версии с долгосрочной поддержкой (LTS), которые поддерживаются обновлениями безопасности на протяжении 5 лет. Выпуск без LTS, в свою очередь, поддерживается 9 месяцев. Официальный сайт - https://www.ubuntu.com/   Особенности дистрибутива линукс Ubuntu: дистрибутив основывается на Debian; вход под суперпользователем отключен. Для получения полномочий суперпользователя используется утилита sudo; доступны варианты дистрибутивов с разными пакетами графических оболочек - GNOME - по умолчанию в версии 18.04, KDE – Kubuntu, Xfce – Xubuntu, LXDE/ LXQt – Lubuntu и другие. в версии Ubuntu 18.04 сбор пользовательских данных включён по умолчанию (возможно отключить); ядро Linux версии 4.15 в LTS версии; проект разрабатывается и поддерживается компанией Canonical.   Плюсы дистрибутива Ubuntu: исправлен цикл релиза и период поддержки, в сравнении с Debian; наличие долгосрочной поддержки (LTS) с 5-летним сроком предоставления обновлений безопасности; интерфейс, дружественный для начинающих; множество как официальной, так и пользовательской документации; широко распространенный дистрибутив с обширным комьюнити, большим количеством репозиториев и широкой возможностью выбора программ для установки. поддержка новейших технологий «из коробки» - к примеру, 3D эффекты графической оболочки и элементов рабочего стола; простая установка проприетарных драйверов для различных устройств беспроводных сетей и видеокарт NVIDIA и ATI; возможность выбора варианта дистрибутива с менее требовательной графической оболочкой.   Минусы: отсутствие совместимости с дистрибутивом Debian; часто выходящие важные изменения дистрибутива, как правило, отталкивают некоторых пользователей; не LTS релизы поставляются только с 9-месячной поддержкой безопасности.   Минимальные системные требования дистрибутива Ubuntu: 2 GHz dual core процессор; 2 GiB – доступная оперативная память; 25 GB – свободного места на жестком диске; CD/DVD привод или USB порт для.   Несколько не вошедших в ТОП рейтинга, но все еще интересных дистрибутивов Linux   Antergos Antergos- это относительно новый дистрибутив Linux, основывающийся на Arch. Изначально выпущенный в 2012 году под именем Cinnarch, этот дистрибутив был клоном Arch Linux, с Cinnamon в качестве окружения рабочего стола. На уровне системы отличий между Antergos и Arch Linux – нет. Разница между дистрибутивами находится в подходе к пользователю. В отличие от Arch, рассчитанного на уже опытного пользователя, Antergos направлен на всех, как опытных, так и начинающих Linux пользователей. В качестве установщика Antergos использует собственную разработку - CNCHI, созданный чтобы максимально упростить для пользователя процесс установки. Минимальный набор входящих в дистрибутив приложений подойдет тем, кто хочет собрать дистрибутив под свои нужды. Если же вам нужен уже готовый к работе дистрибутив, предоставляющий полный набор приложений для повседневного использования - вам Antergos не подойдет. Галийское слово Antergos (означающее: предки) было выбрано, «чтобы связать прошлое с настоящим». Это название символизирует, что несмотря на все глубокие существенные изменения в дистрибутиве, глубокая связь с основой дистрибутива, Arch Linux - остается. Официальный сайт - https://antergos.com/   Особенности дистрибутива Antergos: основывается на Arch Linux; Использует версию ядра 4.20; Доступны такие виды графической оболочки – Cinnamon, GNOME, KDE, Xfce, Openbox, MATE Скользящая модель обновлений.    Плюсы дистрибутива Antegos: Открытое сообщество, как для разработчиков, так и для пользователей с их пожеланиями и замечаниями; Собственный установщик, упрощающий процесс установки; Поддерживается то же железо, что и у Arch Linux, Отличный внешний вид благодаря сотрудничеству с Numix; Использует репозитории Arch Linux; Быстрый выход обновлений для разнообразного ПО.   Минусы дистрибутива Antergos: Сложности с установкой проприетарных драйверов на ряд устройств - нужно ставить вручную.   Puppy Linux Puppy Linux это дистрибутив Linux, созданный Барри Каулером в 2003 году. Puppy Linux – не является цельным дистрибутивом Linux, как Debian. Puppy Linux также не является дистрибутивом Linux с несколькими разновидностями, как Ubuntu (с его вариантами Ubuntu, Kubuntu, Xubuntu и т. д.), хотя и поставляется в разных вариантах. Puppy Linux - это совокупность нескольких дистрибутивов Linux, построенных на одних и тех же общих принципах, с использованием одного и того же набора инструментов, на основе уникального набора приложений и конфигураций, специфичных для Puppy, и в целом обеспечивающих согласованное поведение и работу, независимо от того, какой дистрибутив вы выбираете. Не смотря на очень маленький размер, дистрибутив является полнофункциональным. В отличие от дистрибутивов LiveCD, которые должны постоянно подгружать данные с компакт-диска, Puppy загружается сразу в RAM. Таким образом все ПО будет запускаться практически мгновенно и мгновенно реагировать на ввод данных пользователем. Puppy Linux может загружаться с любого USB-накопителя, CD-ROM, Zip-диска или супердиска LS 120/240, дискет, внутреннего жесткого диска. Он может даже использовать мультисессионный формат CD-RW / DVD-RW, чтобы сохранить всё обратно на CD / DVD без жесткого диска вообще.   Есть три основных направления дистрибутивов Puppy Linux: официальные дистрибутивы – являются дистрибутивами общего назначения и поддерживаются командой Puppy Linux. Как правило, создаются с использованием сборщика систем Puppy Linux (называемого Woof-CE). собранные в коллекцию Woof, дистрибутивы Puppy Linux - разрабатываются для удовлетворения конкретных потребностей, предназначаются для общего пользования и собраны с использованием системного компоновщика Puppy Linux с рядом дополнительных или модифицированных пакетов. неофициальные производные дистрибутивы («щенки») - являются ремастерами (или ремастерами ремастеров), созданными и поддерживаемыми энтузиастами Puppy. Обычно предназначаются для определенных конкретных целей.   Официальный сайт - http://puppylinux.com/   Особенности дистрибутивов Puppy Linux: минимум системных служб; ядро версии 4.4. Можно обновить до 4.9; свой менеджер пакетов - Puppy Package Manage; поддерживает архитектуру i386, x86_64.   Плюсы дистрибутивов Puppy Linux: ядро и софт, оптимизированные под домашнего пользователя; содержит все инструменты повседневного использования; легкая установка – драйвера на большинство современного и старого оборудования работают автоматически; малый размер системы – 300 MB или меньше; возможна работа в режиме полной установки, а также полноценная работа c CD-ROM (LiveCD) или USB-Flash; возможность установки нескольких FRUGAL дистрибутивов на раздел с установленным Windows; удобная переносная система с вашими настройками на USB-флешке, карте памяти или HDD; удобный оконный «бабушка-френдли» интерфейс системы; большое количество производных дистрибутивов под нужды каждого пользователя.   Минусы дистрибутивов Puppy Linux: Из-за необходимости поддерживать совместимость со старым железом, графический интерфейс, некоторыми пользователями воспринимается сильно устаревшим.   Рекомендуемые системные требования: 1 или больше GHz - процессор; 2 GB - оперативная память.   Manjaro Linux Manjaro это дистрибутив Linux, основывающийся на Arch Linux. Впервые представленный в 2011 году, дистрибутив Manjaro до 2013 года находился в режиме беты. Основываясь на Arch, проект Manjaro со времен своего основания своей целью ставил создание дистрибутива, сочетающего в себе как дружественность по отношению к неопытным пользователям, так и возможности Arch Linux. Официальный сайт - https://manjaro.org/ Особенности дистрибутива Manjaro: Использует менеджер пакетов Pacman; Поддерживает платформу x86-64; Поддерживает версию ядра 4.20.3; Отказ от использования персональных архив пакетов (Personal Package Arhive - PPA).   Плюсы дистрибутива Manjaro: Удобный менеджер драйверов с возможностью автоматической установки; Поддержка обширного списка оборудования; Использование репозиториев Arch, полная совместимость с Arch User Repository; rolling release в обновлениях с предварительным тестированием пакетов участниками проекта Manjaro; удобная возможность установки множество версий ядра и удобного переключения между ними; доброжелательное сообщество.   Минусы дистрибутива Manjaro: Отказ от поддержки архитектуры i686; Пользователи отмечают перенасыщенность брендингом включая обои, закладки в браузерах и тп; Относительно малочисленной сообщество со всем вытекающим для Linux-пользователя.   Вывод. Выбирая для себя операционную систему, стоит помнить, что операционная система — это инструмент, который, с одной стороны, должен быть для вас удобным, а с другой – обладать нужным для вас функционалом. Какая система лучше для пользователя: Windows или Linux, или MacOs, или FreeBSD– это тема многих «священных форумных войн», так и не давших однозначного ответа на этот вопрос. Такие же баталии, хотя и с меньшим градусом агрессии, проходят на тему «лучший дистрибутив linux». Мы не сможем дать Вам однозначного ответа на вопрос – какой дистрибутив является лучшим дистрибутивом Linux для разработчика. Если Вы только раздумываете над возможностью перейти на работу c OC Linux, Вам будет полезно рассмотреть наш рейтинг в качестве отправной точки. Если же Вы уже являетесь опытным пользователем Linux – мы надеемся, что наш рейтинг дистрибутивов Linux поможет Вам в выборе нового инструмента, или утвердит в желании остаться на проверенном Вами. Не так важно определиться раз и на всегда в операционной системе. Не бывает однозначно абсолютно удобных инструментов (многие разработчики используют одновременно 2 и более операционных систем.). Главное, чтобы Вы продолжали профессионально расти и развиваться, используя подходящие и удобные для Вас инструменты. Со своей стороны, портал ITVDN готов предоставлять для этого развития актуальную и полезную информацию.
Об'єктно-орієнтоване програмування C# у деталях

Автор: Редакція ITVDN

Введение Большое количество статей посвящены C # OOП, но в данной C # OOП объясняется на понятных примерах. 1. Класс Класс - это макет. Что такое макет? Макет – это схематический чертеж плана будущего проекта. Например, если Вы планируете строить новый дом, инженер объяснит план его конструирования, демонстрируя макет, как на рисунке ниже. После этого инженер на основе макета начнет строительство дома. Как и макет, у класса есть чертеж программы. Используя класс, можно создать собственный метод, указать значения переменных, а через объекты получить доступ к методам классов и их переменным значениям. Класс должен иметь значения переменных, методы и объекты. ООП проще объяснить на примерах из жизни. Представьте дом в качестве примера для класса. В доме есть комнаты: гостиная, спальня, кухня - и техника, например, телевизор и холодильник. Владелец дома может пользоваться всеми комнатами и приспособлениями своего дома. То же можно сказать и о классе с группой методов и значений переменных. Комнаты с техникой – пример методов и значений переменных. Чтобы использовать класс, методы или значения переменных, используются объекты. Объекты являются примерами класса. Дом без комнат и техники будет пустым и никто не будет в нем жить, пока комнаты и техника не появятся. Пустой дом - класс. Так что же такое использование класса без методов и значений переменных? Для этого рассмотрим пример целостного дома. Аналогично, класс будет идти вместе с группой значений переменных, методов и объектов. Классы и объекты – фундаментальные понятия объектно-ориентированного программирования (ООП). Класс запускается введением ключевого слова «класс» и рядом указывается название Вашего класса. Вы можете дать любое название для класса. Далее нужно открыть и закрыть скобки, как показано на примере. class ShanuHouseClass1   {   }   2. Объект Владелец дома может получить доступ и использовать все комнаты дома и технику. Аналогично, для доступа к классовому методу и значениям переменных нужно использовать объекты. Можно создать один или несколько объектов для того же класса. Например, можно сказать, что бывает один или много владельцев дома. Ниже Вы увидите пример объекта, где "objHouseOwner" - это объект класса, который будет использоваться для доступа ко всем переменным параметрам и методам класса. ShanuHouseClass1 objHouseOwner = new ShanuHouseClass1();   3. Значение переменной Значения переменных используются для хранения наших характеристик. Наша характеристика может быть представлена в числовом виде или в виде текста. Например, чтобы сохранить номер телефона, можно использовать тип переменной "int", а чтобы сохранить имя, можно использовать измененный тип строки с именем для каждой переменной. Переменные могут быть локальными или глобальными. Например, если Вы покупаете новый телевизор, к Вам придет специалист, чтобы настроить телевидение. Он даст Вам свой контактный номер на будущее. Скорее всего, Вы запишите его номер на бумажке и положите ее туда, где сможете быстро найди, когда она понадобится. Если Вы будете хранить этот листок на видном месте, то все Ваши гости смогут увидеть его. Глобальные или общие переменные похожи на этот пример. Если определить значение переменной как глобальное, то все методы внутри класса смогут получить доступ к значению переменной. Если Вы храните бумажку с номером  в известном только Вам месте, то только Вы и видите контактный номер. Локальные частные переменные с этим схожи. Синтаксис значений переменных: Модификаторы доступа-тип данных-имя переменной По умолчанию доступ к модификаторам скрыт. Вы можете использовать общий доступ для переменных. Пример переменной: int noOfTV = 0;   public String yourTVName;   private Boolean doYouHaveTV = true;   class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();          Console.WriteLine("You Have total " + objHouseOwner.noOfTV + " no of TV :");           Console.WriteLine("Your TV Name is :" + objHouseOwner.yourTVName);         }   }   В предыдущем примере программ Вы определили два значения переменных внутри класса. При применении основного метода создается объект класса. Можно получить доступ к значению переменной класса и вывести изображение. Основным методом является метод по умолчанию в C#, где каждый консоль и приложение для Windows начнет выполнять программу. В основном методе можно определить объект для класса и использовать его, можно получить доступ ко всем значениям переменных параметров и методов класса. Допустим, что каждый дом имеет въездные ворота. Используя ворота, Вы попадаете в  свой дом. Аналогично, чтобы запустить программу, должен быть метод по умолчанию, который будет запускать программу. Основной метод полезен при запуске программы. Каждый раз, когда Вы будете запускать C# Console или приложение Windows, основной метод будет выполняться первым. Из основного метода можно создать объект для других классов и использовать их методы. 4. Метод или функции (метод функционирования) Метод – это группа из операторов кода. Вот предыдущий пример программы с методом функционирования. class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       public void myFirstMethod()       {           Console.WriteLine("You Have total " + noOfTV + "no of TV :");           Console.WriteLine("Your TV Name is :" + yourTVName);           Console.ReadLine();       }     static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();           objHouseOwner.myFirstMethod();                 }   } Примечание: Большинство разработчиков интересовались разницей между методами и функциями. В этой статье понятие метода используется вместо понятия функции. Тем не менее, есть одно отличие между методами и функциями. В ООП языках, таких как C #, Java и т.д. используется термин метод, а для не-ООП программирования, таких как "C" и других – функция. Использование методов. Предположим, что у Вас есть мобильный телефон и Вы храните на нем много песен. Тем не менее, Вы всегда любите слушать определенные песни. Очень сложно каждый раз выискивать из сотен песен на телефоне любимую и проигрывать ее. Вместо того, чтобы проделывать одну и ту же работу много раз, Вы можете использовать плейлисты. Щёлкните на плейлист и слушайте любимую музыку. Это облегчит Вашу работу, и Вам не придется повторять одни и те же действия постоянно. Методы используются как плейлист. Можно писать повторные коды для одного метода, а затем при необходимости использовать его. В доме может быть одна большая комната или несколько комнат, и в каждой есть какое-то оборудование. Точно так же в классе можно увидеть один или несколько методов. В доме может быть две или три спальни, но кажая спальня отличается по размеру, цвету и так далее. Это означает, что одни и те же комнаты все равно разного типа. Так и в классе можно создать более одного метода с тем же именем, но с другим параметром. В ООП это называется "полиморфизм". Синтаксис функций. Модификаторы доступа, тип возвращения, название метода (список параметров): Модификаторы доступа: о них будет сказано далее в статье. Тип возвращения: Если Ваш метод возвращает значение, тогда Вам следует использовать тип возвращения с любым типом данных, такие как string, int и так далее. Если метод не возвращает значение, используйте тип "Void". Название метода: Здесь Вы задаете имя каждому методу. Список параметров: список параметров или аргументов, которые Вы передаете функции. Ниже приведен пример способа. • Метод с типом Void: Void - ключевое слово, благодаря которому данные из методов не возвращаются.  public void veranda()   {      Console.WriteLine("Welcome to Veranda");      Console.WriteLine("How Many Chairs Do you have in your Veranda");      NoofChair = Convert.ToInt32(Console.ReadLine());      Console.WriteLine("I have total " + NoofChair + " Chairs in my Veranda");   }   • Метод с типом возврата: метод обернется в какой-то результат, который может использоваться в программе. Например, возьмем метод TVNAME  с типом возврата "String". Можно сказать, что у Вас в доме есть телевизор в гостиной, родительской спальне и детской. В каждой комнате стоит телевизор разных фирм. Предположим, Вы хотите узнать название бренда телевизора. Вам нужно ввести один и тот же код трижды. Вместо повторного написания одинакового кода, Вы можете воспользоваться методом с типом возврата. public string TVNAME()   {      Console.WriteLine("Enter Your TV Brand NAME");      YOURTVName = Console.ReadLine();      return YOURTVName;   }   • Метод со списком параметров: До сих пор Вы видели методы без параметров. Параметры используются для передачи некоторых данных методу, чтобы осуществить Ваш процесс как нельзя лучше. Например, Вы хотите перекрасить спальни. Вам нужно посоветоваться со всеми членами семьи, которые проживают с Вами в доме, по поводу цвета стен в спальнях. Вы можете задать имя пользователя и их любимый цвет в качестве параметра метода. public void BedRoom(String nameandColor)   {      Console.WriteLine(nameandColor);    }   Тот же самый метод с другими параметрами называется методом перегрузки. Пример метода Вы найдете ниже. Оба метода называются одинаково, но имеют разные параметры.  public void BedRoom(String MemberName,String Color)    {        Console.WriteLine(MemberName + " Like " + Color + "Color");    }   Пример законченного класса с основным методом: class ShanuHouseClass1   {       int NoofChair = 0;      public String YOURTVName;      private Boolean DoyouHaveTV = true;      public void veranda()       {           Console.WriteLine("Welcome to Veranda");           Console.WriteLine("How Many Chairs Do you have in your Veranda");           NoofChair = Convert.ToInt32(Console.ReadLine());           Console.WriteLine("I have total " + NoofChair + " Chairs in my Veranda");       }     public string TVNAME()       {           Console.WriteLine("Enter Your TV Brand NAME");           YOURTVName = Console.ReadLine();           return YOURTVName;       }     public void BedRoom(String nameandColor)       {           Console.WriteLine(nameandColor);                  }     public void BedRoom(String MemberName,String Color)       {           Console.WriteLine(MemberName + " Like " + Color + "Color");       }     static void Main(string[] args)       {           ShanuHouseClass1 objHouseOwner = new ShanuHouseClass1();          objHouseOwner.veranda();           String returnvalue = objHouseOwner.TVNAME();          Console.WriteLine("Your TV BRAND NAME IS: "+returnvalue);          objHouseOwner.BedRoom("My Name is Shanu I like Lavender color");          objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color");          objHouseOwner.BedRoom("SHANU", "Lavender");           Console.ReadLine();         }   }   5. Модификаторы доступа Модификаторы доступа не что иное, как использование и ограничение типа значений переменных, методов и класса. Это можно назвать пределом безопасности. Шесть основных модификаторов доступа: частный публичный внутренний защищенный внутренний защищенный Частный модификатор доступа. Вернемся к примеру с домом. Охранник может охранять Ваш дом. Его обязанность - охранять вход в дом. Он не может зайти в дом и получить доступ ко всем вещам. Вы создаете SecurityGuardClass и называете переменную и метод для Security частным. Общественный модификатор доступа. Владельцы дома считаются общественными по отношению к классу. Они могут получить доступ ко всем классам, связанным с домом. Нет никаких ограничений на доступ к дому. Защищенный модификатор доступа. Только основной класс и производные классы могут иметь доступ к защищенным значениям переменных и методам. Например, служащие и гости – пример защищенного доступа. Служащие могут войти в любую комнату, прибраться там. Тем не менее, они имеют ограниченный доступ к дому, так как они не могут отдохнуть в постели хозяина дома. Внутренний модификатор доступа. Предел значения переменной или метода доступа существует в рамках проекта. Предположим, что в Вашем проекте существует более одного класса, и Вы объявили переменную в качестве внутреннего доступа в один класс. Посмотрите пример программы для внутренней переменной. public class sampleInternalClass   {       internal String myInternal = "Iam Internal Variable";   }   class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       public void myFirstMethod()       {           Console.WriteLine("You Have total " + noOfTV + "no of TV :");           Console.WriteLine("Your TV Name is :" + yourTVName);         }       static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();           objHouseOwner.myFirstMethod();           sampleInternalClass intObj = new sampleInternalClass();          Console.WriteLine("Internal Variable Example :" + intObj.myInternal);           Console.ReadLine();       }   }   Внутренний модификатор защиты. Внутреннее защищенное значение переменной или метод имеет свои ограничения в рамках проекта класса или производного класса. Вот пример программы для внутренней защищенной переменной. В этом примере использован механизм наследования.  public class sampleProtectedInternalClass   {       protected internal String myprotectedInternal = "Iam Protected Internal Variable";       public void protectedInternalMethod()       {           Console.WriteLine("Protected Internal Variable Example :" + myprotectedInternal);       }   }   public class derivedClass : sampleProtectedInternalClass   {       public void derivedprotectedInternal()       {           Console.WriteLine("Derived Protected Internal Variable Example :" + myprotectedInternal);       }   }   class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       public void myFirstMethod()       {           Console.WriteLine("You Have total " + noOfTV + "no of TV :");           Console.WriteLine("Your TV Name is :" + yourTVName);          }      static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();           objHouseOwner.myFirstMethod();           sampleProtectedInternalClass intObj = new sampleProtectedInternalClass();          intObj.protectedInternalMethod();          derivedClass proIntObj = new derivedClass();           proIntObj.derivedprotectedInternal();           Console.ReadLine();       }   }   6. Инкапсуляция Инкапсуляция скрывает элементы или значения переменных за пределами класса. Вы помните, что охранник не имеет права заходить в дом, он не должен быть в курсе того, что происходит в доме. Таким образом, для большей безопасности владелец дома скроет все, что происходит внутри, от охранника. Скрытие и ограничение называют инкапсуляцией. Например, у Вас есть два класса: первый называется "Houseclass" и другой – "houseSecurityClass". Вы видите значения переменных, спрятанных в классе, где "houseSecurityClass" – общественный, а "Houseclass" может получить доступ, но "Houseclass" имеет как общественные, так и частные значения переменной, в которой частное значение переменной класса не может быть доступным за пределами класса. public class houseSecurityClass   {       public int noofSecurity;       public String SecurityName = String.Empty;   }   public class Houseclass   {       private int noofLockerinHosue = 2;       public string OwnerName = String.Empty;   }   7. Абстракция Абстракция показывает и делит общие данные с пользователем. Прислуга в доме может заходить во все комнаты и убираться там. Владелец дома может предоставить полные и частичные права слуге для доступа к его дому. Ниже приведен пример программы, в которой частные значения переменных и методов не согласуются со слугой, но общественная переменная и методы согласовываются. public class HouseServerntClass   {       private int SaftyLoackerKeyNo = 10001;       public String roomCleanInstructions = "Clean All rooms";           private void saftyNos()           {               Console.WriteLine("My SaftyLoackerKeyNo is" + SaftyLoackerKeyNo);           }        public void roomCleanInstruction()       {            Console.WriteLine(roomCleanInstructions);       }     }   8. Наследование Наследование (подражание) используется для повторного использования кода. В защищенном внутреннем модификаторе доступа Вы уже видели пример программы наследования. Подражание - это не что иное, как доступ и использование всех базовых классовых значений переменных и методов в производном классе. Подражание может быть любым из следующих. Single level Inheritance: пример с одним базовым классом и одним производным public class baseClass   {       private void privateMethod()       {           Console.WriteLine("private Method");       }     public void publicMethod()       {           Console.WriteLine("This Method Shared");       }   }   public class DerivedClass : baseClass   {       static void Main(string[] args)       {           DerivedClass obj = new DerivedClass();         obj.publicMethod();   Примечание: Базовый класс - высший класс, а производный класс - это класс (ы), который наследует базовый. Наследование, где базовый класс - "GuestVist", а производный класс - "HouseOwnerClass". В даном случае класс HouseOwnerClass наследует базовый класс GuestVist: class GuestVist   {       public void Guestwelcomemessage()       {           Console.WriteLine("Welcome to our Home");       }       public void GuestName()       {           Console.WriteLine("Guest name is: Shanu");       }   }    class HouseOwnerClass : GuestVist   {       static void Main(string[] args)       {           HouseOwnerClass obj = new HouseOwnerClass();           obj.Guestwelcomemessage();           obj.GuestName();           Console.ReadLine();       }   }   Многозначное Наследование: рассмотрим пример с более чем одним производным классом. Первый базовый класс происходит с DerivedClass1, а затем DerivedClass1 возникает с DerivedClass2. Теперь с DerivedClass2 Вы можете получить доступ и к BaseClass, и DerivedClass1. public class baseClass   {       private void privateMethod()       {           Console.WriteLine("private Method");       }   public void publicMethod()       {           Console.WriteLine("This Method Shared");       }   }   public class DerivedClass1 : baseClass   {       public void DerivedClass1()       {           Console.WriteLine("Derived Class 1");       }   }   public class DerivedClass2 : DerivedClass1   {       static void Main(string[] args)       {           DerivedClass2 obj = new DerivedClass2();           obj.publicMethod();           obj.DerivedClass1();       } }   Множественное наследование: Поддерживает ли .Net множественное наследование? Ответ на этот вопрос - нет. В C #  невозможно использовать множественное наследование класса. Что такое множественное наследование? Множественное наследование имеет только один класс, и Вы можете наследовать оба класса в производном классе. Что произойдет, если ввести множественное наследование класса, используя C #? Вернемся к примеру с домом. Производный класс "HouseOwnerClass" с двумя дополнительными классами "GuestVist" и "FriendsandRelationsClass". Теперь предположим, что в Ваш дом пришел гость и друг. Для этого Вы вводите предыдущие три класса и наследуете два класса из Вашего производного класса. Если ввести множественное наследование в C #, на экране отразится предупреждение "Ожидание интерфейса" во время процесса кодирования и выполнения программы. 9. Полиморфизм Приставка «поли» означает больше, чем одна форма. В начале статьи в разделе выбор метода Вы уже видели пример полиморфизма. То же имя метода с другим параметром и есть примером полиморфизма. В полиморфизме используетс метод перегрузки и замещения. Полиморфизм имеет два способа выполнения программы: полиморфизм времени компиляции (Compile Time Polymorphism) и времени работы полиморфизма (Run time Polymorphism). Метод перегрузки. Метод перегрузки – тот же метод, используемый для более чем одного метода с другими аргументами. На примере ниже Вы видите, что имя метода «BedRoom» использовалось для двух методов, но параметры для каждого из них разные. class HouseOwnerClass   {      public void BedRoom(String nameandColor)       {           Console.WriteLine(nameandColor);       }       public void BedRoom(String MemberName, String Color)       {           Console.WriteLine(MemberName + " Like " + Color + "Color");       }       static void Main(string[] args)       {           HouseOwnerClass objHouseOwner = new HouseOwnerClass();          objHouseOwner.BedRoom("My Name is Shanu I like Lavender color");           objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color");           objHouseOwner.BedRoom("SHANU", "Lavender");           Console.ReadLine();        }   }   Метод замещения. Разница между методом перезагрузки и замещения заключается в том, что при использовании метода перезагрузки Вы получите то же имя метода с другим аргументом. В методе замещения Вы получите то же имя метода, его параметры и тип, но метод замещения применим только к производным классам. Метод замещения не используется в одном и том же классе. Обратите внимание, как метод замещения можно использовать в абстрактном, виртуальном и недоступном методах. 10. Абстрактный класс/метод Абстрактный класс: у абстрактного класса ключевое слово abstract. abstract class GuestVist   {   }   Абстрактный класс – наивысший класс для всех классов. Объект не может получить доступ к абстрактному классу. Вы не сможете создать объект для абстрактного класса. Что произойдет, если попробовать создать объект для абстрактного класса? Пытаясь создать объект для абстрактного класса, на экране появится предупреждение об ошибке "экземпляр абстрактного класса не может быть создан". Что произойдет, если создать абстрактный метод, который не будет замещен в производном классе? На примере ниже показан абстрактный метод, который не замещен в производном классе. На экране высветилось предупреждение, которое гласит, что класс должен быть внедрен в абстрактный класс. Вы видите абстрактный класс, который имеет обычный метод и абстрактный метод. У абстрактных методов нет содержания в абстрактном классе, поэтому Вы можете только объявить абстрактный метод в абстрактном классе. Должен быть как минимум один абстрактный метод в абстрактном классе. abstract class GuestVist   {        public void Guestwelcomemessage()        {            Console.WriteLine("Welcome to our AbstractHome");        }        public void GuestName()        {            Console.WriteLine("Guest name is: Abstract");        }        public abstract void purposeofVisit();     }   public class Houseclass : GuestVist   {        static void Main(string[] args)        {            Houseclass objHouse = new Houseclass();            objHouse.Guestwelcomemessage();        }      public override void purposeofVisit()        {            Console.WriteLine("Abstract just came for a Meetup and spend some time ");        }   }   11. Виртуальный класс/метод Виртуальный метод полезен для современного программирования. Что такое виртуальный метод и какая от него польза? Например, гость говорит, что сегодня еще 5 человек посетят Ваш дом. Для этого Вы пишете функцию для отображения сообщения, поскольку пять гостей посетят Ваш дом. После визита, Вы видите, что в общей сложности Ваш дом посетило 20 человек. Цифра может быть больше или меньше заявленной. В таком случае, у гостей будет свой отдельный класс, и дом станет этим отдельным классом. Разница между абстрактным и виртуальным методами Оба метода используют ключевое слово override. Абстрактный метод может использоваться только в абстрактном классе. Это значит, что в абстрактном методе абстрактного класса нет основы. А в виртуальном методе есть. На примере ниже показан абстрактный и виртуальный метод. В абстрактном классе, виртуальный метод отмечает пять гостей, но в программе производного класса количество было изменено на 20 гостей. Какой же будет результат в виртуальном методе? 5 или 20 гостей?  abstract class GuestVist   {       public abstract void purposeofVisit();  // Abstract Method       public virtual void NoofGuestwillvisit()  // Virtual Method       {           Console.WriteLine("Total 5 Guest will Visit your Home");       }   }   class AbstractHouseClass : GuestVist   {       public override void purposeofVisit()  // Abstract method Override       {           Console.WriteLine("Abstract just for a Meetup and spend some time ");       }   public override void NoofGuestwillvisit() // Virtual method override       {           Console.WriteLine("Total 20 Guest Visited our Home");       }     static void Main(string[] args)       {           AbstractHouseClass objHouse = new AbstractHouseClass();          objHouse.purposeofVisit();           objHouse.NoofGuestwillvisit();           Console.ReadLine();       }   }   Завершенная программа abstract class GuestVist   {       public void Guestwelcomemessage()       {           Console.WriteLine("Welcome to our AbstractHome");       }       public void GuestName()       {           Console.WriteLine("Guest name is: Abstract");       }       public abstract void purposeofVisit();  // Abstract Method        public virtual void NoofGuestwillvisit()  // Virtual Method     {           Console.WriteLine("Total 5 Guest will Visit your Home");       }   }   class AbstractHouseClass : GuestVist   {       public override void purposeofVisit()  // Abstract method Override       {           Console.WriteLine("Abstract just for a Meetup and spend some time ");       }     public override void NoofGuestwillvisit() // Virtual method override       {           Console.WriteLine("Total 20 Guest Visited our Home");       }     static void Main(string[] args)       {           AbstractHouseClass objHouse = new AbstractHouseClass();           objHouse.Guestwelcomemessage();           objHouse.purposeofVisit();           objHouse.NoofGuestwillvisit();           Console.ReadLine();       }   }   12. Недоступный класс/метод Недоступный класс: этот класс не может быть унаследован другими классами. Например, у владельца дома есть потайная комната, возможно, кабинет. Владелец не хочет, чтобы посторонние имели доступ к его кабинету. В таких случаях будет полезен недоступный класс. Недоступный класс вводится с помощью ключевого слова Sealed. Если класс объявлен Sealed, он не может быть унаследован другими производными классами.  Что произойдет, если Вы унаследуете надоступный класс в производном классе? Рассмотрим пример ниже. Вы видите пример программы недоступного класса. public sealed class OwnerofficialRoom   {       public void AllMyPersonalItems()       {           Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");       }   }   class HouseSealedClass    {       static void Main(string[] args)       {           OwnerofficialRoom obj = new OwnerofficialRoom();           obj.AllMyPersonalItems();           Console.ReadLine();       }   }   Недоступный метод: Если Вы объявили метод недоступным, то нельзя заместить определенный метод в производном классе. Давайте посмотрим Ваш класс дома, где есть базовый класс с виртуальным методом и виртуальным недоступным методом. Виртуальный метод может быть замещен в производном классе. Но виртуальный недоступный метод нельзя заместить в недоступном классе. public class OwnerOfficialroomwithrestriction   {       public virtual void message()       {           Console.WriteLine("Every one belongs to this house can access my items in my room except my sealed Item");      }       public virtual sealed void myAccountsLoocker()       {           Console.WriteLine("This Loocker can not be inherited by other classes");       }   }   class HouseSealedClass : OwnerOfficialroomwithrestriction   {       public override void message()       {           Console.WriteLine("overrided in the derived class");       }       public override void myAccountsLoocker()       {           Console.WriteLine("The sealed method Overrides");       }   }   13. Статический класс/метод Статический класс и недоступный класс нельзя унаследовать. Разница между статическим и недоступным классами Можно создать объект (пример) недоступного класса. В секции недоступного класса создать образец недоступного класса, а в главном методе создать объект для доступа к недоступному классу. В недоступном классе можно прописать статические и нестатические методы. А для статического класса создать объект нельзя. В статическом классе допускаются только статические члены. То есть, в статическом классе нельзя прописать нестатические методы. В принципе, основной метод – пример статического метода. Когда Вы создадите консольное приложение в C #, увидите, что каждый класс имеет основной метод по умолчанию. Когда консоль или приложение Windows начинают выполняться, первым выполняется основной метод. Нет необходимости создавать объект основного метода, так как он был объявлен, как статический метод. В статическом классе память выделяется для всех статических переменных и методов во время выполнения, но для нестатических значений переменных и методов память выделяется только тогда, когда создается объект класса. Что произойдет, если ввести нестатических метод в статический класс? Вы увидите сообщение об ошибке: "Не удается создать экземпляр статического класса". Как вызвать статический класс метода и значение переменной, не создавая объект. Очень просто. Можно использовать "ClassName.Variable или Method Name", например, "OwnerofficialRoom.AllMyPersonalItems ();" Смотрите следующий пример со статическим классом: public static class OwnerofficialRoom   {       public static void AllMyPersonalItems()       {           Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");       }   }   class HouseStaticClass    {       static void Main(string[] args)       {           OwnerofficialRoom.AllMyPersonalItems();           Console.ReadLine();       }   }   Результат предыдущей программы показан ниже: Можно ли создать статический метод в нестатическом классе? Да, можно создать статический метод в нестатическом классе. Нет необходимости создавать объект для доступа статического метода (ов) в нестатическом классе. Можно непосредственно использовать имя класса для доступа к статическому методу. Пример статического метода в нестатическом классе. public  class OwnerofficialRoom   {       public static void AllMyPersonalItems()       {           Console.WriteLine("No need to create object for me just use my class name to access me :)");       }      public void non_staticMethod()       {           Console.WriteLine("You need to create an Object to Access Me :(");       }   }   class StaticmethodClass   {       static void Main(string[] args)       {           OwnerofficialRoom.AllMyPersonalItems();           OwnerofficialRoom obj = new OwnerofficialRoom();           obj.non_staticMethod();           Console.ReadLine();       }   }   14. Интерфейс Интерфейс похож на абстрактный класс, но в интерфейсе существует только имя метода. Однако, в абстрактном классе можно иметь метод объявления и определения. Методы интерфейса должны быть реализованы в  примененном классе. Смотрите следующий пример программы для интерфейса. Все методы интерфейса были реализованы в классе. Как уже было отмечено, С # не поддерживает множественное наследование. Чтобы получить множественное наследование, можно использовать интерфейс. Следующая программа – пример множественного наследования с использованием интерфейса. interface GuestInterface   {       void GuestWelcomeMessage();       void NoofGuestes();   }   interface FriendsandRelationsInterface   {       void friendwelcomemessage();       void FriendName();   }   class HouseOwnerClass : GuestInterface, FriendsandRelationsInterface   {       public void GuestWelcomeMessage()       {           Console.WriteLine("All guests are well come to our home");       }     public void NoofGuestes()       {           Console.WriteLine("Total 15 Guestes has visited");       }     public void friendwelcomemessage()       {           Console.WriteLine("Welcome to our Home");       }       public void FriendName()       {           Console.WriteLine("Friend  name is: Afraz");       }       static void Main(string[] args)       {           HouseOwnerClass obj = new HouseOwnerClass();           obj.GuestWelcomeMessage();           obj.NoofGuestes();           obj.friendwelcomemessage();           obj.FriendName();           Console.ReadLine();       }   }   Иногда необходимо иметь определенные методы, которые будут использоваться во многих производных классах. Каждый производный класс может выполнять различные функции для этих методов. В таких случаях можно использовать интерфейс. Проведем аналогию с гостями, которые посещают Ваш дом. Предположим, для гостей разослали два типа сообщений: "Добро пожаловать" и "Вход для гостей запрещен". Функции являются общими, но разнятся для каждого владельца в одном и том же доме. Гость может быть гостем отца, матери, детей или всей семьи. У каждого гостя свое сообщение-приглашение, но функции те же, что в сообщении. Отец – это класс, мать – класс и дети – один класс. Оба сообщения для гостей «Добро пожаловать» и «Вход для гостей запрещен" – одинаковы для всех. В этом случае, можно создать интерфейс и объявить оба метода в интерфейсе. Классы отца, матери и детей могут наследовать интерфейс и вводить собственные детали метода. Интерфейс похож на абстрактный класс, но главное отличие между абстрактным классом и интерфейсом в том, что в абстрактном классе есть абстрактный и неабстрактный методы. Но по умолчанию в интерфейсе все методы являются абстрактными. Поэтому в интерфейсе нет неабстрактного метода. Все методы, объявленные в интерфейсе, должны быть замещены в производном классе. Что произойдет, если объявить неабстрактные методы в интерфейсе? Вы увидете предупреждение "неожиданный модификатор" в модификаторе доступа и "неожиданное содержание метода" в тексте сообщения. Пример программы для интерфейса: interface GuestInterface   {       void GuestWelcomeMessage();       void NoofGuestes();         }   class HouseOwnerClass: GuestInterface   {       public  void GuestWelcomeMessage()       {           Console.WriteLine("All guests are well come to our home");       }       public  void NoofGuestes()       {           Console.WriteLine("Total 15 Guestes has visited");       }       static void Main(string[] args)       {           HouseOwnerClass obj = new HouseOwnerClass();           obj.GuestWelcomeMessage();           obj.NoofGuestes();           Console.ReadLine();       }   }   Источник: http://www.c-sharpcorner.com/UploadFile/asmabegam/basic-concept-of-oop-in-C-Sharp/
Notification success