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

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

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

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

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

Результати пошуку за запитом: принцип открытости*
Вивчай Scala безкоштовно

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

С 27 февраля по 4 марта 2020 года на ITVDN проходит акция - вы можете пройти обучение по курсу Scala Starter бесплатно! Что такое Scala? Scala — язык программирования, разработанный для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности  функционального и объектно-ориентированного программирования. Scala-программы во многом похожи на Java-программы, и могут свободно взаимодействовать с Java-кодом. О курсе Автор: Анна Атланова, Scala Developer Курс Scala Starter  - это изучение изучение основ программирования на Scala c нуля. На данном курсе учащиеся настроят среду разработки, напишут первую программу, получат знания об основах программирования. После прохождения курса Вы будете понимать принципы работы основных конструкций языка Scala, научитесь применять на практике условные выражения, логические операции, циклы, функции, массивы. Программа курса: Знакомство с языком Scala. Запуск первой программы. Основы Scala на примере первой программы. Условные конструкции. Логические операции. Циклические конструкции. Функции. Работа с массивами. Кортежи. Для кого этот курс Этот курс предназначен для тех, кто ранее никогда не программировал или поверхностно знаком с языком Java. Курс входит в комплексную программу обучения по специальности Java Developer. Как получить Сертификат по курсу Scala Starter После каждого урока Вы сможете проходить онлайн тестирование, чтобы проверить, как усвоен материал, а после завершения курса пройти финальный тест, и, если Ваш результат будет выше 70%, Вы получите электронный сертификат, подтверждающий Ваши знания. Сроки акции Акция проходит с 27февраля по 4 марта 2020 года. Доступ к курсу открывается на 10 дней. Изучайте программирование на ITVDN!
Створення API REST на Fastify.

Автор: Борщовецький Вадим

<p>Этот вебинар посвящен созданию полноценного масштабируемого REST API приложения с применением веб-фреймворка для Node.js - Fastify.<br> <br> <strong>В каких случаях вам понадобится именно Fastify?</strong></p> <ul> <li>Если вы хотите быстрое REST API.</li> <li>Если вам нужен полный контроль над тем, какой запрос принимает сервер и какой ответ он отдаёт.</li> <li>Если вам нужна легкая масштабируемость.</li> </ul> <p><strong>REST</strong> - широко известный архитектурный стиль, который содержит определенные принципы организации взаимодействия приложения либо сайта с сервером через протокол HTTP.&nbsp;<br> <strong>API </strong>- это прикладной программный интерфейс; он указывает, каким образом следует обращаться к программе и какие ответы она обязана предоставлять пользователям.&nbsp;<br> <br> <strong>На вебинаре вы узнаете, как:&nbsp;</strong></p> <ul> <li>Писать код чище и качественнее&nbsp;</li> <li>Минимизировать количество повторяющегося кода</li> <li>Работать с крутой JavaScript-библиотекой Lodash&nbsp;</li> </ul> <p><strong>План вебинара:</strong></p> <ul> <li>Почему Fastify?</li> <li>Знакомство со схемами запросов/ответов</li> <li>Знакомство с Lodash</li> <li>Создание полноценного REST API</li> </ul> <p><strong>Целевая аудитория:</strong><br> Данный вебинар будет интересен как новичкам в Node.js, так и опытным разработчикам, которые хотят научиться писать быстрый, масштабируемый и легко читаемый API сервер.<br> <br> <strong>Минимальные требования:</strong><br> Элементарные знания JavaScript, установленный и готовый к работе Node.js, любой удобный текстовый редактор (WebStorm, VS Code либо другой).</p>
Архітектура Flask додатків.

Автор: Ксенія Крементар

<p>Вебинар раскрывает основные принципы построения web-приложений на базе Python фреймворка Flask, попутно затрагивает вопросы особенностей фреймворка, и конечно же содержит практическую часть для лучшего пояснения и закрепления материала.</p> <p style="margin-left:13.0pt;"><strong>План вебинара:</strong></p> <p>1) Определимся с терминами, что же мы сегодня изучаем?</p> <ul> <li>что такое архитектура приложений?</li> <li>что значит &mdash; pythonic и как понять, является ли код pythonic?</li> <li>что такое web разработка и как в этом поможет Flask?</li> </ul> <p>2) Особенности Flask фреймворка</p> <ul> <li>Flask - минималистичный, расширяемый</li> <li>Flask и Django: в чем разница?</li> <li>Особенности построения Flask приложений</li> <li>Flask приложение в одном файле</li> </ul> <p>3) Практическая часть</p> <ul> <li>Постановка задачи</li> <li>Архитектура приложения (структура модулей, пакет controllers)</li> <li>Дальнейшие перспективы развития сервиса и приложения</li> <li>Must install &amp; use</li> </ul> <p>4) Резюме</p> <p><strong>Целевая аудитория:</strong></p> <p>Данный вебинар будет интересен начинающим Python разработчикам, которые хотят научиться создавать простые и эффективные приложения, web-разработчикам, которые хотят систематизировать свои знания по разработке web-сервисов на Python, а также всем, кто уже создает приложения на базе Flask и хочет получить новый опыт.</p>
Розробка графічного інтерфейсу на QML

Автор: Руслан Ларіоненко

<p>В вебинаре будут рассмотрены инструменты библиотеки Qt для создания графического интерфейса с использованием декларативного языка для описания графического интерфейса QML. Вы узнаете основные концепции языка QML, а также ознакомитесь со стандартной библиотекой элементов графического интерфейса Qt Quick. Кроме этого, будет рассмотрено взаимодействие интерфейса написанного с использованием языка QML и приложения на языке С++.</p> <p><strong>Программа вебинара:</strong></p> <ol> <li>Что такое QML.</li> <li>Основные концепции QML. <ol> <li>Компоненты.</li> <li>QtObject.</li> <li>Связывания.</li> <li>Подключения.</li> <li>Таймеры.</li> </ol> </li> <li>Стандартная библиотека элементов Qt Quick. <ol> <li>Базовые визуальные элементы.</li> <li>Обработка ввода пользователя.</li> <li>Комплексные визуальные элементы.</li> <li>Анимации.</li> <li>Работа с текстом.</li> <li>Размещение элементов.</li> <li>Стили и темы.</li> </ol> </li> <li>Использование JavaScript в QML.</li> <li>Работа с мультимедиа.</li> <li>Мобильные устройства.</li> <li>Взаимодействие с C++ кодом.</li> <li>Концепция модель-отображение в QML.</li> <li>Практика. <ol> <li>Создание простого видео-проигрывателя.</li> <li>Демонстрация взаимодействия с C++ кодом и использования концепции модель-отображение на примере сетевого приложения для обмена сообщениями.</li> </ol> </li> </ol> <p>&nbsp;</p> <p><strong>Целевая аудитория:</strong></p> <p>Разработчики, которые имеют общие представления о фреймворке Qt и хотят ознакомиться с декларативным языком QML и библиотекой Qt Quick и понять принципы взаимодействия графического интерфейса на QML с Qt приложения на языке С++.</p>
Що таке патерни проєктування у програмуванні

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

Що таке патерн (шаблон) проєктування. Коли використовують шаблони. Якими бувають патерни проєктування. Породжуючі. Структурні. Патерни поведінки. Як обрати шаблон? Висновки. Програмісти-початківці завжди приходять до точки, коли їхній код перетворюється на “спагеті”. Його важко читати, він містить масу самоповторень, зайвих функцій, а додавання нового функціоналу перетворюється на десяте коло пекла. Один із найкращих засобів запобігання цьому – використовувати патерни проєктування (Design Patterns). Чи є це срібною кулею, які переваги та недоліки патернів існують, і які з них необхідно знати розробникам? Відповіді розбираємо нижче. Що таке патерн (шаблон) проєктування? Патерни – це типові архітектурні рішення проблем, котрі часто зустрічаються під час розроблення ПЗ. Їхня інша назва – шаблони, і що цікаво – людство дуже часто оточує себе шаблонами у повсякденному житті: однакові гнізда розетки та форми вилок у приміщеннях – універсальне рішення для електроживлення; виделки та ложки – інструменти споживання майже будь-якої їжі; чашки – ємності для розміщення будь-якої рідини і так далі. Людина завжди прагне спростити традиційну діяльність, і це не могло обійти стороною програмування. Ідеї створення універсальних правил для якісної розробки існували ще до 90-х років минулого століття, але дійсно проривною стала праця "Design Patterns: Elements of Reusable Object-Oriented Software" (1994) авторства Еріха Ґамма, Річарда Гелма, Ральфа Джонсона та Джона Вліссідеса, які іменують себе як "Банда чотирьох" (Gang of Four, GoF). У книзі описано 23 патерна та їхнє застосування в об'єктно-орієнтованому дизайні. Ця праця стала фундаментальною і тепер патерни gof складають кістяк багатьох обговорень якісного коду. Коли використовують патерни В розробці шаблони використовують при необхідності приведення коду до наступних критеріїв: Читабельність – інші розробники мають без складнощів розуміти написане. Масштабованість – легкість у створенні нового функціоналу. Підтримуваність – оновлення кодової бази має проходити якомога плавніше. Також вони здатні підвищити швидкість і продуктивність розробника – патерни це дійсно дозволяють. Вони гарно справляються і з наступними задачами: зменшення кількості потенційних помилок та вузьких місць; спрощення рефакторингу; зменшення технічного боргу; покращення комунікації девелоперів з іншими програмістами, проєктними менеджерами, власниками тощо. Необхідність використати шаблони проектування зростає разом зі збільшенням кодової бази, особливо при комерційному розробленні – коли створюване ПЗ має приносити прибуток. Важливо пам’ятати, що використання патернів інколи є геть недоречним. Подекуди воно може значно ускладнити читабельність, громіздкість і масштабованість коду. Наприклад, нескладний функціонал, який нечасто використовується і займає мало місця в коді, не потребує pattern-втручання. А от репетативний код, що вирішує класичні задачі (сортування, перебір даних тощо) – ідеальний претендент на застосування шаблону. Аби не помилитися спершу з’ясуйте контекст вашої проблеми, а вже потім обирайте патерни програмування, які найкраще задовольняють вимогам. Якими бувають патерни проєктування У своїй книзі GoF виділяють три великі сімейства: Сімейство Короткий опис Породжуючі патерни або Creational Patterns Надають найкращі способи створення об'єктів. Вони абстрагуються від процесу конкретизації і роблять вашу систему незалежною від створення, компонування та представлення її об'єктів. Популярні приклади: “Абстрактна фабрика” (Abstract Factory), “Одинак” / “Одиночка” (Singleton), “Прототип” (Prototype), “Фабричний метод” (Factory Method). Структурні патерни або Structural Patterns Фокусуються на композиції об’єкту. Допомагають переконатися в тому, що зміна частини системи не потягне за собою необхідність змін в інших її складових. Популярні приклади: “Проксі” (Proxy), “Адаптер” (Adapter), “Компонувальник” (Composite), “Фасад” (Facade). Патерни поведінки або Behavioral Patterns Зона відповідальності – алгоритми та обмін інформацією між об’єктами. Популярні приклади: “Відвідувач” (Visitor), “Ітератор” (Iterator), “Ланцюжок обов’язків” (Chain of Responsibility), “Стратегія” (Strategy). Розглянемо більш детально деякі з них. Породжуючі Породжуючі патерни – це надійні помічники у створенні об’єктів таким чином, аби в майбутньому з ними було максимально легко працювати. Дамо короткий опис деяких шаблонів: Патерн Одинак / Сінглтон забезпечує наявність лише одного екземпляру класу з глобальною точкою доступу. Singleton поширений в задачах конфігурацій або логування в застосунках, де потрібен єдиний контрольований доступ. Шаблон Прототип дозволяє створювати нові об'єкти шляхом копіювання існуючих екземплярів. Використовується Prototype в ситуаціях, коли створення об'єкта надто дороге, наприклад, при клонуванні складних або ресурсоємних об'єктів. Фабричний метод визначає інтерфейс для створення об'єктів, але дозволяє підкласам самостійно визначати тип створюваних об'єктів. Fabric Method корисний у багатофункціональних застосунках, де класи повинні мати можливість вибирати тип об'єктів, наприклад, при роботі з різними форматами документів, системами онлайн платежів тощо. Абстрактна фабрика визначає інтерфейс для створення сімейств пов'язаних об'єктів без вказівки їх конкретних класів. Використовують Abstract Factory для створення різних компонентів інтерфейсу користувача, які повинні працювати разом і забезпечувати єдиний стиль (світла / темна тема вебсайту тощо). Розглянемо приклад на патерні Singleton. Уявіть собі просту програму – музичний плеєр. Він дозволяє користувачам відтворювати музичні файли. Однак водночас має працювати лише один екземпляр плеєра – можливість відкриття декількох одночасно повинна бути недоступна. Цього можна досягти за допомогою шаблону Singleton. Простий приклад коду мовою C#: public class MusicPlayer {             private static MusicPlayer _instance;             private MusicPlayer()             {              // Ініціалізуємо музичний плеєр (наприклад, завантажуємо плейлисти)             }             public static MusicPlayer Instance             {             get             {             if (_instance == null)             {                        _instance = new MusicPlayer();             }             return _instance;             }             }             public void PlaySong(string songPath)             {             // Запустити пісню             }             public void PauseSong()             {             // Поставити на паузу             }             public void StopSong()             {             // Зупинити відтворення пісні             } } // Отримуємо екземпляр MusicPlayer MusicPlayer player = MusicPlayer.Instance; // Використовуємо функціонал MusicPlayer player.PlaySong("C:\\Users\\yourUsername\\Music\\mySong.mp3"); player.PauseSong(); player.StopSong(); Щоразу як в різних ділянках проєкту вам треба буде створювати екземпляр плеєру для відповідної взаємодії, ви завжди працюватимете лише з одним і тим самим екземпляром, уникаючи дублікації. Якщо ви програмуєте мовою сі шарп, детально розібрати популярні патерни проєктування C# з прикладами ви можете за посиланням. Структурні З короткого опису в таблиці легко дійти висновку, що структурні патерни дозволяють сформувати надійну, масштабовану та підтримувану архітектуру проєкту. Коротке знайомство: Проксі забезпечує об'єкт-посередник для контролю доступу до іншого об'єкта. Зазвичай шаблон Proxy використовують для реалізації “лінивого” завантаження, коли об'єкт створюється або ініціалізується лише при зверненні до нього (наприклад, завантаження картинок з високою роздільною здатністю). Адаптер дозволяє об'єктам з несумісними інтерфейсами працювати разом. Застосовується патерн Adapter для інтеграції нових компонентів в існуючу систему без зміни її коду. Підходить для використання нової бібліотеки у старому застосунку. Компонувальник використовується для ієрархічного компонування об'єктів для подальшої роботи з ними як з єдиним об'єктом. Використовується для створення деревоподібних структур, як-от файлові системи або GUI, де кожен вузол може бути як простим, так і Composite об'єктом. Фасад (Facade) надає спрощений інтерфейс для взаємодії зі складною системою або набором класів. Він зменшує складність роботи з підсистемами і надає користувачам єдиний вхідний інтерфейс для виконання рутинних операцій. Вивчити саме структурні патерни проєктування C# (з прикладами) ви можете за посиланням. Поведінкові Патерни поведінки в першу чергу визначають зв’язки між об’єктами і те, як вони здійснюють обмін інформацією. Наприклад: Патерн Відвідувач (Visitor) дозволяє додавати нові операції до об'єктів без зміни їхніх оригінальних класів. Використовується для взаємодії з об’єктами зі складною структурою, коли внесення додаткової логіки в оригінальні класи невиправдано ускладнює код. Ітератор / Iterator надає зручний механізм послідовного та простого доступу до елементів колекції, незважаючи на складність її побудови. Даний патерн поведінки популярний при обході елементів контейнерів, як-от списки або масиви – він надає універсальний інтерфейс для різних типів колекцій. Ланцюжок обов’язків або ж патерн Chain of Responsibility дозволяє передавати запит ланцюжком обробників, поки один з них не обробить запит. Незамінний при обробці запитів на сервері, де кожен обробник може передати запит наступному обробнику в ланцюжку: перевірка при авторизації на сайті, оброблення подій у GUI тощо. Для входу в патерни проєктування книга від Gang of Four буде гарною точкою відліку. Ви познайомитеся з класикою та академічним розкриттям теми, використовуючи патерни gof. Якщо ж ви хочете збагатити свої знання шаблонів, але віддаєте перевагу мові Java, рекомендуємо відео курс “Патерни проектування Java”. Як обрати патерн? Спочатку ви маєте проаналізувати задачу – для більшої зрозумілості виконайте її декомпозицію, розбивши на декілька складових. При цьому використовуйте системний підхід: прорахуйте, як ваше рішення вплине на весь проєкт, які елементи воно зачепить зараз, і який вплив воно матиме на додавання нового коду. Якщо ви вже працюєте в ІТ-компанії, ваші колеги, тімлід або архітектор можуть підказати вам доцільність використання того чи іншого патерну, розкрити нюанси вже існуючої архітектури, кодового стилю та багато іншого. Лише після ретельного аналізу можна переходити до підбору шаблону, зважаючи на усі переваги та недоліки. До речі, в цих задачах гарними помічниками будуть безкоштовні AI-асистенти на кшталт ChatGPT, Gemini та ін. Також не забувайте про використання інших методик покращення кодової читабельності, масштабування й чистоти: SOLID принципи – вони регламентують 5 основних засад створення структурованого, якісного коду. Нещодавно ми проводили вебінар, на якому розбирали кожен принцип в деталях, запрошуємо до перегляду! А якщо вас цікавить прикладний характер SOLID принципів на Java, можете пройти даний відео курс. GRASP (General Responsibility Assignment Software Patterns) – патерни для об’єктно-орієнтованого проєктування. Вони не мають вираженої структури і носять більш абстрактний характер, аніж патерни gof. DRY (Don’t Repeat Yourself) – головна ідея даного принципу полягає у створенні коду, який не матиме дублікацій в проєкті. KISS (Keep It Simple, Stupid) – регламентує написання якомога простішого коду, аби його можна було легко читати і розуміти. Рефакторинг – повернення до вже написаного коду з метою його покращення без зміни функціональності. Інші техніки, що залежать від проєктів. Висновки Патерни грають ключову роль в сучасному розробленні. Вони акумулюють в собі найкращі практики створення кодової бази таким чином, аби досягнути максимальної легкості та ефективності розроблення, особливо на великих проєктах. Звісно, не завжди їхнє використання є доречним – потрібно аналізувати задачі і продумувати наслідки застосування того чи іншого шаблону, аби не отримати величезну валізу без ручки. Розвивайте вашу експертизу в області патернів – це win-win стратегія. З одного боку перед працедавцями ви постанете як досвідчений та висококваліфікований спеціаліст, а з іншого – ваші програмні рішення матимуть елегантний характер і відзначатимуться легкістю в читанні, підтримці та масштабуванні. Чи використовуєте ви патерни в своїй розробницькій діяльності? Можливо, тільки вивчаєте? Залишайте в коментарях ваші відповіді!
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. Детально описать дизайн программного компонента, например, системы голосования; учесть при этом высокую нагрузку и сделать ее расширяемой и отказоустойчивой.   Выражаем благодарность за участие в статье Александру Жакуну, Ярославу Пушко, Назару Семенишину, Сергею Подоброму, Владимиру Кочуну, Владимиру Новикову, Сергею Кривоносу, Марку Цирульнику, Кириллу Пшеничному, Виктору Шуму, Сергею Братусю.    
Яким має бути успішний QA у 2026 році?

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

Ринок тестування програмного забезпечення остаточно перестав бути «легким входом в IT». У 2026 році прірва між пересічним тестувальником і справжнім QA-інженером стала як ніколи глибокою. Базуючись на досвіді Олекси Мащиця ми виділили ключові вектори розвитку, які визначають успіх у професії сьогодні. Олекса Мащиць - QA-інженер із 13+ роками досвіду. Спеціалізація — великі Enterprise-проєкти зі складною бізнес-логікою. Засновник спільноти «QA Україна» та автор освітніх програм. Олекса також є організатором найбільшої в Україні онлайн конференції тестувальників «Бетльгейзе». 1. Криза «поверхневого тестування» та повернення до витоків Час, коли достатньо було бути просто «адвокатом користувача» і перевіряти лише інтерфейс, минув. Сьогодні компаніям потрібні люди, які розуміють архітектуру системи. «Зараз багато фахівців, поки працюють в компанії, здаються затребуваними. Але як тільки виходять на ринок — виявляється, що вони застрягли в старих процесах.  Вимоги ринку зростають, точніше — стає все менше вакансій з низькими вимогами.Раніше був образ тестувальника «адвоката користувача», який не дуже технічний. Зараз усе зсувається в бік того, що вас будуть цінувати, чим більше ви технічний фахівець. Навіть без досвіду: якщо ви випускник Computer Science — вас заберуть одразу на хороші гроші. Чим більше ви наближаєтесь до рівня інженера зі знаннями фундаментальних наук, тим більше вас хочуть.». Фундаментальні знання (робота мереж, баз даних, пам'яті комп'ютера) роблять «чорну скриньку» продукту прозорою. Це дозволяє бачити тестові області, які закриті для тих, хто не має технічної бази. 2. Від симптомів до причин: Робота з Root Cause Успішний QA у 2026 році — це детектив, який не просто фіксує помилку, а намагається знайти її корінь. Це критично для складних Enterprise-проєктів, де кожна хвилина розробника коштує дорого. «Розробникам було б класно, щоб ми наближалися до причини... Якщо ми видаємо чотири різні баги за один, розробник відволікається кожного разу, відкриває їх і приходить до висновку, що це одна й та сама причина. Це відриває нас від розробників, вони кажуть: "Він взагалі нічого не шарить"». Якщо ви знаходите кілька багів в одній тестовій області, не поспішайте створювати десяток звітів. Проаналізуйте їх — можливо, це різні прояви однієї архітектурної помилки. 3. Пастка штучного інтелекту для новачків AI став стандартом індустрії, але важливо не допускати надмірного захоплення інструментами без розуміння суті процесу. Для початківця AI може стати не помічником, а перешкодою для професійного росту, створюючи ілюзію знань. «Використання мовної моделі має стати для вас рутиною. Але уважно: не може бути рутиною те, чого ви не знаєте... Якщо ви не писали тест-кейси і не знаєте, як вони створюються, як ви можете перевірити те, що видав ChatGPT?» У 2026 році цінується не вміння писати промпти, а здатність брати на себе відповідальність за покриття та якість, яку жодна мовна модель гарантувати не може. 4. Майндсет і софт-скіли: Робоча етика замість «токсичності» Обговорення софт-скілів часто стає надто розмитим. Натомість варто фокусуватися на конкретних принципах взаємодії та етиці професійної поведінки. «Я до софт-скілів ставлюся критично... Їх зробили вульгарними і почали використовувати як палицю: "Ти некритично мислиш, у тебе немає софт-скілів". Я окремо виділяю робочу етику: як ми спілкуємося, чи з повагою, чи розуміємо ми емпатію не як інструкцію, а як реакцію на людину». Софт-скіли суб'єктивні. Успіх полягає в тому, щоб інтегруватися в культуру конкретної команди. Хтось шукає зосереджених одинаків для глибоких технічних задач, а хтось — активних комунікаторів для живого Scrum. 5. Освітній шлях: Як не «законсервуватися»? Комфорт і висока зарплата на початкових етапах можуть стати пасткою, яка зупиняє розвиток фахівця на роки. «Перші шість років я мав би краще розвинутися, але я там "законсервувався", тому що мені було комфортно по грошах... Не бійтеся вчитися. Якщо ви відчуваєте, що проект простий і ви не ростете — це ризик». Рекомендації для професійного зростання: Підручники з інформатики: Для розуміння фундаментальних принципів обробки даних та архітектури ПК. Основи програмування: Без розуміння функцій, змінних та операцій неможливо професійно тестувати сучасний складний софт. "Практичний посібник по дизайну тестів" Лі Коупленда. Класика тест-дизайну. «Якщо цей код на початку книги вам страшний — значить, вам не вистачає фундаментальних знань». Формула успіху Для тих, хто хоче не просто «увійти в IT», а стати затребуваним інженером, існує проста формула: «Знайдіть у собі хоча б 10-20% любові до професії. Ви не можете з нулем любові розвиватися. Якщо ви дійсно щось любите, ви починаєте автоматично притягувати інформацію. І будьте готові інвестувати час: мінімум 2 години на день щодня впродовж року — це поріг для формування експерта». У 2026 році виграє той, хто має міцний інженерний фундамент і не боїться визнавати свої прогалини в знаннях, постійно їх заповнюючи. Матеріал підготовлено на основі вебінару «Успішний QA-інженер 2026: Ключові навички та вимоги до тестувальників ПЗ».
250+ питань з Java для Junior, Middle, Senior

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

Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 1 февраля 2021 года. Оригинальная версия на украинском языке доступна по ссылке Редакция DOU.ua обратилась к СТО и опытным специалистам, которые проводят интервью  по направлению Java, о том, какие теоретические вопросы задают и какие задачи и задания предлагают решить кандидатам. Ведь, готовясь к техническому собеседованию, важно иметь четкий план. На основе полученных ответов составлена эта подборка вопросов с градацией по уровню специалиста. Надеемся, этот список вопросов станет своеобразным путеводителем, который поможет получить желаемую должность. Junior Общие 1. Какие знаете шаблоны проектирования? Расскажите о двух шаблонах, которые использовали в работе.   Java Core 2. Какие есть типы данных в Java? 3. Чем отличается объект от примитивных типов данных? 4. В чем разница передачи параметров по ссылке и по значению? 5. Что такое JVM, JDK, JRE? 6. Зачем используют JVM? 7. Что такое bytecode? 8. Какие признаки JavaBean? 9. Что такое OutOfMemoryError? 10. Что такое стектрейс? Как его получить? 11. Назовите все методы класса object. 12. В чем отличие между try-with-resources и try-catch-finally при работе с ресурсами? 13. Что такое конструкторы? Какие типы знаете? 14. Что такое побитовые операции? 15. Объекты каких стандартных классов immutable в Java? 16. Дайте краткую характеристику immutable object. Зачем они нужны? 17. Как создать immutable object? 18. Какие преимущества immutable object перед обычными объектами? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Стартовый (урок 1, урок 2, урок 5), Java Базовый (урок 1, урок 2, урок 8, урок 9).   ООП 19. Что такое ООП? Назовите принципы с примерами. 20. В чем преимущества ООП перед процедурным программированием? 21. В чем заключается главная особенность ООП? 22. Расскажите, какие преимущества мы получаем при использовании ООП? 23. Расскажите, какие есть недостатки в ООП? 24. Расскажите о принципе наследования в ООП? Зачем он нужен? 25. Дайте определение принципа полиморфизма в ООП? Как работает полиморфизм? 26. Что такое статический и динамический полиморфизм? 27. Дайте определение принципа абстракции в ООП. 28. Какие элементы языка отвечают за инкапсуляцию? 29. Какие элементы языка отвечают за наследование? 30. Какие элементы языка отвечают за полиморфизм? 31. Что такое SOLID? Приведите примеры. 32. Что такое перегрузки (overloading) метода? 33. Что такое переопределение (override) метода? 34. Что такое класс, объект, интерфейс? 35. Что такое класс POJO? Приведите пример такого класса. 36. Какие элементы могут содержать класс? 37. Дайте определение объекта. 38. Расскажите о наследовании в Java. Какие особенности использования ключевого слова super? 39. Что такое сигнатура метода? Приведите примеры правильных и неправильных сигнатур. 40. Можно ли в конструкторе применять return? 41. Можно ли в конструкторе выкинуть исключение (exception)? 42. Из каких элементов состоит заголовок класса? Напишите пример. 43. Из каких элементов состоит заголовок метода? Напишите пример. 44. Создайте в объекте-наследнике конструктор по умолчанию, если в базовом классе он не определен (но определен другой конструктор). 45. Когда применяется ключевое слово this? 46. Что такое инициализатор? 47. Для наследования класса public class Child extends Parent напишите порядок инициализации объекта. 48. Какие знаете отношения между классами (объектами)? 49. Какие ассоциативные связи между объектами вы знаете? 50. Что такое модификаторы доступа в Java? Назовите их. Для чего используются? 51. Назовите основную особенность статических переменных и методов. 52. Какие основные ограничения действуют на статические переменные и методы? 53. Что означает ключевое слово static? Может ли статический метод быть переопределенным или перегруженным? 54. Может ли метод быть статическим и абстрактным одновременно? 55. Можно ли использовать статические методы внутри обычных? Наоборот? Почему? 56. Что означает ключевое слово final? 57. Что такое abstract? Абстрактный класс? Абстрактный метод? 58. Что такое interface? Может ли быть final interface? 59. В чем разница между абстрактным классом и интерфейсом в Java? 60. Где можно инициализировать статические поля? 61. Что такое анонимные классы? 62. Что такое примитивные классы? 63. Что такое класс «обертка» (wrapper)? 64. Что такое Nested class? Когда используется? 65. Какие модификаторы доступа могут быть у класса? Ответы на некоторые из этих вопросов вы можете найти в видео курсах Java Базовый (урок 1-4, урок 6, урок 7, урок 9), SOLID принципы в Java.   Библиотеки и стандарты 67. Что такое Hibernate? В чем разница между JPA i Hibernate? 68. Что такое каскадность? Как она используется в Hibernate? 69. Может ли entity-класс быть абстрактным классом? 70. Что такое entity manager? За что отвечает? 71. Что такое класс Assert? Зачем и как его использовать? Ответы на некоторые из этих вопросов вы можете найти в видео курсе JDBC & Hibernate.    String 72. Дайте характеристику String в Java. 73. Какие есть способы создания объекта String? Где он создается? 74. Как сравнить две строки в Java и/или отсортировать их? 75. Предложите алгоритм преобразования строки в знак. Напишите соответствующий код. 76. Как превратить строку в массив байтов и обратно? Напишите соответствующий код. 77. Что такое строковый пул и зачем он нужен? 78. Какие GOF-шаблоны применяются в строковом пуле? 79. Как разделить строку на части? Напишите соответствующий код. 80. Почему массив символов лучше, чем строка для хранения пароля? 81. Какая разница между String, StringBuffer и StringBuilder? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 5).   Enum 82. Дайте краткую характеристику Enum в Java. 83. Может ли Enum реализовывать (implement) интерфейс? 84. Может ли Enum расширить (extends) класс? 85. Можно ли создать Enum без экземпляров объектов? 86. Можем ли мы переопределить метод toString() для Enum? 87. Что будет, если не будем переопределять метод toString() для Enum? 88. Можем ли мы указать конструктор внутри Enum? 89. В чем разница между == и equals()? 90. Что делает метод ordinal() в Enum? 91. Можно ли использовать Enum с TreeSet или TreeMap в Java? 92. Как связаны методы ordinal() и compareTo() в Enum? 93. Напишите пример Enum. 94. Можно ли использовать Enum в switch case? 95. Как получить все имеющиеся значения в экземпляре Enum? Ответы на некоторые из этих вопросов вы можете найти в видео курсах Java Базовый (урок 7), Java Углублённый (Урок 3).   Stream API 96. Что такое Stream в Java? 97. Назовите основные свойства транзакций. 98. Какие есть уровни изоляции транзакций? 99. Какая разница между Statement и PreparedStatement? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 15).   Collections 100. Расскажите об итераторах и об их применении. 101. Какая иерархия коллекций в Java Collection Framework? 102. Какое внутреннее строение ArrayList? 103. Какое внутреннее строение LinkedList? 104. Какое внутреннее строение HashMap? 105. Чем отличается ArrayList от LinkedList? 106. Чем отличается ArrayList от HashSet? 107. Зачем в Java такое многообразие имплементации динамического массива? 108. Зачем в Java такое многообразие имплементации key-value storage? 109. Как отсортировать коллекцию элементов? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 5), Java Углублённый (урок 3, урок 15).   Class Object. Equals and HashCode 110. Дайте краткую характеристику class object в Java. 111. Для чего используют Equals and HashCode в Java? 112. Расскажите о контракте между Equals and HashCode в Java? 113. Какие условия выдвигаются касательно переопределения соглашения при переопределении Equals? 114. Что будет, если не переопределить Equals and HashCode? 115. Какие значения мы получим, если у нас не перераспределены Equals and HashCode? 116. Почему симметричность выполняется, только если x.equals(y) возвращает true? 117. Что такое коллизия в HashCode? Как с ней бороться? 118. Что будет, если элемент, участвующий в контракте с HashCode, меняет свое значение? 119. Напишите методы Equals and HashCode для класса Student, который состоит из полей String name и int age. 120. В чем разница применения if (obj instanceof Student) и if (getClass() == obj.getClass())? 121. Дайте краткую характеристику метода clone(). 122. В чем заключается особенность работы метода clone() с полями объекта типа-ссылки? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 9).   Exceptions 123. Дайте определение понятию exception (исключительная ситуация). 124. Какие знаете особенности использования оператора try ... catch? 125. В чем разница между error и exception? 126. Какая разница между checked и unchecked, exception, throw, throws. 127. Какой есть иерархия исключений? 128. Что такое checked и unchecked exception? 129. Нужно ли проверять checked exception? 130. О чем говорит и как использовать ключевое слово throws? 131. Какие возможные способы обработки исключений вы знаете? 132. Напишите пример перехвата и обработки исключения в блоке try-catch метода. 133. Напишите пример перехвата и обработки исключения в секции throws-метода и передачи вызывающему методу. 134. Напишите пример перехвата и обработки исключения с использованием собственных исключений. 135. Какие есть правила для проверки исключений при наследовании? 136. Могли бы ли вы написать код, если блок finally не будет выполнен? 137. Напишите пример обработки нескольких исключений в одном блоке catch. 138. Какой оператор позволяет принудительно выбросить исключение? Напишите пример. 139. Может ли метод main выбросить throws-исключение? Если да - куда передаст? 140. Напишите пример try with resources. Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 8).   Многопоточность 141. Какие средства для работы с многопоточностью знаете? 142. Что такое процесс и поток? Чем отличается процесс от потока? 143. Расскажите о синхронизации между потоками. Для чего используют методы wait(), notify() - notifyAll(), join()? 144. Как остановить поток? 145. Как между потоками обмениваться данными? 146. В чем заключается отличие класса Thread от интерфейса Runnable? 147. Есть потоки Т1, Т2 и Т3. Как реализовать их последовательное выполнение? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 13, урок 14).   Практические задания 148. Matrix Diagonal Sum (задача с Leetcode). 149. Move Zeroes (задача с Leetcode). 150. Дан List <String> names. Удалите первую букву из каждого имени и верните отсортированный список. 151. Перевернуть массив. 152. Проверить, является ли строка палиндромом. 153. Написать простой алгоритм сортировки (Bubble, Selection или Shuttle). Как его можно улучшить? 154. Напишите алгоритм (последовательность действий) составления литерала типа int и литералов типа byte. Объясните, что происходит с памятью.   Middle Общие 1. В чем преимущества и недостатки ООП, если сравнивать с процедурным/функциональным программированием? 2. Чем отличается агрегация от композиции? 3. Какие паттерны GoF вы использовали на практике? Приведите примеры. 4. Что такое прокси-объект? Приведите примеры. 5. Какие нововведения анонсировано в Java 8? 6. Что такое High Cohesion и Low Coupling? Приведите примеры. Лучше всего тема шаблонов в Java раскрыта в видео курсе Паттерны проектирования в Java.   ООП 7. Каким образом можно реализовать множественное наследование в Java? 8. Какая разница между методами final, finally и finalize()?   Java Core 9. В чем разница между статическим и динамическим связыванием в Java? 10. Можно ли использовать private или protected переменные в interface? 11. Что такое Classloader и для чего используется? 12. Что такое Run-Time Data Areas? 13. Что такое immutable object? 14. В чем особенность класса String? 15. Что такое ковариантность типов? 16. Какие есть методы в классе Object? 17. Приведите примеры удачного и неудачного использования Optional. 18. Можно ли объявлять main method как final? 19. Можно ли импортировать те же самые package/class дважды? Какие последствия? 20. Что такое Casting? Когда можем получить исключение ClassCastException? 21. Почему современные фреймворки используют в основном только unchecked exceptions? 22. Что такое static import? 23. Какая связь между методами hashCode() и equals()? 24. Когда используют BufferedInputStream и BufferedOutputStream классы? 25. Какая разница между классами java.util.Collection и java.util.Collections? 26. Какая разница между Enumeration и Iterator? 27. В чем разница между итераторами fail-fast и fail-safe? 28. Зачем нужен модификатор transient? 29. Как влияют на сериализацию модификаторы static и final? 30. Какие особенности использования интерфейса Cloneable? 31. Какие особенности использования интерфейса AutoCloseable? 32. Что такое FunctionInterface и чем он отличается от обычного интерфейса? 33. Что такое Atomic types и зачем они нужны? 34. Что такое Happens-before? Какие особенности использования ключевого слова volatile? 35. Расскажите о Heap и Stack память в Java. В чем разница между ними? Где хранятся примитивы? 36. Чем отличается stack от heap памяти? Когда и какая область памяти резервируется? Зачем такое разделение нужно? 37. Какие принципы работы и области памяти Garbage Collector? 38. Как работает Garbage Collector? Расскажите о Reference counting и Tracing. 39. Расскажите о механизме работы autoboxing в Java. 40. Как реализована сериализация в Java? Где мы можем ее увидеть? 41. Расскажите, в чем разница между WeakReference и SoftReference? 42. Что такое generics? Для чего они нужны? Какую проблему решают? 43. Что такое PECS и как используется? Приведите примеры. 44. Зачем на практике могут понадобиться immutable объекты? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый и Java Углублённый.   Библиотеки и инструменты 45. Чем полезны инструменты Maven, Ant, Gradle? 46. Что такое Unit Tests? Чем класс JUnit.Assert отличается от ключевого слова assert? 47. Что такое и зачем нужен Spring core? Раскройте понятие Inversion of Control и Dependency Injection. 48. Как «под капотом» работает @Transactional? 49. Как «под капотом» работает Spring? 50. Что такое и зачем нужен Hibernate? Раскройте понятие ORM. 51. Что такое и когда возникает LazyLoadingException? 52. Как «под капотом» работает Hibernate? Как бы вы написали собственный Hibernate? Ответы на некоторые из этих вопросов вы можете найти в видео курсах JDBC & Hibernate, Unit тестирование в Java с JUnit, Spring, Spring MVC.   Многопоточность 53. Какие преимущества и недостатки использования многопоточности? 54. Расскажите о четырех способах работы со многими потоками и чем отличается wait ... notify ... notifyAll от synchronized? От Future? 55. Что такое и зачем нужен ThreadLocal? 56. В чем разница между Thread.sleep() и Thread.yield()? 57. Как работает Thread.join()? 58. Что такое deadlock? 59. Что такое race condition? 60. Для чего использовать volatile, synchronized, transient, native? 61. Расскажите о приоритетах потоков. 62. Что такое потоки-демоны и для чего их устанавливать? 63. Почему нежелательно использовать Thread.stop()? 64. Как реализовать пул потоков? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 13, урок 14).   Collections 65. Чем отличается List от Set? 66. В чем разница между HashSet, LinkedHashSet и TreeSet? 67. Какая внутренняя структура HashMap? 68. Какое время поиска элемента в ArrayList, HashSet? 69. Как реализовать свой Stack? 70. Как работает метод put в HashMap? Почему нам нужно высчитывать позицию бакета? В чем преимущества такой операции? 71. В чем разница между HashMap и TreeMap? Когда и где их нужно использовать? 72. Какое внутреннее строение TreeMap? Рассказать об RBT. Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 1, урок 2, урок 3).   Stream API 73. Какие есть методы в интерфейсе Stream? 74. Чем отличается метод map от flatMap? 75. Какой функциональный интерфейс использует метод filter? Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 15).   Базы данных 76. В чем разница между реляционными и нереляционными базами данных? 77. Как хранятся соотношения one-to-one, one-to-many и many-to-many в виде таблиц? 78. Что такое нормализация БД? Приведите примеры из реального проекта. 79. Какие есть виды индексов в БД? Ответы на некоторые из этих вопросов вы можете найти в видео курсе SQL Базовый.   Практические задания 80. Valid parentheses (задача с LeetCode). 81. Reverse Linked List (задача с LeetCode). 82. Дано String s, найти длину максимального substring без повтора символов. 83. Определить, является ли односвязный LinkedList палиндромом.   Senior Общие 1. Когда лучше использовать наследование, а не агрегацию? 2. Расскажите о принципах работы Kubernetes.   Java Core 3. В чем разница между Java NIO и Java IO? 4. Чем отличается Lambda от анонимного класса? 5. Расскажите о Java Memory Model. 6. Какие есть типы памяти в JVM? 7. Опишите жизненный цикл Java-объекта. Каким образом объект переходит из одной области памяти Garbage Collector в другую? Что является триггером такого перехода? 8. Каким образом можно заставить JVM запустить Garbage Collector? 9. Какие существуют Garbage Collectors в JVM и зачем их столько? 10. Какие виды Garbage Collector есть в HotSpot? Как работают? 11. Что будет с Garbage Collector, если finalize() будет долго выполняться или в процессе выполнения получим исключение? 12. Чем ForkJoinPool отличается от ScheduledThreadPoolExecutor и ThreadPoolExecutor? 13. Какая разница между HashMap, WeakHashMap, Hashtable, IdentityHashMap? 14. Что такое LinkedHashMap? 15. Что такое EnumSet? Для чего использовать? Как реализовать? 16. Расскажите об особенностях сериализации в Java. Зачем serialVersionUID и InvalidClassException? 17. В чем проблема сериализации Singleton? 18. Какие бывают алгоритмы обхода деревьев и почему они разные? 19. Что такое deadlock? Какие типы существуют? Нарисуйте схематично, как может произойти. Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый и Java Углублённый.   Базы данных 20. Что такое ACID? 21. Что означает CAP-теорема? 22. Какие есть уровни изоляции транзакций? 23. Есть ли смысл отказываться от использования ORM? 24. Что такое n+1 проблема? 25. Что такое cartesian product проблема?   Библиотеки и инструменты 26. Каким образом построить monitoring в Java? Расскажите об особенностях использования Java micrometrics или DropWizard, или Prometheus frameworks. 27. Опишите механизм работы ORM. 28. Какие способы выборки данных в Hibernate вы знаете? 29. Какие изоляции транзакций существуют в Hibernate?   Spring 30. Что такое IoC и DI? 31. Каков жизненный цикл объектов, которые создает Spring? 32. Какие есть виды контекстов? 33. Как создать и поднять контекст с целью тестирования приложения? 34. Какие возможности Spring предоставляет для коммуникации с базой данных? 35. Какие признаки того, что класс - Java Bean? Чем POJO отличается от Java Bean? 36. Опишите механизм инъекции зависимости в Spring. 37. Почему все зависимости Spring являются Java Beans? Возможно ли использовать Spring для управления зависимостями между не Java Beans классами? 38. Чем Spring singleton отличается от prototype? 39. Есть ли смысл отказываться от использования Dependency Injection? Ответы на некоторые из этих вопросов вы можете найти в видео курсах Spring, Spring MVC.   Многопоточность 40. Что такое race-condition? 41. Какие элементы есть в java.util.concurrent пакете? 42. Что такое optimistic и pessimistic locking? 43. Какие особенности многопоточности в Java EE и Spring?   Stream API 44. Какие основные принципы Stream API?   Практические задания 45. Реализовать сервис, который на вход принимает url и возвращает короткую версию (вроде bit.ly/86gfr3).   Редакция DOU.ua благодарит за помощь в подготовке статьи Александра Редька, Антона Наумова, Богдана Чупика, Максима Ляшенко, Александра Навка, Сергея Маленко, Андрея Петрика, Сергея Громового, Дениса Душина, Ивана Чуба. Смотрите также статьи с вопросами на собеседовании по Python, .NET и JavaScript.
Dependency Injection у C#

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

Что такое Dependency Injection (внедрение зависимостей) на языке C#? Как это работает, типы внедрения зависимостей в C# и многое другое. В недавнем сообщении в блоге мы говорили о том, что язык C# в частности и виртуальная машина .NET в целом являются технологиями высокого уровня. Если вы планируете писать код на C#, внедрение зависимостей - это лишь одна из многих вещей, о которых вы должны знать. Продолжайте читать пример внедрения зависимостей C#, чтобы вы могли использовать его в своих интересах в своем следующем проекте. Определение Dependency Injection в C# Если вы более подробно рассмотрите Dependency Injection (DI), то увидите, что это паттерн проектирования программного обеспечения, который позволяет разрабатывать слабосвязанный код. Через DI вы можете уменьшить «жесткость» связи между программными компонентами. Внедрение зависимостей также известно как Inversion-of-Control (инверсия управления), которая упрощает модульное тестирование. Крайне важно сделать шаг назад к основам проектирования объектно-ориентированного приложения, где основным аспектом проектирования является «слабая связь». Это означает, что объекты имеют только столько зависимостей, сколько необходимо для выполнения своих заданий, а число зависимостей должно быть ограничено. Кроме того, зависимости объекта должны быть от интерфейсов, а не от конкретных объектов. Что такое конкретный объект? Это любой объект, созданный с помощью ключевого слова «new». Благодаря «слабому связыванию» вы упрощаете поддержку программного продукта и даёте большую возможность повторного использования. Кроме того, вы можете использовать так называемые Mock-объекты, предназначенные для замены дорогостоящих сервисов, таких как socket-communicator. Существует три типа DI: 1) Constructor Injection 2) Setter Injection 3) Method Injection Поскольку DI используется для упрощения сопровождения кода, он использует паттерн с объектом-конструктором для инициализации объектов и предоставления необходимых зависимостей объекту. Как вы можете видеть, теперь вы можете «внедрить» зависимость снаружи класса. Как работает Dependency Injection в C# Чтобы проиллюстрировать, что вашему классу Client необходимо использовать компонент класса Service, лучшего всего, чтобы ваш клиентский класс «знал» об интерфейсе IService вместо класса Service. Благодаря этому вы можете изменить реализацию класса Service столько раз, сколько хотите, не нарушая хост-кода. Полезно понимать Принцип Инверсии Зависимостей (Dependency Inversion Principle), который помогает нам при написании слабо связанных классов. Определение: Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Как вы внедряете зависимость между двумя модулями? Через инверсию управления. Это фактический механизм, который вы можете использовать для создания модулей более высокого уровня, зависящих от абстракций. Вы должны инвертировать элемент управления, чтобы следовать принципу инверсии зависимостей. В результате ваши высокоуровневые модули больше не зависят от конкретных низкоуровневых реализаций. Давайте немного погрузимся в три типа Dependency Injection: Constructor Injection Основная предпосылка здесь заключается в том, что объект не имеет значений по умолчанию или одного конструктора. Для создания объекта необходимо задать определенные значения во время создания. Вкратце, Constructor Injection использует параметры для внедрения зависимостей. Это самый распространенный вид DI, который выполняется путем предоставления зависимости через конструктор класса при создании экземпляра этого класса. Кроме того, внедряемый компонент можно использовать в любом месте внутри класса. Хотя он должен использоваться, когда сия зависимость действительно необходима для работы класса. К тому же Constructor Injection используется в наиболее распространенном сценарии, когда классу требуется одна или несколько зависимостей. Вот несколько преимуществ Constructor Injection: • Инициирует контракт сильной зависимости. • Он поддерживает тестирование. • Можно сделать неизменным. Setter Injection Его также называют Property Injection (внедрение свойств). Setter Injection позволяет нам создавать затратные ресурсы и сервисы только по мере необходимости и как можно позже. Кроме того, он не требует предварительной проводки всего графика зависимостей. Единственная проблема - трудно определить, какие зависимости требуются. Хотя это не требует добавления или изменения конструкторов. К тому же перед использованием вам нужно будет проверить значение null. Method Injection Это наименее распространённый патерн, он используется только в крайних случаях. Как указано в названии, Method Injection вводит зависимость в метод, который будет ее использовать. В результате это удобно, когда для всего класса нужен только один метод, а не зависимость. Преимущества Dependency Injection C# С помощью DI вы можете вводить дополнительный код между зависимостями. Чтобы проиллюстрировать это, вы можете использовать Constructor Injection, чтобы предоставить объекту его зависимости. Если у вас есть класс с 10 методами, которые не имеют зависимостей, но вы хотите добавить новый метод с зависимостью, вы можете изменить конструктор для использования Constructor Injection. С другой стороны, вы можете просто добавить новый конструктор, который будет принимает зависимость. Тем не менее если зависимость нежелательна, вы можете использовать Setter Injection, поскольку она позволяет создавать дорогостоящие ресурсы только тогда, когда это необходимо. Как вы можете видеть, DI делает код надежным, поддерживаемым, многоразовым и читаемым. Источник
10 секретів ідеального коду

Автор: Nicolas Baptiste

Взято с настоящего поля битвы: работы Спустя практически 10 лет работы на Javascript мне захотелось поделиться своими ежедневными секретами написания кода. Многие советы были позаимствованы у моих коллег, из книг или видео. Такие приёмы не должны оставаться в тайне, поэтому я ими и хочу поделиться!   1. Меньше кода = меньше багов Это может прозвучать тривиально, но всегда держите это в уме. Любую часть можно убрать, даже не сомневайтесь! Просто удалите. Неработающий код, неиспользуемые переменные, лишние скобки: каждый малейший знак учитывается. 2. Развивайте читабельность кода Это дополнение к пункту 1. Если хочется сократить код, всегда нужно помнить о том, что рано или поздно код будет прочитан другими людьми. Может, кто-то другой, может, через несколько месяцев, но будет очень неприятно, если придется потратить больше времени на разбор кода, чем было потрачено на его написание. Запомните: код всегда важнее, чем комментарии или документация. Следите за переменными и именами функций, они должны быть достаточно наглядными, чтобы потом не объяснять их в комментариях. 3. Не пугайтесь функций, возвращающих функции Когда я начал кодить на javascript, мне не нравился метод написания кода с использованием функций, возвращающих функции, потому что, казалось, этому сложно следовать в процессе выполнения. Но этот шаблон, довольно мощный и часто используемый, называется замыканием. Это действительно полезная функция и, как только вы используете её, она значительно облегчает структуру кода. И это первый шаг для погружения в функциональное программирование. 4. Извлекание частей Функция становится слишком большой? Сделайте из нескольких частей отдельные функции! Не совсем понятно? Выделите их в переменную и дайте ей понятное имя. Такой метод, конечно, схож со вторым пунктом, но это сделает ваш код более читабельным. А знаете ли Вы, что Ваша среда разработки может помочь? Ctrl + alt + v выражение извлекается в Webstorm и потом выделяется в переменную. Ctrl + alt + m сделает из него функцию. 5. Переверните мышление Это первый шаг перед TDD. Скорее всего, вы всегда знаете, чего хотите достичь. Так начните с конца, напишите ожидаемый результат и пишите код в обратном порядке, чтобы получить то, что хотите. Если будете писать в прямом порядке, вероятней всего, Вы начнете писать и проверять, работает ли оно. Поменяйте, проверьте, напишите что-то другое, проверьте и…. Возможно, это даже не особо полезно для достижения Вашей цели. Но такое мышление поможет сфокусироваться и потратить меньше времени. 6. Исключите условные операторы Если для функции у вас на уме принцип единственной ответственности, условным операторам тут не место. Они создают ветвления в потоке выполнения. И один маленький if позволит другим разработчикам добавить всё больше логики в него. Я считаю, что условные операторы if вообще не должны использоваться без else, а их размещение внутри другого условного оператора нужно полностью запретить! Опять же, такой подход делает код более сложным, и часто оказывается, что функция выполняет больше, чем нужно. Как же от этого избавиться? Смотрите следующий пункт. 7. Используйте lodash_.get вместо проверки null/undefined Очень часто, анализируя код, я вижу использование ifs для проверки null или undefined значений. Но без использования else! То есть идёт работа только с одним путём, а другой путь остаётся местом загадок (и багов!). Тут на помощь приходит Lodash (лучшее, написанное когда-либо на javascript) с его замечательной функцией get. Её первым аргументом является объект, над которым вы работаете, вторым – путь к дочерним атрибутам, которые вы хотите получить, и третьим является значение по умолчанию в случае с undefined. Два преимущества использования всего одной функции! 8. Используйте тернарные операторы Кто-то может поспорить насчёт их читабельности, но если правильно извлекать функции, они станут превосходным инструментом. Они также заставят Вас сотрудничать с else case. Плюс, они не позволяют содержать в себе больше кода. Чем меньше ваш код похож на смертельную пирамиду, тем лучше. 9. Никаких больше for loops, только map, reduce и filter Мы, наконец-то, подошли тут к теме функционального программирования, так как эти методы являются основой этого стиля. Хоть названия или теории не особо известны, они действительно помогут избежать тяжело читаемого императивного стиля для выражений for. Эти методы сейчас уже встроены в большинство браузеров, так что используйте их! Но если вам всё же нужна совместимость, можно использовать lodash аналоги. Итак, когда их использовать? Выражение for, имеющее дело со всеми точками входа – это map for + if , вероятно, filter sum или accumulation -  это просто reduce  С помощью сочетания этих методов вы можете сделать много работы в хорошей и краткой форме. 10. Читайте исходники Если документации недостаточно - читайте исходники! Это поможет Вам узнать, как их использовать и даст неплохое представление об их качестве. Плюс, некоторые библиотеки имеют исходники, встроенные в их документацию. Так с ними даже быстрее можно ознакомиться. С нашей IDE можно часто обращаться к источнику с помощью ctrl + clic на имя метода. Это отличный способ убрать магию и набраться вдохновения для собственного кода!   В заключение хотелось бы сказать, что это те принципы, которые помогают лично мне. Жаль, что я не знал их раньше, например, в школе… Зато ты знаешь их сейчас. И ими можно пользоваться практически в любом контексте. Некоторые из них распространяются не только на javascript, так что пользуйтесь ими где угодно :) Также хотелось бы обратить ваше внимание на великого Uncle Bob и его сайт . Вам определённо стоит посмотреть эти видео, даже несмотря на то, что они по большей части касаются Java, идеи применимы и в Javascript. Переведено с источника.
Notification success