You are on page 1of 42

1.Назвіть основні принципи ООП.

ІНКАПСУЛЯЦІЯ
Одним з визначальних факторів при проектуванні компонентів програми є
приховування внутрішніх даних компоненту і деталей його реалізації від інших
компонентів програми та надання набору методів для взаємодії з ним (API). Цей
принцип є одним з чотирьох фундаментальних принципів ООП і називається
інкапсуляцією.
НАСЛІДУВАННЯ
Наслідування є одним з найвагоміших принципів об'єктно-орієнтованого
програмування, оскільки воно дозволяє створювати ієрархічні структури об'єктів.
Використовуючи наслідування можна створити загальний клас, який буде
визначати характеристики і поведінку, властиві певному набору пов'язаних
об'єктів. В подальшому цей клас може наслідуватися іншими, другорядними
класами, кожен з яких додаватиме унікальні, властиві лише йому характеристики і
доповнюватиме або змінюватиме поведінку базового класу.
ПОЛІМОРФІЗМ
Розглядаючи поліморфізм необхідно пам'ятати, що цей принцип нерозривно
пов'язаний з іншим принципом ООП – наслідуванням, яке допомагає реалізувати
поліморфізм. Візьмемо для прикладу абстрактний клас «Автомобіль», який
наслідують два конкретних класи – «Спортивний автомобіль» та «Вантажний
автомобіль».

3.Що таке рекурсія?


Рекурсія - це техніка в програмуванні, при якій функція викликає саму себе замість того,
щоб використовувати ітерацію (циклічні структури). Функції, які використовують рекурсію,
називаються рекурсивними функціями.

4.Що таке лямбда-вираз?


У .NET, лямбда-вираз (Lambda Expression) - це короткий синтаксис для
представлення анонімних функцій або делегатів. Він дозволяє створювати функції
"на льоту" без необхідності визначати їх окремо як методи.

Лямбда-вирази зазвичай використовуються як аргументи функцій, коли потрібно


передати функцію в якості параметра іншій функції, або в LINQ (Language Integrated
Query) запитах для обробки колекцій.
5.Що таке паралельне програмування (багатопотоковість)
і його призначення? Які класи використовуються?
Паралельне програмування, також відоме як багатопотоковість, полягає в
одночасному виконанні декількох фрагментів коду (потоків) у межах одного
програмного процесу. Ідея полягає у тому, щоб розділити завдання на менші
частини, які можуть виконуватись одночасно на різних потоках процесора. Це
дозволяє використовувати ресурси системи більш ефективно, особливо на
багатоядерних або багатопроцесорних системах.

Основне призначення паралельного програмування - збільшення продуктивності


програми шляхом одночасного виконання важких обчислень, обробки даних або
взаємодії з ресурсами системи. Воно особливо корисне в сферах, де задачі можуть
бути розділені на незалежні частини, таких як паралельна обробка даних у великих
об'ємах даних, ігри, комп'ютерні графіка, наукові обчислення, мультимедіа і т.д.

В .NET Framework і .NET Core є декілька класів і механізмів для роботи з


паралельним програмуванням:

1. Thread (System.Threading.Thread): Це базовий клас, який дозволяє створювати і


керувати окремими потоками. Використовуючи цей клас, можна створювати та
керувати потоками безпосередньо.
2. Task (System.Threading.Tasks.Task): Це високорівневий клас, який надає спрощений
механізм для асинхронного програмування та роботи з багатопотоковістю. Він
базується на ThreadPool і дозволяє запускати завдання на вільних потоках, що
дозволяє краще використовувати ресурси системи.
3. ThreadPool (System.Threading.ThreadPool): Це пул потоків, який дозволяє
використовувати пул потоків замість створення нових потоків для виконання
невеликих завдань. Це дозволяє зменшити накладні витрати на створення і
усунення потоків.
4. Parallel (System.Threading.Tasks.Parallel): Цей клас надає статичні методи, що
дозволяють легко виконувати паралельні обчислення, цикли та операції над
даними. Він автоматично керує розподілом завдань між доступними потоками.

6.Що таке JSON?


JSON (JavaScript Object Notation) - це легкий, текстовий формат обміну даними, який
використовується для представлення структурованих даних у форматі, зрозумілому для
людей і легко зчитуваному для машин. JSON виник як спрощений альтернативний формат
XML і широко використовується у веб-програмуванні для передачі даних між сервером та
клієнтом.
7.Як ви розумієте REST?
REST (Representational State Transfer) - це стиль архітектури програмного
забезпечення, який використовується для проектування схем обміну даними у
розподілених системах. REST базується на простих і зрозумілих принципах, які
дозволяють побудувати ефективні та легкі використання веб-сервіси. Він часто
використовується в розробці веб-додатків, додатків для мобільних пристроїв і API.

Основні принципи REST:

1. Ресурси: У REST-архітектурі, дані представляються як ресурси (resources), які можуть


бути адресовані через URL. Ресурс може бути будь-якою сутністю, яку можна
ідентифікувати, наприклад, об'єкт, колекція, послуга тощо.
2. CRUD операції: REST використовує стандартні HTTP методи для взаємодії з
ресурсами: GET (отримання), POST (створення), PUT (оновлення) і DELETE
(видалення). Ці HTTP методи відповідають основним операціям з базами даних -
Create, Read, Update і Delete (CRUD).
3. Представлення: Клієнт і сервер взаємодіють, передаючи інформацію у вигляді
представлення ресурсів. Наприклад, представлення ресурсу може бути у форматі
JSON або XML.
4. Безстаність: Кожен запит клієнта до сервера повинен містити всю інформацію,
необхідну для здійснення операції, без залежності від попередніх запитів. Сервер
не повинен зберігати стан клієнта між запитами.
5. Уніфікація ієрархії ресурсів: REST використовує ієрархічну структуру ресурсів у
форматі URL, що дозволяє легко навігувати між різними ресурсами.
У короткому висновку, REST є архітектурним стилем, який спрощує проектування та
розробку веб-сервісів, дозволяючи легко здійснювати зміну стану ресурсів за допомогою
стандартних HTTP-методів.

8.Розкажіть про SPA concept.


SPA (Single Page Application) - це концепція веб-додатків, де весь контент завантажується
одним разом при першому відкритті сторінки, а подальша навігація та взаємодія з
додатком відбувається без повторного завантаження всієї сторінки. Замість цього, сторінка
взаємодії побудована з допомогою динамічних змін контенту через JavaScript, або інші
мови програмування, які працюють у браузері.

Основні характеристики SPA:

1. Один файл: При першому завантаженні сторінки, сервер передає весь код додатку
разом із сторінкою, зазвичай у вигляді одного файлу HTML, CSS та JavaScript. Це
дозволяє знизити затримки завантаження і покращити швидкість відкриття додатку.
2. Асинхронні запити: Додаток взаємодіє з сервером через асинхронні запити,
зазвичай з використанням технологій AJAX або Fetch API, щоб отримувати або
відправляти дані без перезавантаження сторінки.
3. Зміна контенту без перезавантаження: Завдяки JavaScript та DOM-маніпуляціям,
додаток може динамічно змінювати контент на сторінці без необхідності повного
перезавантаження сторінки.
4. Використання SPA-фреймворків: Для розробки SPA-додатків використовуються
різноманітні фреймворки та бібліотеки, такі як Angular, React, Vue.js, і т.д. Вони
надають потужні інструменти для розробки складних SPA з багатою
функціональністю.

Переваги SPA:

 Кращий досвід користувача: SPA забезпечують більш швидку навігацію та більш


плавні переходи між сторінками, що призводить до кращого досвіду для
користувачів.
 Зменшення серверного трафіку: Завдяки тому, що весь код завантажується один
раз, SPA зменшують обсяг трафіку між клієнтом і сервером.
 Легше управління станом додатку: SPA зазвичай зберігають стан додатку на
клієнтській стороні, що спрощує управління станом і зменшує навантаження на
сервер.
 Підтримка оффлайн-режиму: Завдяки кешуванню та збереженню стану на
клієнтському пристрої, SPA можуть працювати у оффлайн-режимі.
У .NET, для розробки SPA зазвичай використовують ASP.NET Core, який забезпечує
підтримку для створення веб-додатків, що використовують фреймворки, такі як Angular,
React, Vue.js і інші. ASP.NET Core дозволяє налаштовувати серверну частину,
використовуючи стандартні REST API або GraphQL для взаємодії з клієнтським додатком
SPA.

9.Які GoF-патерни використовували?


GoF-патерни (патерни проектування Gang of Four) - це набір шаблонів
проектування, розроблених Еріхом Гаммою, Річардом Хелмом, Ральфом
Джонсоном і Джоном Вліссідесом в книзі "Design Patterns: Elements of Reusable
Object-Oriented Software". Ці патерни стали основою для об'єктно-орієнтованого
програмування і допомагають розробникам створювати гнучкі, розширювані та
підтримувані дизайни програм.

У .NET, багато з GoF-патернів можна використовувати для покращення структури


програм та забезпечення кращої розділеності обов'язків між класами. Ось кілька
прикладів GoF-патернів, які можна застосовувати в .NET:
1. Singleton (Одиночка): Гарантує, що клас має лише один екземпляр і забезпечує
глобальний доступ до нього. В .NET цей паттерн може бути застосований для
створення загальних налаштувань, логгерів та інших ресурсів, які повинні мати
лише один екземпляр.
2. Factory Method (Фабричний метод): Дозволяє створювати об'єкти без явного
зазначення класу. Цей паттерн можна використовувати для розділення процесу
створення об'єктів від логіки програми, що дозволяє легко змінювати типи
створюваних об'єктів без зміни клієнтського коду.
3. Observer (Спостерігач): Дозволяє реалізувати механізм підписки на зміни стану
об'єкту. В .NET цей паттерн використовується для реалізації подій і делегатів,
дозволяючи об'єктам слідкувати за змінами інших об'єктів.
4. Adapter (Адаптер): Дозволяє об'єктам з різними інтерфейсами спілкуватися між
собою. В .NET цей паттерн використовується для забезпечення взаємодії між
класами, які мають різні інтерфейси, наприклад, між старим і новим кодом.
5. Decorator (Декоратор): Дозволяє динамічно додавати нові функціональність до
об'єкту. В .NET цей паттерн можна використовувати для розширення
функціональності об'єктів без зміни їх базового коду.
6. Strategy (Стратегія): Дозволяє замінювати алгоритми виконання задач на льоту.
В .NET цей паттерн можна використовувати для розділення алгоритмів і
взаємозамінних реалізацій.

10.Яка різниця між GET і POST HTTP методами?

GET і POST - це два з основних HTTP методів, які використовуються для взаємодії з
веб-серверами. Вони виконують різні функції і мають деякі відмінності:

1. Значення даних:
 GET: Дані запиту передаються у URL-параметрах. Ці дані видимі в адресному
рядку браузера і обмежені довжиною URL. Тому GET-запити
використовуються для запитів на отримання інформації з сервера.
 POST: Дані запиту передаються у тілі запиту. Ці дані приховані від
користувача і не обмежені довжиною URL. POST-запити використовуються
для відправки даних на сервер для обробки, створення, оновлення або
видалення ресурсів.
2. Кешування:
 GET: Результати GET-запитів зазвичай кешуються, тобто браузер може
зберігати результати запиту, щоб зменшити навантаження на сервер і
покращити швидкість відображення сторінок.
 POST: POST-запити не кешуються, оскільки вони можуть змінювати стан
сервера або виконувати інші небезпечні дії.
3. Взаємодія з базами даних:
 GET: GET-запити не повинні змінювати стан сервера або бази даних. Вони
призначені для отримання даних з сервера без побічних ефектів.
 POST: POST-запити можуть змінювати стан сервера або бази даних, тому їх
використовують для збереження, оновлення або видалення даних на
сервері.
4. Безпека:
 GET: GET-запити менш безпечні з точки зору безпеки, оскільки дані
передаються у URL і можуть бути видимі в логах сервера та історії браузера.
 POST: POST-запити більш безпечні, оскільки дані передаються у тілі запиту і
не видимі в адресному рядку.

11.Яку проблему вирішує Docker? Які його плюси та мінуси?


Docker - це платформа для контейнеризації додатків, яка дозволяє упаковувати
програмне забезпечення та його залежності у контейнери. Контейнери є
ізольованими та переносимими середовищами, які забезпечують однаковий та
стабільний запуск додатків на різних середовищах, таких як розробка, тестування та
продакшн.

Проблема, яку вирішує Docker:

1. Несумісність середовищ: У розробці програмного забезпечення може виникнути


проблема, коли додаток працює коректно на одному середовищі, але
відмовляється запускатися або працює некоректно на іншому. Це може бути
зумовлено різницею версій операційних систем, залежностей, бібліотек та іншого
програмного забезпечення. Docker допомагає уникнути цих проблем, пакуючи всі
залежності додатка в контейнер, що забезпечує однакові умови для виконання
додатка у будь-якому середовищі.

Плюси Docker:

1. Переносимість: Контейнери Docker легко переносити між різними середовищами,


що спрощує розгортання та тестування додатків.
2. Ізоляція: Контейнери забезпечують ізольовані середовища, що дозволяє запускати
декілька додатків на одному хості без взаємного впливу на їх роботу.
3. Швидке розгортання: Docker дозволяє швидко створювати, запускати та зупиняти
контейнери, що полегшує процес розробки та тестування.
4. Масштабованість: Docker дозволяє легко масштабувати додатки, додавати та
забирати контейнери з хостів залежно від потреб.

Мінуси Docker:
1. Додатковий шар: Використання Docker додає додатковий шар абстракції та
управління контейнерами, що може призводити до невеликого падіння
продуктивності.
2. Ресурсомісткість: Docker потребує додаткових ресурсів, таких як пам'ять і
обчислювальну потужність, для управління контейнерами.
3. Складність мережі: Контейнеризація може створювати додаткові виклики з
управління мережами, особливо для додатків, що вимагають зв'язку між
контейнерами.

12.Чим принципово відрізняються unit-тести від інтеграційних


тестів?
Unit-тести і інтеграційні тести - це два типи тестів, які використовуються у розробці
програмного забезпечення для перевірки функціональності коду та взаємодії між
компонентами. Вони мають деякі принципові відмінності:

1. Unit-тести:
 Призначення: Unit-тести перевіряють окремі частини програми (функції,
методи, класи) - так звані "одиниці коду". Вони виконуються для
переконання в правильності роботи конкретного шматка коду і виправлення
помилок, якщо такі виявляються.
 Ізоляція: Unit-тести зазвичай запускаються ізольовано від інших частин
програми. Це досягається за допомогою моків (mocks) або підроблених
об'єктів (stubs), що замінюють залежності модуля.
 Швидкість: Unit-тести є дуже швидкими, оскільки вони тестують окремі
частини коду і не включають в себе всю інфраструктуру або інші внутрішні
компоненти.
2. Інтеграційні тести:
 Призначення: Інтеграційні тести перевіряють взаємодію між компонентами
або модулями програми. Вони виконуються для переконання, що різні
частини програми правильно співпрацюють одна з одною.
 Реальні залежності: Інтеграційні тести включають реальні залежності між
компонентами програми, тому вони тестують реальний потік даних та
взаємодію з базами даних, зовнішніми службами тощо.
 Повільність: Інтеграційні тести можуть бути повільнішими в порівнянні з unit-
тестами, оскільки вони включають в себе більше компонентів і залежностей.
В .NET, для написання unit-тестів часто використовуються фреймворки, такі як
MSTest, NUnit або xUnit.NET. Ці фреймворки допомагають створювати і запускати
тести з ізольованими залежностями. Для написання інтеграційних тестів, можна
використовувати той же фреймворк, але тестувати взаємодію між компонентами в
реальних умовах.

Обидва типи тестів мають своє використання в розробці програмного


забезпечення. Unit-тести допомагають переконатися, що окремі частини програми
працюють коректно, тоді як інтеграційні тести перевіряють взаємодію між цими
частинами. Комбінація обох типів тестів допомагає забезпечити високу якість коду
та функціональності програмного забезпечення.

13.Що таке Exception?


В .NET, Exception (виняток) - це об'єкт, який використовується для представлення
виняткових ситуацій або помилок, які виникають під час виконання програми.

14.Для чого служать try, catch, finaly? В якому випадку може


не виконатись блок finaly?
1. try: Всі інструкції, які можуть викликати виключну ситуацію, розміщуються у блоку
try. Цей блок служить для захисту від винятків.
2. catch: Блок catch використовується для обробки виключень, які були згенеровані у
блоку try. Коли виникає виключення, виконання коду переходить до відповідного
блоку catch, який здійснює відповідну обробку помилки.
3. finally: Блок finally використовується для розміщення коду, який повинен
виконатися незалежно від того, чи сталася помилка, чи ні. Код в блоку finally
виконується навіть у випадку, якщо виключення було перехоплено або ні.
Таким чином, блок finally є корисним механізмом для забезпечення надійної роботи
програми та для ресурсозбереження (наприклад, закриття відкритих файлів або з'єднань
незалежно від того, чи сталася помилка чи ні).

15.Що таке call stack? Які ключові слова ви знаєте?


Call stack (стек викликів) - це структура даних, яка використовується для
відстеження послідовності викликів функцій або методів у програмі. Коли
викликається функція (або метод), адреса повернення та інші важливі дані
поміщаються в стек, і управління передається до викликаної функції. Коли
викликана функція закінчує своє виконання, управління повертається назад, адреса
повернення забирається зі стеку, і програма продовжує виконуватись з місця, де
вона зупинилася.

У .NET є кілька ключових слів, пов'язаних зі стеком викликів:

1. call: Ключове слово call використовується для здійснення виклику функції або
методу в програмі. Після виконання виклику адреса повернення і поточний стан
виконання поміщаються у стек.
2. ret: Ключове слово ret (або return) використовується для повернення з функції
або методу до місця, звідки відбувся виклик. Це відбувається після завершення
виконання функції.
3. push: Ключове слово push використовується для додавання значення у стек. Це
може використовуватись, наприклад, для передачі аргументів у функції або для
збереження даних перед викликом іншої функції.
4. pop: Ключове слово pop використовується для видалення значення з вершини
стеку. Це використовується для видалення адреси повернення або інших даних
після повернення з функції.

Важливо розуміти, що стек викликів обмежений розміром, і якщо програма


виконується занадто глибоко (наприклад, через рекурсивний алгоритм без умови
завершення), може виникнути переповнення стеку (stack overflow) і програма може
завершитись аварійно.

16.Що таке ASP.NET?


ASP.NET є однією з платформ розробки веб-додатків, розроблених компанією Microsoft.
Вона дозволяє створювати веб-додатки, веб-сайти,

17.Які існують типи Action filters?

В ASP.NET MVC або ASP.NET Core є кілька типів Action фільтрів (Action filters), які
дозволяють впливати на обробку HTTP-запитів та HTTP-відповідей контролерами.
Action фільтри дають можливість виконувати дії перед та після виконання дій
контролерів або змінювати результат виконання дій.

Ось основні типи Action фільтрів у .NET:


1. Authorization filters (фільтри авторизації): Дозволяють виконувати перевірки
прав доступу до дій контролерів перед їх виконанням. Наприклад, перевірка прав
аутентифікованого користувача або ролей.
2. Action filters (фільтри дій): Виконують певні дії до або після виконання дій
контролерів. Наприклад, логування, валідація даних, підготовка даних перед
виконанням дії.
3. Result filters (фільтри результатів): Дозволяють впливати на результат виконання
дій після їх виконання. Можуть змінювати результат дії або виконувати додаткові дії
над результатом.
4. Exception filters (фільтри виключень): Використовуються для обробки винятків,
які виникли під час виконання дій контролерів. Дозволяють забезпечити власну
обробку помилок та повернення відповідних відповідей користувачеві.

Ці фільтри дають можливість структурувати та впорядковувати логіку обробки


HTTP-запитів у веб-додатках ASP.NET. Вони дозволяють розділити функціональність,
зберігаючи її в окремих фільтрах, що сприяє підтримці чистоти та повторюваності
коду.

18.Що таке Web Service?

Web Service (веб-сервіс) - це програмний компонент, який надає функції та дані для
зовнішніх клієнтів через мережу Інтернет. Веб-сервіси дозволяють різним
програмам, розташованим на різних платформах, взаємодіяти і обмінюватися
даними за допомогою стандартних веб-протоколів, таких як HTTP і XML.

Основні характеристики веб-сервісів:

1. Протоколи: Веб-сервіси спираються на використання стандартних веб-протоколів


для обміну даними. Зазвичай це HTTP (через RESTful веб-сервіси) або SOAP (через
SOAP веб-сервіси).
2. Формат даних: Дані передаються у вигляді структурованих форматів, таких як XML
або JSON. Це дозволяє різним системам легко інтерпретувати та обробляти дані.
3. Розширеність: Веб-сервіси дозволяють розподіленим системам розширювати свої
функціональні можливості без необхідності змінювати код додатків.
4. Відкритий стандарт: Веб-сервіси підтримують використання відкритих стандартів,
таких як XML, SOAP, WSDL (Web Services Description Language) тощо, що дозволяє
різним системам спілкуватися між собою.

У .NET, створення веб-сервісів можливе за допомогою різних технологій, таких як:


1. ASP.NET Web API: Це фреймворк для створення RESTful веб-сервісів за допомогою
технологій ASP.NET.
2. WCF (Windows Communication Foundation): Це технологія для створення SOAP-
веб-сервісів, а також інших типів сервісів, таких як служби зв'язку між процесами
(IPC) і т.д.
3. ASP.NET Core Web API: Це нова версія фреймворка для створення RESTful веб-
сервісів на платформі ASP.NET Core.

19.Що таке CLR?

CLR (Common Language Runtime) - це виконавче середовище (runtime environment)


для програм, написаних на мовах програмування, що підтримують платформу .NET.
CLR є однією з ключових компонентів .NET Framework або .NET Core (в залежності
від варіанту), і він відповідає за виконання і управління виконанням програм на
мовах, таких як C#, Visual Basic .NET, F# та ін.

Основні функції CLR:

1. Інтерпретація та компіляція: CLR спочатку інтерпретує IL (Intermediate Language


або проміжний код), який генерується під час компіляції коду .NET. Після цього CLR
може виконати JIT (Just-In-Time) компіляцію, перетворюючи IL на машинний код
пристрою, на якому виконується програма. Це дозволяє виконувати програми на
машині, на якій вони запущені, та максимально оптимізувати продуктивність.
2. Керування пам'яттю: CLR відповідає за управління пам'яттю програми,
включаючи виділення та звільнення пам'яті. Він використовує механізм
автоматичного збору сміття для виявлення та видалення об'єктів, які вже не
використовуються, що полегшує роботу розробників та допомагає уникнути певних
помилок, пов'язаних з управлінням пам'яттю.
3. Керування безпекою: CLR забезпечує безпеку коду, запускаючи його у
контрольованому середовищі (sandbox). Це дозволяє запускати код, перевірений
на безпеку, та запобігає доступу до небезпечних операцій, таких як взаємодія з
файловою системою або виконання небезпечних команд.
4. Керування виключеннями: CLR дозволяє обробляти та керувати виключеннями,
що допомагає виявляти та вирішувати помилки в програмах.
5. Інтероперабельність: CLR забезпечує інтероперабельність між мовами
програмування, підтримуючи їх взаємну взаємодію та використання об'єктів, що
створені на різних мовах.
6. Рефлексія: CLR надає можливість рефлексії, що дозволяє динамічно отримувати
доступ до типів, викликати методи та отримувати доступ до членів об'єктів під час
виконання програми.
CLR виступає як проміжний рівень між програмою, написаною на мові
програмування .NET, та апаратним забезпеченням, та дозволяє програмам на .NET
розгортатися на різних платформах, які підтримують CLR.

20.Що таке збирач сміття (Garbage Collector) на базовому рівні?

Збирач сміття (Garbage Collector) - це механізм, який використовується в багатьох


сучасних мовах програмування для автоматичного управління пам'яттю
комп'ютера. Його основна функція полягає в тому, щоб автоматично визначати
об'єкти, які більше не використовуються в програмі, вивільнювати пам'ять, зайняту
цими об'єктами, і тим самим забезпечувати ефективніше використання пам'яті.

Принцип роботи збирача сміття полягає в ідентифікації об'єктів, на які не вказує


жоден активний віджет, і видалення їх з пам'яті. Збирач сміття автоматично
відслідковує активні посилання на об'єкти, наприклад, через змінні, структури даних
та стек викликів. Об'єкти, до яких не можливо дістатися через активні посилання,
вважаються "сміттям" і підлягають збиранню.

Основні етапи роботи збирача сміття:

1. Пошук кореневих об'єктів: Під час процесу зборки сміття збирач спочатку
знаходить всі кореневі об'єкти, які відомі системі або відомі безпосередньо з
поточного контексту виконання (наприклад, глобальні змінні, об'єкти на стеку).
2. Маркування: Після знаходження кореневих об'єктів збирач розпочинає процес
маркування. Він помічає всі об'єкти, до яких можна дістатися з кореневих об'єктів.
Всі марковані об'єкти вважаються активними і зберігаються в пам'яті.
3. Сканування: Збирач сміття сканує пам'ять, перевіряючи кожен об'єкт і відмічаючи
ті, до яких можна дістатися, через активні посилання. Об'єкти, які не були
марковані, вважаються сміттям і готуються до видалення.
4. Очищення: На цьому етапі збирач сміття вивільняє пам'ять, зайняту сміттям,
шляхом їх видалення. Це робиться шляхом розподілу пам'яті, яка раніше була
зайнята сміттям, і призначення її для майбутнього використання.

21.Що таке делегат?

В .NET делегат - це тип даних, який представляє посилання на метод. Він дозволяє
передавати метод як аргумент і викликати його пізніше через це посилання. Це
дозволяє створювати гнучкі і потужні механізми для зв'язку об'єктів та реалізації
зворотнього виклику.

Основні властивості делегатів:

1. Посилання на метод: Делегат може використовувати посилання на метод. Це


означає, що ви можете передати метод як параметр до іншого методу або зберегти
його в змінній.
2. Типобезпечний: Делегати є типобезпечними, що означає, що вони дозволяють
прив'язати тільки ті методи, що мають сумісний тип параметрів і тип повернення.
3. Множинні посилання: Ви можете створити делегат, який містить кілька посилань на
методи (мультіделегат), і викликати всі методи одночасно.

У .NET існує кілька вбудованих делегатів, таких як Action, Func, Predicate, які
забезпечують підтримку типових сигнатур методів, щоб не створювати власних
делегатів кожного разу, коли потрібно передати метод. Наприклад:

 Action: Використовується для представлення методів, які не повертають значення.


Це може бути метод без параметрів або метод з використанням параметрів, але
без повернення значення.
 Func: Використовується для представлення методів, які повертають значення.
Перший параметр типу Func - це тип повернення, а решта параметрів - типи
вхідних параметрів.
 Predicate: Використовується для представлення методів, які перевіряють, чи
виконується певна умова. Повертає bool.
22.Чи відрізняється Delegate від Action?

Так, Delegate і Action в .NET - це різні речі, але обидва вони використовуються для
роботи з делегатами.

Delegate - це базовий клас для всіх делегатів в .NET. Він представляє собою
загальний тип делегата і може представляти методи з будь-якими типами
параметрів і поверненням значень. Це означає, що ви можете створювати свої
власні делегати, які можуть використовуватись для представлення різних типів
методів залежно від потреб вашої програми. Однак використання базового класу
Delegate є не таким зручним, оскільки потребує явного вказання типів параметрів і
повернення методу.

Action - це один із вбудованих делегатів в .NET, який вже має фіксований тип
параметрів і не повертає значення (повертається void). Це спрощує використання,
оскільки вам не потрібно явно вказувати типи параметрів. Він визначений в .NET як
генерік делегата і може приймати від 0 до 16 параметрів. Також існують версії
Action для випадків, коли потрібно повертати значення - Func, але це вже інший
тип делегата.

Отже, основна відмінність між Delegate і Action полягає в тому, що Delegate є


базовим класом, який дозволяє створювати власні делегати з будь-якими типами
параметрів і поверненням, тоді як Action - це вбудований тип делегата, який вже
має фіксовані параметри і не повертає значення. Зазвичай варто використовувати
Action або Func там, де вони влаштовують за своїми потребами, оскільки це
дозволяє більш зручно працювати з делегатами і не потребує створення власних.

23.Що таке LINQ і для чого використовується? Наведіть кілька прикладів


застосування LINQ.

LINQ (Language Integrated Query) - це набір технологій, впроваджений в .NET


Framework, що дозволяє виконувати запити та обробку даних незалежно від
джерела даних (наприклад, колекції об'єктів, бази даних, XML-документи тощо).
Використання LINQ робить роботу з даними більш простою, ефективною та
зрозумілою.

Основні переваги використання LINQ:

1. Зручність: LINQ дозволяє писати запити до даних з використанням звичного


синтаксису C# або Visual Basic, що робить код більш зрозумілим та зручним для
розробників.
2. Переносимість: LINQ дозволяє працювати з різними джерелами даних, не залежно
від типу даних чи джерела.
3. Оптимізація: LINQ запити можуть бути оптимізовані компілятором, що допомагає
забезпечити оптимальну продуктивність.
4. Можливості інтелектуального рефакторингу: Благодаря використанню LINQ, ви
можете використовувати різні інструменти, такі як інтелектуальний рефакторинг,
щоб вдосконалити та оптимізувати код.
LINQ дозволяє здійснювати різноманітні операції з даними, що значно спрощує розробку
та покращує продуктивність коду. Він використовується широко в різних проектах на
платформі .NET для обробки та фільтрації даних, звертання до баз даних, виконання
обчислень тощо.

24.Що таке простір імен (namespace) і навіщо це потрібно?

Простір імен (namespace) в .NET - це механізм організації коду, який дозволяє


групувати різні класи, структури, інтерфейси, делегати та інші типи даних, щоб
уникнути конфліктів імен і покращити структуру проекту. Використання просторів
імен забезпечує чистоту та організованість коду, роблячи його більш зрозумілим і
легким для розуміння.

Основні переваги використання просторів імен в .NET:

1. Уникнення конфліктів імен: Простори імен дозволяють використовувати однакові


імена для різних класів і об'єктів у межах різних просторів імен, що допомагає
уникнути конфліктів імен і зберігає структуру коду.
2. Ієрархічна організація коду: Простори імен можуть бути вкладені один в одного,
дозволяючи створювати ієрархію, яка відображає логічну структуру програми або
проекту.
3. Керованість залежностей: З використанням просторів імен, ви можете легко
керувати залежностями між класами і зробити код більш модульним.
4. Доступ до типів: Застосування простору імен дозволяє зручно викликати класи і
інші типи даних з інших частин коду, що полегшує розробку та підтримку програми.

25.Які типи даних ви знаєте?

В .NET є кілька основних типів даних, які можуть бути використані для зберігання
різних видів інформації. Ось деякі з них:

1. Числові типи:
 int: 32-бітне ціле число.
 long: 64-бітне ціле число.
 float: 32-бітне число з плаваючою точкою.
 double: 64-бітне число з плаваючою точкою.
 decimal: 128-бітне число з плаваючою точкою з великою точністю.
2. Типи символів і рядків:
 char: 16-бітний символ Unicode.
 string: послідовність символів Unicode.
3. Типи булеві:
 bool: логічний тип, який може мати значення true або false.
4. Тип дати і часу:
 DateTime: тип для представлення дати та часу.
5. Масиви:
 T[]: одновимірний масив з елементами типу T.
 [,]: двовимірний масив.
 [][]: масив масивів (рваний масив).
6. Колекції:
 List<T>: список, який може містити елементи типу T.
 Dictionary<TKey, TValue>: словник, який зберігає пари ключ-значення.
 HashSet<T>: множина, яка містить унікальні елементи типу T .
7. Nullable типи:
 int?: ціле число з можливістю бути null.
8. Перечислення (enum):
 enum: набір іменованих цілочисельних констант.
9. Динамічний тип:
 dynamic: тип, який дозволяє визначати тип даних під час виконання
програми

26.Які примітивні типи знаєте?

В .NET примітивні типи даних, відомі також як вбудовані типи даних, представляють
основні типи, які не є об'єктами, а виступають як основні одиниці даних і займають
фіксовані розміри в пам'яті. Ось деякі з примітивних типів даних в .NET:

1. Цілі числа:
 int: 32-бітне ціле число, з діапазоном приблизно від -2,147,483,648 до
2,147,483,647.
 long: 64-бітне ціле число, з діапазоном приблизно від -
9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
 short: 16-бітне ціле число, з діапазоном приблизно від -32,768 до 32,767.
 byte: 8-бітне ціле число, з діапазоном від 0 до 255.
 sbyte: 8-бітне ціле число, з діапазоном приблизно від -128 до 127.
2. Числа з плаваючою точкою:
 float: 32-бітне число з плаваючою точкою (одинарної точності).
 double: 64-бітне число з плаваючою точкою (подвійної точності).
3. Символи:
 char: 16-бітний символ Unicode.
4. Логічний тип:
 bool: логічний тип, який може мати значення true або false.

Ці примітивні типи не є об'єктами, і вони мають значно менший наклад на пам'ять


та продуктивність порівняно з вбудованими типами абстракцій, такими як int або
float. Примітивні типи використовуються для представлення простих даних і
зазвичай мають прямий відповідний аппаратний рівень реалізації в більшості
архітектур комп'ютерів.

27.Що таке Nullable-тип?

Nullable-тип в .NET це тип даних, який дозволяє зберігати значення типу, а також
додатковою можливістю мати значення null. В інших словах, Nullable-тип дозволяє
представляти об'єкт, який може мати значення, подібне до примітивних типів, або
бути "пустим", тобто null.

У більшості випадків, коли ви використовуєте змінні примітивних типів (такі як int,


float, bool тощо), вони не можуть мати значення null. Якщо змінна примітивного
типу не має призначеного значення, вона приймає значення за замовчуванням
(наприклад, 0 для числових типів). Однак, є випадки, коли потрібно, щоб змінна
мала значення null, для позначення того, що вона ще не має призначеного
значення або не має значення взагалі.

Nullable-типи особливо корисні, коли ви маєте справу з базами даних або даними
зовнішніх джерел, де деякі значення можуть бути відсутніми. Вони дозволяють чітко
виражати, що деякі змінні можуть бути некоректними, і роблять код більш безпечним і
зрозумілим.

28.Що таке тип значення, а що таке тип посилання? Що з цього class,


а що struct? У якій ділянці пам’яті вони зберігаються?

1. Тип значення:
 Тип значення представляє одне значення і зберігає його напряму в області
пам'яті, відомої як стек (stack).
 Змінні типу значення містять фактичне значення, а не посилання на нього.
 Коли змінна типу значення копіюється або передається в якості параметра,
копіюється саме значення.
 Коли ви оголошуєте змінну типу значення, вона зазвичай має значення за
замовчуванням.
Приклади типів значення: int, float, char, bool, struct, тощо.
2. Тип посилання:
 Тип посилання представляє посилання на об'єкт або інший тип.
 Змінні типу посилання містять адресу пам'яті, де зберігається фактичний
об'єкт або значення.
 Коли змінна типу посилання копіюється або передається в якості параметра,
копіюється лише адреса, а не сам об'єкт.
 Оскільки об'єкти знаходяться на кучі (heap), вони можуть існувати довше, ніж
змінні типу значення, які існують лише в межах своїх областей.
Приклади типів посилання: class, interface, delegate, object, тощо.

Структури (struct) є типами значення, вони можуть містити як прості значення, так і
інші структури. Структури часто використовуються для представлення невеликих
об'єктів з декількома властивостями і мають менший наклад на пам'ять, оскільки
зберігаються на стеці.
Класи (class) є типами посилання, і вони можуть мати більший розмір, оскільки
зберігаються на кучі (heap). Класи дозволяють створювати складні структури з
методами, властивостями та іншими типами даних.

Загалом, використовуйте структури, якщо вам потрібна проста структура з


невеликою кількістю даних, і використовуйте класи, якщо ви хочете створити більш
складні об'єкти з функціональністю та поведінкою. Зверніть увагу, що в .NET також
є значимі посилання (ref struct), які представляють спеціальний випадок структур,
які зберігаються на стеці, але це вже більш продвинута тема.

29.Чим відрізняються value від reference type? String — це reference


чи value?

В .NET основна відмінність між value і reference type полягає у тому, як вони
зберігаються та взаємодіють з пам'яттю:

1. Value Type (Тип значення):


 Value type є простими типами даних, які зберігаються напряму в стеці (stack).
 Змінні, що мають value type, містять фактичне значення, а не посилання на
нього.
 Копіювання value type змінних приводить до копіювання самого значення.
 Value type мають фіксований розмір пам'яті.

Приклади value type: int, float, char, bool, struct (структури), enum тощо.

2. Reference Type (Тип посилання):


 Reference type вказують на об'єкти або значення, які зберігаються на купі
(heap).
 Змінні, що мають reference type, містять адресу пам'яті, де зберігається
фактичний об'єкт.
 Копіювання reference type змінних приводить до копіювання лише
посилання на об'єкт, а не самого об'єкта.
 Reference type мають змінний розмір пам'яті, так як залежать від розміру
об'єктів, які вони вказують.

Приклади reference type: class (класи), interface, delegate, string (рядки), object тощо.

Отже, щодо вашого питання, String в .NET є представником reference type. Рядки
(String) у .NET зберігаються на купі (heap) та є неімутабельними, що означає, що їх
значення не можна змінювати після створення. Коли ви створюєте новий рядок
або змінюєте існуючий, насправді створюється новий об'єкт рядка, а не змінюється
оригінальний. Оскільки рядки можуть бути досить великими та займати багато
пам'яті, зберігання їх на стеці було б неефективним, тому вони зберігаються на купі
за допомогою reference type.
30.В чому відмінність між string builder і string?

В .NET-платформе (наприклад, в C#), існують дві основні структури для роботи з


рядками: StringBuilder та string. Вони мають кілька відмінностей, і призначені
для різних використань:

1. Неякарність (Mutability):
 string: Рядки в C# є незмінними (immutable), що означає, що після створення
рядка ви не можете його змінити. Кожне змінення рядка фактично приводить до
створення нового об'єкта рядка. Це може бути неефективним при обробці багато
рядків, оскільки прийдеться створювати багато проміжних об'єктів.
 StringBuilder: Це мутабельна структура даних для роботи з рядками. Вона
дозволяє маніпулювати рядком, додаючи, видаляючи або змінюючи його, без
створення нових об'єктів рядка. Використання StringBuilder може бути значно
ефективнішим для складних операцій над рядками, особливо коли необхідно
виконувати багато змінень.
2. Використання:
 string: Використовується для представлення незмінних рядків даних. Це найбільш
поширений тип для представлення текстових даних в C#.
 StringBuilder: Використовується тоді, коли маємо потребу будувати рядок шляхом
додавання частин до нього. Це корисно, наприклад, при зчитуванні багато рядків з
файлу, побудові складних SQL-запитів, форматуванні виводу тощо.
3. Взаємодія з іншими класами:
 string: Рядок (string) може взаємодіяти з багатьма іншими класами і бібліотеками, і
найчастіше використовується для представлення даних у форматі, який є
зрозумілим для більшості методів і функцій.
 StringBuilder: StringBuilder дозволяє виконувати побудову рядків
безпосередньо, проте, якщо потрібно передати результат до методу, який очікує
рядок (string), ви можете сконвертувати StringBuilder до string, використовуючи
його метод ToString().

Підсумовуючи, використовуйте string, якщо потрібно працювати з незмінним


рядком або взаємодіяти з методами, що очікують рядок. За своєю чергою,
використовуйте StringBuilder, якщо побудова рядка вимагає багатьох змінень та
операцій, щоб забезпечити більшу ефективність та продуктивність.

31.Що таке дженерики? Які проблеми вони вирішують?


Дженерики (Generics) - це механізм в програмуванні, який дозволяє створювати
універсальні, параметризовані типи, методи та класи, які можуть працювати з різними
типами даних.

32.Що таке boxing/unboxing? .NET

Boxing і Unboxing - це процеси в .NET Framework, пов'язані з перетворенням значкових


типів даних (value types) в посилальні типи даних (reference types) і навпаки.

Boxing: Це процес, коли значковий тип даних (наприклад, int, double, bool тощо)
перетворюється в посилальний тип (object або інтерфейсний тип).

Unboxing: Це процес, коли значення з посилального типу повертається до його значкового


типу. Під час unboxing звертається перевірка типів, щоб впевнитись, що тип даних
збережений у посиланні дійсно відповідає типу, до якого здійснюється приведення.

33.Що таке Array, List, HashSet, Dictionary? Наведіть приклади використання


цих структур даних. Яка складність операцій з ними (пошук, вставка,
видалення)?

Array (Масив): Масив - це фіксований контейнер, який містить елементи одного типу даних.
Розмір масиву задається під час створення і не може бути змінений після цього.

List (Список): Список - це динамічний контейнер, який також містить елементи одного типу
даних. Розмір списку може змінюватись динамічно, коли додаються або видаляються
елементи.

HashSet: HashSet - це колекція, яка зберігає лише унікальні значення. Дублікати не


допускаються, і вони автоматично видаляються з колекції.

Dictionary (Словник): Словник - це колекція ключ-значення, де кожен ключ повинен бути


унікальним. Використовується для швидкого доступу до значення за ключем.

34.Які знаєте колекції?

1. List<T>: Динамічний список, що зберігає елементи в послідовності і дозволяє


повторення. Реалізує інтерфейс IList<T>.
2. LinkedList<T>: Подвійно зв'язаний список, в якому кожен елемент містить
посилання на наступний і попередній елемент. Реалізує інтерфейс ICollection<T>.
3. Queue<T>: Черга (FIFO - першим прийшов, першим пішов), яка зберігає елементи в
порядку додавання і дозволяє доступ тільки до першого елемента черги. Реалізує
інтерфейс ICollection<T>.
4. Stack<T>: Стек (LIFO - останнім прийшов, першим пішов), який зберігає елементи і
дозволяє доступ тільки до останнього доданого елемента. Реалізує інтерфейс
ICollection<T>.
5. HashSet<T>: Колекція, яка зберігає лише унікальні елементи і не дозволяє
дублікати. Реалізує інтерфейс ICollection<T>.
6. Dictionary<TKey, TValue>: Колекція ключ-значення, де кожен ключ повинен бути
унікальним, і відповідний йому значення може бути отриманий за допомогою
ключа. Реалізує інтерфейс IDictionary<TKey, TValue>.
7. SortedList<TKey, TValue>: Список ключ-значення, де ключі автоматично сортуються
у порядку зростання. Реалізує інтерфейс IList<T> та IDictionary<TKey, TValue>.
8. SortedDictionary<TKey, TValue>: Словник, у якому ключі автоматично сортуються у
порядку зростання. Реалізує інтерфейс IDictionary<TKey, TValue>.
9. ObservableCollection<T>: Колекція, яка надсилає події, коли її елементи змінюються.
Часто використовується з інтерфейсом INotifyPropertyChanged для реалізації
зв'язування даних (data binding) у WPF та інших XAML-подібних технологіях.

35.Що робить оператор yield?

Оператор yield використовується для реалізації генераторів у C#. Генератор - це


функція або метод, який може повертати послідовність значень одне за одним, при
цьому зберігаючи свій стан між викликами. Кожен раз, коли генератор повертає
значення, виконання методу зупиняється, а його стан залишається "замороженим".
При наступному виклику методу, виконання продовжується з місця, де було
зупинено, і генератор продовжує повертати наступні значення.

Оператор yield може бути використаний в контексті методів, які повертають


IEnumerable<T>, IEnumerator<T> або IEnumerable. Це дозволяє створити ітератори
для обходу даних без необхідності зберігати всю послідовність в пам'яті, що
дозволяє ефективно працювати з великими об'ємами даних.

36.Що таке клас?

клас є базовим будівельним блоком об'єктно-орієнтованого програмування. Клас визначає


структуру та поведінку об'єкта, який може мати властивості (поля), методи та події. Він
служить шаблоном для створення об'єктів, які є інстансами цього класу.

37.Чим відрізняється клас від абстрактного класу?


Клас:

 Клас є типом даних, який описує структуру і поведінку об'єкта.


 Ви можете створювати об'єкти на основі класу.
 Клас може містити поля, властивості, методи, події, індексатори та конструктори.
 Класи можуть бути інстансами і успадковуватися один від одного.
 Класи можуть бути створені та використані без обмежень.

Абстрактний клас:

 Абстрактний клас є типом даних, який може містити абстрактні методи, але не
обов'язково повний набір реалізацій.
 Ви не можете створювати об'єкти абстрактних класів безпосередньо. Вони
створюються тільки для успадковування.
 Абстрактний клас може містити абстрактні методи, які не мають реалізації в самому
класі, але обов'язково повинні бути перевизначені в похідних класах.
 Абстрактні класи використовуються для створення базової функціональності та
набору методів, які повинні бути реалізовані в похідних класах.
 Клас, який успадковує абстрактний клас, повинен реалізувати всі абстрактні методи
цього класу.

38.Чим відрізняється абстрактний клас від інтерфейсу? Для чого потрібні інтерфейси і які
завдання вони виконують?

Абстрактний клас:

 Абстрактний клас може містити як абстрактні методи (методи без реалізації), так і
звичайні методи з реалізацією.
 Клас може успадковувати від одного абстрактного класу.
 Абстрактний клас може містити поля, властивості, методи, конструктори, події та
інші елементи.
 Абстрактні класи можуть мати імплементовані методи, що зменшує повторювану
реалізацію у похідних класах.

Інтерфейс:

 Інтерфейс визначає контракт, який повинен бути реалізований в класах, які


успадковують цей інтерфейс.
 Інтерфейс може містити лише абстрактні методи та властивості без реалізації.
 Клас може реалізовувати багато інтерфейсів одночасно, що дозволяє додавати
різні функціональності до класу з різних джерел.
 Використання інтерфейсів дозволяє досягти більшої гнучкості, оскільки класи
можуть реалізовувати різні інтерфейси, незалежно від ієрархії успадкування.

39.Які ви знаєте модифікатори доступу?

1. public: Елемент з цим модифікатором доступу доступний з будь-якої частини


програми.
2. private: Елемент з цим модифікатором доступу доступний лише всередині того
самого класу, в якому він оголошений. Він недоступний з будь-яких інших класів чи
зовнішніх викликів.
3. protected: Елемент з цим модифікатором доступу доступний лише всередині того
самого класу та його похідних класів.
4. internal: Елемент з цим модифікатором доступу доступний всередині того самого
проекту (assembly). Це дозволяє обмежити доступ до деяких елементів лише
всередині одного проекту.
5. protected internal: Цей модифікатор поєднує властивості protected та internal,
дозволяючи доступ до елемента з будь-якої частини того самого проекту та його
похідних класів.
6. private protected: Цей модифікатор дозволяє обмежити доступ до елемента лише
всередині того самого проекту та його похідних класів, які також знаходяться в
цьому проекті.

40.У чому різниця між звичайним класом і статичним?


1. Звичайний клас (Instance Class):
 Це тип класу, який може мати багато екземплярів (об'єктів) створених з
нього.
 Кожен екземпляр цього класу має свої власні поля, властивості і методи.
 Для доступу до членів звичайного класу потрібно створити об'єкт цього
класу.
2. Статичний клас (Static Class):
 Статичний клас є спеціальним типом класу, який не може бути
інстанційованим (тобто з нього не можна створити об'єкт).
 Всі члени статичного класу (поля, властивості, методи) також повинні бути
статичними.
 Статичні класи використовуються для групування функцій, які не потребують
збереження стану, і можуть викликатися без створення об'єкта.

Різниця між звичайним класом і статичним класом в .NET включає наступне:


 Створення об'єктів: Звичайні класи можна інстанціювати, створюючи нові об'єкти,
тоді як статичні класи не можуть бути інстанційовані.
 Збереження стану: Звичайні класи можуть містити поля і властивості для
збереження стану окремих об'єктів, тоді як статичні класи не можуть зберігати стан,
оскільки вони використовуються як контейнери для статичних методів і не мають
індивідуального стану для кожного виклику.
 Виклик методів: Методи звичайних класів викликаються через об'єкт класу, тоді як
методи статичних класів можна викликати без створення об'єкта, використовуючи
назву класу.
 Синтаксичний доступ: Для доступу до членів звичайного класу потрібно
використовувати об'єкт, наприклад: myInstance.Method(). Для статичних класів
доступ відбувається напряму через клас: MyStaticClass.Method().

41.У чому різниця перевизначення методу між ключовими словами new


та override?

1. override:
 Ключове слово override вказує, що метод у похідному класі перевизначає
метод базового класу.
 Метод, позначений як override, повинен мати таку ж саму сигнатуру, як і
метод у базовому класі.
 Під час виклику методу з екземпляра похідного класу буде використована
реалізація методу з цього похідного класу, навіть якщо метод викликається
через посилання на базовий клас.

2.
3. new:
 Ключове слово new вказує, що метод у похідному класі повністю
перевизначає метод базового класу, але це не пов'язано з поліморфізмом, як
у випадку override.
 Метод, позначений як new, також повинен мати таку ж саму сигнатуру, як і
метод у базовому класі.
 Відмінність в тому, що при виклику методу з екземпляра похідного класу
через посилання на базовий клас буде використана реалізація методу з
базового класу, незважаючи на наявність методу з ключовим словом new у
похідному класі.

42.Яка відмінність між const та read only?


const:
 Змінні, оголошені з використанням ключового слова const, є
компіляційними константами.
 Значення const має бути присвоєне при оголошенні і не може бути змінене
під час виконання програми.
 const використовується для оголошення глобальних констант.
 const є статичним (зв'язаним з типом), тобто значення буде відоме вже на
етапі компіляції.
readonly:
 Змінні, оголошені з використанням ключового слова readonly, є
екземплярними константами.
 Значення readonly може бути встановлене в конструкторі класу, і після того
воно не може бути змінене.
 readonly використовується для оголошення значень, які можуть бути
встановлені лише в конструкторі або під час оголошення.
 readonly є екземплярним (зв'язаним з екземпляром класу), тому його
значення може різнитися для різних об'єктів цього класу.

43.Різниця між структурою і класом. Наведіть приклади


структур
1. Семантика збереження даних:
 Структури: Структури є типами значень. Це означає, що структури
передаються за значенням (копіюються) при передачі в методи або при
присвоєнні.
 Класи: Класи є посиланнями на об'єкти. Вони передаються за посиланням
(по ссилці), тобто зміни в одному екземплярі класу впливають на всі
посилання на цей екземпляр.
2. Властивості та методи:
 Структури: Структури можуть містити поля, методи, властивості і події.
 Класи: Класи можуть містити те ж саме, що і структури, а також можуть бути
успадковані і мати доступ до інших класів або інтерфейсів.
3. Наслідування:
 Структури: Структури не підтримують наслідування від інших типів (класів
або структур), вони завжди наслідуються від типу System.ValueType.
 Класи: Класи можуть успадковувати інші класи або інтерфейси.
4. Вирівнювання в пам'яті:
 Структури: Зазвичай структури вирівнюються по їхньому розміру, що може
призводити до кращої використання пам'яті для невеликих об'єктів.
 Класи: Класи можуть мати більший оверхед в пам'яті через додаткові дані
про тип та механізми управління об'єктом.
5. Примітка:
 Вибір між структурами і класами залежить від конкретних вимог вашого
додатка. Структури зазвичай використовуються для невеликих типів даних,
які можна ефективно передавати за значенням, тоді як класи
використовуються для більших об'єктів зі складною логікою та можливістю
успадкування.

44.Чи може екземпляр структури зберігатися у купі (heap)? Як це зробити?

Так, в платформі .NET екземпляр структури може бути збережений у купі (heap), але
це відбувається через упакування (boxing) і створення посилання на об'єкт.

За замовчуванням структури зберігаються у стеку, і це дозволяє більш ефективне


управління пам'яттю і швидший доступ. Проте, якщо ви все ж хочете зберегти
структуру у купі, можна використовувати процес упакування:

45.Що таке асинхронність і чим вона відрізняється від багатопотоковості?

1. Асинхронність:
 Використовується для покращення відгуку програми та уникнення
блокування потоку.
 Зазвичай використовується для довготривалих операцій, таких як мережеві
виклики, операції вводу-виводу та інші, які можуть забрати час.
 Асинхронність може бути досягнута за допомогою async/await.
2. Багатопотоковість (Multithreading):
 Використовується для одночасного виконання багатьох операцій на різних
потоках.
 Зазвичай використовується для паралельного виконання завдань з метою
використання доступних ресурсів (наприклад, багатоядерних процесорів).
 В .NET багатопотоковість може бути реалізована за допомогою класів Thread
та Task.

46.Які є ключові слова для використання асинхронності в коді?

Ключове слово async використовується для позначення метода як асинхронного. Це


дозволяє використовувати асинхронний синтаксис усередині методу та включати в ньому
асинхронні виклики. Ключове слово await використовується для чекання завершення
асинхронної операції. Воно вказує програмі, щоб вона зачекала, доки виклик
асинхронного методу завершиться, і потім продовжила виконання інших операцій.

71.Які винятки не можна зупинити в блоці catch?

1. ThreadAbortException: Це виняток, який генерується, коли потік зупиняється (або


"збивається") поза програмою, часто через виклик методу Thread.Abort().
Зупиняти цей виняток у блоках catch не рекомендується, оскільки це може
призвести до некоректної роботи або утримання ресурсів.
2. StackOverflowException: Це виняток, який генерується, коли виклики функцій
рекурсивно спричиняють переповнення стеку викликів. Очищення стеку шляхом
перехоплення цього винятку у блоку catch може бути дуже складним і призвести
до некоректної роботи програми.
3. OutOfMemoryException: Це виняток, який генерується, коли недостатньо вільної
пам'яті для виділення об'єкта. Зупиняти цей виняток у блоках catch може бути
некоректним, оскільки програма може бути в неробочому стані.
4. ExecutionEngineException: Це виняток, який вказує на серйозну проблему з
виконанням програми, таку як неправильна інструкція в коді або недійсний стан
виконання. Зупиняти цей виняток у блоках catch не рекомендується, оскільки це
може призвести до непередбачуваної поведінки.

Взагалі кажучи, зупиняти деякі критичні винятки у блоках catch може призвести до
некоректної роботи програми або навіть до її падіння. Рекомендується
забезпечувати належне управління ресурсами, використовувати механізми
логування та виправлення помилок для обробки винятків у програмі.
72.Яка різниця між .NET Standard Class Library і .NET Core Class Library?

1. .NET Standard Class Library:


 .NET Standard є специфікацією API, яка визначає набір інтерфейсів та
функцій, які повинні бути підтримані відповідними реалізаціями .NET, такими
як .NET Framework, .NET Core та Xamarin.
 .NET Standard Class Library створюється для підтримки платформи .NET
Standard. Такі бібліотеки можуть бути використані в різних реалізаціях .NET,
що підтримують відповідний рівень .NET Standard. Це дозволяє вам
створювати бібліотеки, які можна використовувати в багатьох різних типах
додатків.
2. .NET Core Class Library:
 .NET Core є відкритою, крос-платформеною платформою .NET для розробки
сучасних додатків.
 .NET Core Class Library створюється спеціально для підтримки додатків, які
спираються на платформу .NET Core. Такі бібліотеки можуть містити
функціональність, яка доступна тільки на платформі .NET Core.
Різниця між ними полягає в перевагах та способах використання:

 .NET Standard Class Library використовуються, коли вам потрібно створити


бібліотеку класів, яку можна використовувати в різних типах додатків
(наприклад, .NET Framework, .NET Core, Xamarin і т.д.). Це дозволяє створити
уніфіковану бібліотеку для використання в багатьох проектах.
 .NET Core Class Library використовуються, коли вам потрібно створити бібліотеку
класів, спеціфічну для додатків, які будуть працювати на платформі .NET Core. Це
дозволяє використовувати функціональність, яка доступна тільки на .NET Core, і
створити більш оптимізовану бібліотеку для таких додатків.

73.Поясніть різницю між відкладеним і негайним виконанням в LINQ.


Наведіть приклади.

ізниця між відкладеним (deferred) і негайним (immediate) виконанням в LINQ


пов'язана з часом, коли операції обробки даних (запити LINQ) відбуваються
відносно часу створення запиту.

1. Відкладене виконання (Deferred Execution): Відкладене виконання означає, що


операції LINQ не виконуються негайно при створенні запиту, а лише в той момент,
коли результати потрібні. Запити LINQ відкладають своє виконання до того часу,
коли ви використовуєте їх результати.
Негайне виконання (Immediate Execution): Негайне виконання означає, що операції
LINQ виконуються негайно при створенні запиту, і результати зберігаються. Ви отримуєте
фактичні результати запиту в той самий момент, коли ви створюєте його.

Різниця між відкладеним (deferred) і негайним (immediate) виконанням в LINQ


пов'язана з часом, коли операції обробки даних (запити LINQ) відбуваються
відносно часу створення запиту.

1. Відкладене виконання (Deferred Execution): Відкладене виконання означає, що


операції LINQ не виконуються негайно при створенні запиту, а лише в той момент,
коли результати потрібні. Запити LINQ відкладають своє виконання до того часу,
коли ви використовуєте їх результати.
Приклад відкладеного виконання:
csharpCopy code
var numbers = new List< int > { 1 , 2 , 3 , 4 , 5 }; var query = numbers.Where(n => n % 2 == 0 ); // Запит LINQ
ще не виконаний foreach ( var number in query) { Console.WriteLine(number); // Запит LINQ виконується тут
}
2. Негайне виконання (Immediate Execution): Негайне виконання означає, що
операції LINQ виконуються негайно при створенні запиту, і результати
зберігаються. Ви отримуєте фактичні результати запиту в той самий момент, коли
ви створюєте його.
Зазвичай LINQ запити відкладають виконання, щоб уникнути зайвого обчислення
та оптимізувати продуктивність. Однак в деяких випадках може бути важливо
здійснити негайне виконання, коли потрібно зберегти результати для подальшої
роботи.

Варто зауважити, що використання методів, які викликають негайне виконання


(наприклад, .ToList(), .ToArray(), .Count()), може призвести до додаткових
витрат часу та пам'яті, тому їх варто застосовувати обдумано.

75.Яка різниця між services.AddTransient і services.AddScope в ASP.NET


Core?

services.AddTransient: Коли ви реєструєте службу за допомогою


services.AddTransient, для кожного виклику служби буде створений новий об'єкт. Це
означає, що при кожному виклику залежної служби буде створено новий екземпляр. Такий
підхід корисний, коли вам потрібно, щоб служба була безстатусною і не зберігала стан між
викликами.

services.AddScoped: Коли ви реєструєте службу за допомогою services.AddScoped,


для кожного HTTP-запиту буде створений один і той самий об'єкт. Об'єкт буде жити
впродовж життєвого циклу одного HTTP-запиту. Це дозволяє об'єкту зберігати стан між
різними викликами служби під час обробки одного запиту.

В ASP.NET Core існують різні методи реєстрації служб (services) в контейнері


віддаленого керування об'єктами (IoC) та засобами управління залежностями. Два
таких методи - services.AddTransient і services.AddScoped. Основна різниця між
ними полягає в тому, як тривало будуть жити створені об'єкти.

1. services.AddTransient: Коли ви реєструєте службу за допомогою


services.AddTransient, для кожного виклику служби буде створений новий об'єкт.
Це означає, що при кожному виклику залежної служби буде створено новий
екземпляр. Такий підхід корисний, коли вам потрібно, щоб служба була
безстатусною і не зберігала стан між викликами.
Приклад:
csharpCopy code
services.AddTransient<IMyService, MyService>();
2. services.AddScoped: Коли ви реєструєте службу за допомогою
services.AddScoped, для кожного HTTP-запиту буде створений один і той самий
об'єкт. Об'єкт буде жити впродовж життєвого циклу одного HTTP-запиту. Це
дозволяє об'єкту зберігати стан між різними викликами служби під час обробки
одного запиту.
services.AddScoped<IMyService, MyService>();

Вибір між AddTransient і AddScoped залежить від потреб вашого додатка та того, як
тривало потрібно, щоб об'єкти служб зберігали стан. Якщо ви працюєте з даними,
які мають бути унікальними для кожного HTTP-запиту, то AddScoped може бути
більш відповідним варіантом. Якщо ж вам потрібно створити новий об'єкт кожного
разу, коли його викликають, то AddTransient буде більш відповідним варіантом.

76.Що таке Kestrel?

Kestrel - це високопродуктивний веб-сервер, який входить до складу


технологій .NET і використовується для розгортання веб-додатків під управлінням
платформи .NET Core і .NET 5 (і новіших версій). Kestrel розроблений як частина
проекту ASP.NET Core і є одним із компонентів веб-серверного стеку, який
обробляє вхідні HTTP-запити і передає їх додатку ASP.NET Core для подальшої
обробки.

Одна з особливостей Kestrel - це його висока продуктивність і низький рівень


витрат пам'яті. Він призначений для обробки великої кількості одночасних
підключень, що робить його відмінним вибором для сучасних веб-додатків, які
мають високі вимоги до продуктивності.

Важливо зазначити, що в багатьох випадках Kestrel використовується як внутрішній


сервер, і перед ним розташовується реверс-проксі сервер (наприклад, Nginx або
Apache), який може виконувати функції обробки SSL, балансування навантаження
та інших завдань.

54.Ви набираєте google.com у браузері. Розкажіть якомога докладніше,


що відбувається в цей час на HTTP-рівні?

1. Розрізнення домену: Браузер аналізує введений вами URL "google.com" і


визначає, що це доменне ім'я. Браузер переводить це ім'я в IP-адресу за
допомогою DNS-запиту.
2. DNS-запит: Браузер відправляє запит до DNS-сервера, щоб отримати IP-адресу,
пов'язану з доменом "google.com". Це виконується для того, щоб браузер міг
звернутися до веб-сервера, що розташований за цією IP-адресою.
3. Встановлення з'єднання: Браузер встановлює TCP-з'єднання з веб-сервером,
використовуючи IP-адресу та порт (зазвичай порт 80 для HTTP).
4. Відправка запиту: Після встановлення з'єднання браузер відправляє HTTP-запит на
сервер. Запит містить метод (наприклад, GET), URI (Uniform Resource Identifier, що
вказує на конкретний ресурс), HTTP-версію і можливі додаткові заголовки
(наприклад, User-Agent, що вказує, який браузер ви використовуєте).
5. Обробка запиту на сервері: Веб-сервер "google.com" отримує ваш запит і
обробляє його. Він визначає, який ресурс ви запитуєте, та готує відповідь.
6. Відправка відповіді: Веб-сервер генерує HTTP-відповідь, яка містить статусний код
(наприклад, 200 OK для успішної відповіді), заголовки (Content-Type, Content-Length
тощо) і вміст веб-сторінки (HTML-код).
7. Отримання відповіді браузером: Браузер отримує HTTP-відповідь і починає
обробку. Він аналізує статусний код, заголовки і вміст сторінки.
8. Відображення сторінки: Браузер рендерить HTML-код, оброблює CSS-стилі,
виконує JavaScript і будує структуру сторінки. Ви бачите результат на своєму екрані.

55.Як працює HTTPS?

Протокол HTTPS (Hypertext Transfer Protocol Secure) є захищеною версією


звичайного HTTP і забезпечує безпечний обмін даними між веб-браузером
користувача та веб-сервером зашифрованим шляхом. Основна відмінність між
HTTP і HTTPS полягає в застосуванні шифрування та аутентифікації для захисту
конфіденційності та цілісності даних під час передачі.

Ось як працює HTTPS:

1. Запит на SSL/TLS-з'єднання: Коли браузер користувача намагається звернутися до


веб-сайту за допомогою HTTPS, веб-сервер надсилає цілу серію даних, включаючи
публічний ключ для шифрування, у відповідь на запит браузера. Ці дані
називаються "сертифікатом SSL/TLS".
2. Публічний ключ і шифрування: Браузер отримує сертифікат SSL/TLS від веб-
сервера. Він перевіряє цей сертифікат за допомогою довірених кореневих
сертифікатів, що містяться в браузері або операційній системі користувача. Після
підтвердження дійсності сертифіката, браузер отримує публічний ключ сервера і
розпочинає процес обміну ключами для симетричного шифрування.
3. Симетричне шифрування: Після отримання публічного ключа, браузер генерує
секретний ключ для симетричного шифрування (зазвичай симетричний ключ AES).
Цей секретний ключ буде використовуватися для шифрування та розшифрування
даних під час зв'язку.
4. Обмін симетричним ключем: Браузер шифрує секретний ключ симетричного
шифрування за допомогою публічного ключа сервера і відправляє його на сервер.
Тільки сервер, володіючи приватним ключем, зможе розшифрувати цей секретний
ключ.
5. Захищений зв'язок: Коли з'єднання між браузером і сервером установлено, дані,
які передаються між ними, шифруються симетричним ключем. Це забезпечує
конфіденційність даних під час їх передачі по мережі.
6. Цілісність даних: Додатково до шифрування, HTTPS також забезпечує перевірку
цілісності даних. Передача хеш-коду (перевірочного суми) даних разом з ними
дозволяє браузеру перевірити, чи були дані під час передачі змінені.

56.Як ви розумієте SOLID?

1. Принцип однієї відповідальності (Single Responsibility Principle, SRP): Клас


повинен мати лише одну причину для зміни. Це означає, що клас повинен
виконувати лише одну конкретну функцію або відповідальність. Це сприяє більшій
зрозумілості, легкості тестування і зменшує залежність між різними аспектами
програми.
2. Принцип відкритості/закритості (Open/Closed Principle, OCP): Програмні
сутності (класи, модулі, функції і т.д.) повинні бути відкритими для розширення, але
закритими для змін. Це означає, що новий функціонал можна додати, не змінюючи
вже існуючий код.
3. Принцип підстановки Лісков (Liskov Substitution Principle, LSP): Об'єкти
підкласів повинні можна використовувати взамін об'єктів базового класу без зміни
коректності програми. Це означає, що класи-спадкоємці повинні дотримуватися
контрактів і поведінки базового класу.
4. Принцип розділення інтерфейсу та реалізації (Interface Segregation Principle,
ISP): Клієнти не повинні залежати від інтерфейсів, які вони не використовують. Це
означає, що великі інтерфейси повинні бути розділені на менші і більш специфічні,
щоб клієнти отримували тільки ті методи, які їм потрібні.
5. Принцип інверсії залежності (Dependency Inversion Principle, DIP):
Високорівневі модулі не повинні залежати від низькорівневих модулів. Обидва
типи модулів повинні залежати від абстракцій. Це принцип сприяє зменшенню
прямих залежностей між класами і підвищує гнучкість програми.

57.Які протоколи серіалізації ви знаєте і де вони застосовуються?

Протоколи серіалізації використовуються для перетворення об'єктів або даних у


формат, який може бути збережений або переданий по мережі, і потім
відновлення цих даних у початковий стан. Ось деякі з найпоширеніших протоколів
серіалізації та їхні застосування:

1. JSON (JavaScript Object Notation):


 Використання: Веб-сервіси, обмін даними між клієнтом та сервером,
зберігання конфігурацій, об'єктів JavaScript.
 Особливості: Легко читається людьми, підтримується більшістю мов
програмування.
2. XML (eXtensible Markup Language):
 Використання: Структуровані документи для обміну даними між системами,
веб-сервіси, конфігураційні файли.
 Особливості: Структурований, може бути валідований за допомогою схем.
3. Protocol Buffers (protobuf):
 Використання: Великі об'єми даних, віддалені виклики методів (RPC) у
мікросервісній архітектурі.
 Особливості: Висока швидкість та ефективність, компактний формат.
4. MessagePack:
 Використання: Високопродуктивні застосування, мережевий обмін даними,
кешування.
 Особливості: Дуже компактний формат, підтримує багато мов
програмування.
5. YAML (YAML Ain't Markup Language):
 Використання: Конфігураційні файли, структуровані дані для людей.
 Особливості: Легко читається людьми, дружній до використання.
6. BSON (Binary JSON):
 Використання: Зберігання даних в NoSQL базах даних, наприклад, MongoDB.
 Особливості: Бінарний формат JSON з додатковою підтримкою даних,
швидкий доступ.

58.Що таке у вашому розумінні чиста функція? Які у неї переваги?

У моєму розумінні, чиста функція - це функція в програмуванні, яка має дві основні
властивості:

1. Детермінованість: Результат виклику чистої функції визначається лише її вхідними


параметрами. Однакові вхідні дані завжди призводять до однакового результату.
Це означає, що чиста функція не залежить від стану програми, глобальних змінних
або зовнішніх факторів.
2. Відсутність побічних ефектів: Чиста функція не змінює стану програми або
виконує дії, які можуть вплинути на зовнішнє середовище. Вона не має побічних
ефектів, таких як зміна глобальних змінних, запис в файл або мережевий запит.

Переваги чистих функцій:

1. Простота та зрозумілість: Чисті функції зазвичай легше розуміти і тестувати,


оскільки їхнє поведінка визначена лише вхідними параметрами.
2. Відновлюваність: Детермінованість дозволяє легше відлагоджувати програму та
відстежувати проблеми.
3. Безпека та стабільність: Відсутність побічних ефектів робить програму менш
вразливою до непередбачуваних змін і взаємодій.
4. Можливість оптимізації: Завдяки детермінованості, компілятори та оптимізатори
можуть ефективно оптимізувати чисті функції.
5. Тестова готовність: Тестування чистих функцій стає простішим, оскільки вам
потрібно тестувати лише вхідні параметри та результат, а не побічні ефекти.
6. Повторне використання: Чисті функції можна легко перевикористовувати,
оскільки вони не залежать від контексту.

59.Що таке dependency injection і навіщо воно потрібне?

Dependency Injection (DI) - це концепція в об'єктно-орієнтованому програмуванні,


яка полягає в передачі залежностей (об'єктів, сервісів або компонентів), необхідних
для виконання функціональності, у зовнішній код замість того, щоб їх створювати в
самому об'єкті або класі.

Замість того, щоб створювати залежності всередині класу, ви впроваджуєте їх через


конструктори, методи або інші механізми. Таким чином, контроль над тим, які
конкретні реалізації залежностей використовуються, переноситься на рівень
зовнішнього коду. Це сприяє зниженню залежностей між компонентами і полегшує
тестування, розширення та обслуговування коду.

Переваги Dependency Injection:

1. Зменшення залежностей: Класи отримують залежності ззовні, що дозволяє


знизити ступінь залежності між компонентами системи.
2. Тестова готовність: Ви можете легко вставляти фейкові або моковані залежності
для тестування, що полегшує написання тестів і дозволяє вам тестувати окремі
компоненти незалежно.
3. Гнучкість і розширюваність: Ви можете змінювати поведінку програми,
змінюючи залежності, без необхідності змінювати самі класи.
4. Обмеження "хардкоду": Залежності визначаються ззовні, що допомагає уникнути
"хардкоду" і робить код більш адаптованим до змін.
5. Зрозумілість і чистота: Класи стають менш залежними один від одного, що
поліпшує структуру коду та його зрозумілість.
60.Що таке cohesion та coupling (зв’язаність і зв’язність)?

1. Cohesion (Зв’язність): Це міра того, наскільки сильно спрямовані елементи в


межах одного компонента на виконання однієї таємниці або функції. Висока
зв'язність означає, що клас або модуль виконує одну чітку функцію без
надлишкових або незв'язаних завдань. Зв'язність важлива для підтримки чистоти
коду, розробки та тестування.

Типи зв'язності:

 Функціональна зв'язність: Всі елементи виконують одну і ту ж функцію.


 Серійна (Sequential) зв'язність: Вихід деякого елемента є входом для іншого.
 Зв'язність за змінами (Change) зв'язність: Всі елементи змінюються одночасно і з
однієї причини.
 Логічна зв'язність: Всі елементи виконують схожі функції, але можуть мати різні
виходи.
2. Coupling (Зв’язаність): Це ступінь залежності між двома або більше
компонентами. Низький рівень зв'язаності вказує на те, що зміни в одному
компоненті майже не впливають на інший. Високий рівень зв'язаності може
привести до ситуації, коли зміни в одному компоненті вимагають змін в іншому.

Типи зв'язаності:

 Локальна зв'язаність: Зв'язаність в межах одного модуля або класу.


 Глобальна зв'язаність: Зв'язаність між різними модулями або класами.

Для покращення архітектури та обслуговуваності програм, рекомендується


досягати високого рівня зв'язності всередині компонентів (добре спрямованих
функцій або класів, що роблять одну річ), а також низького рівня зв'язності між
компонентами (зменшення залежностей між ними).

61.Що таке IaaS, PaaS, SaaS і які відмінності між ними?


IaaS, PaaS і SaaS - це абревіатури, які означають різні моделі хмарних послуг (cloud computing
services) залежно від рівня контролю та відповідальності за інфраструктуру та рівень сервісів,
які надаються користувачам. Вони мають свої відмінності в термінах керування, забезпечення,
ресурсів та доступу.

1. IaaS (Infrastructure as a Service): IaaS - це найнижчий рівень хмарних послуг, де надається


доступ до обчислювальних ресурсів (віртуальних машин, сховищ даних, мережевих ресурсів)
через інтернет. Користувачі можуть встановлювати та керувати операційними системами,
додатками, а також масштабувати ресурси згідно потреб.
2. PaaS (Platform as a Service): PaaS - це середній рівень хмарних послуг, де надається платформа
для розробки, виконання та управління додатками без необхідності керування
інфраструктурою. Постачальник хмарної платформи надає різні сервіси, такі як бази даних, веб-
сервери, розробничі засоби, що полегшують розробку та розгортання додатків.
3. SaaS (Software as a Service): SaaS - це найвищий рівень хмарних послуг, де користувачі
отримують доступ до готових додатків та програм через інтернет. Програми розгортаються на
серверах постачальника послуг і доступні користувачам через веб-браузер. Користувачі не
повинні встановлювати, оновлювати чи підтримувати додатки, так як це відбувається на рівні
постачальника.

Відмінності між ними:

 IaaS - це інфраструктура, на якій можна будувати власні рішення, забезпечувати доступ до


віртуальних серверів, мережі та зберігання даних. Користувач відповідає за конфігурацію та
управління ОС та додатками.
 PaaS - це платформа, яка надає розробникам засоби для розробки, тестування та розгортання
додатків. Користувач відповідає за розробку додатків та несе менше відповідальності за
інфраструктуру.
 SaaS - це готові додатки, до яких користувач має доступ через веб-браузер. Користувачі не
відповідають за інфраструктуру, а лише використовують готовий продукт.

Залежно від потреб та вимог проекту, вибір між IaaS, PaaS та SaaS може визначити, наскільки
велику відповідальність ви хочете взяти на себе щодо управління ресурсами та додатками.

62.Які способи налагодження програми ви застосовуєте?

63.Які знаєте патерни? Поясніть суть перерахованих.

1. Паттерн Одинак (Singleton): Гарантує, що клас має тільки один екземпляр та


забороняє створення нових екземплярів. Використовується, коли треба мати
глобальний доступ до єдиного екземпляра.
2. Паттерн Фабричний Метод (Factory Method): Дозволяє створювати об'єкти
підкласів через інтерфейс базового класу. Використовується для створення об'єктів
з певною логікою в їх створенні.
3. Паттерн Абстрактна Фабрика (Abstract Factory): Надає інтерфейс для створення
родин пов'язаних об'єктів без деталей їхньої реалізації. Використовується для
створення групи пов'язаних об'єктів.
4. Паттерн Завантажувач (Lazy Initialization): Відкладене створення об'єкта або
виконання деякої логіки до моменту, коли це дійсно потрібно.
5. Паттерн Декоратор (Decorator): Додає новий функціонал до існуючих об'єктів без
модифікації їхньої структури. Використовується для динамічного додавання
функціоналу.
6. Паттерн Спостерігач (Observer): Визначає залежність між об'єктами таким чином,
що зміна стану одного об'єкта автоматично сповіщає та викликає оновлення інших
залежних об'єктів.
7. Паттерн Стратегія (Strategy): Визначає ряд алгоритмів та дозволяє їх підставляти
під час виконання. Дозволяє змінювати алгоритм, який використовується в об'єкті,
без зміни його структури.
8. Паттерн Заповіщання (Template Method): Визначає загальну структуру
алгоритму, але дозволяє підкласам перевизначити окремі кроки алгоритму.
9. Паттерн Компонувальник (Composite): Дозволяє створювати об'єкти в
ієрархічних структурах деревоподібного типу. Дозволяє обробляти окремі та
складені об'єкти однаковим чином.

64.У чому суть патерну Singleton? Чому його ще називають антипатерном?

Паттерн Singleton - це паттерн проектування, який забезпечує, що клас має лише


один екземпляр і надає глобальну точку доступу до цього екземпляра. Це
досягається за допомогою прихованого конструктора та методу, який повертає
посилання на вже існуючий екземпляр, якщо він вже був створений, або створює
новий екземпляр, якщо його ще немає.

Суть паттерну Singleton:

 Одинак обмежує можливість створення більше одного екземпляра класу.


 Він надає глобальний доступ до цього єдиного екземпляра через статичний метод.
 Цей паттерн корисний у випадках, коли треба мати єдиний доступ до загальних
ресурсів (наприклад, логгер, конфігураційні дані тощо).
Хоча Singleton може бути корисним в деяких випадках, його також називають
антипатерном з певних причин:

1. Глобальний стан: Використання Singleton може призводити до створення


глобального стану, який важко керувати та тестувати.
2. Сховище для коду: Singleton може стати сховищем для коду, який слід розділити
на менші компоненти.
3. Спрощення моделі дизайну: Іноді використання Singleton може свідчити про те,
що дизайн програми спрощений через велику кількість залежностей від єдиного
об'єкта.
4. Ускладнює тестування: Тести для класів, які залежать від Singleton, можуть бути
важкими, оскільки це може вимагати взаємодії з реальними об'єктами, які не
завжди легко контролювати під час тестування.
5. Може порушувати принцип єдиної відповідальності: Singleton може накладати
на клас більше відповідальностей, ніж необхідно, і тим самим порушувати принцип
єдиної відповідальності (Single Responsibility Principle).

Враховуючи ці аспекти, варто ретельно обирати, коли і де використовувати


Singleton, і розглядати можливі альтернативи, такі як передача залежностей,
інверсія керування (Dependency Injection), щоб уникнути негативних аспектів його
використання.

65.Для чого потрібен патерн Strategy?

Паттерн Strategy (Стратегія) використовується для визначення різних алгоритмів


або підходів (стратегій) для вирішення одної та тієї ж проблеми. Він дозволяє
об'єкту змінювати стратегію виконання під час виконання програми, не змінюючи
його структури. Основна ідея полягає в визначенні сімейства різних алгоритмів та
можливості змінювати їх взаємозамінно.

Суть паттерну Strategy полягає в виокремленні алгоритмів від об'єкту, який їх


використовує. Це дозволяє підставляти різні алгоритми залежно від потреби без
зміни коду клієнтського об'єкту. Такий підхід сприяє зменшенню залежності між
клієнтом і конкретними алгоритмами.

Сценарії використання паттерну Strategy:

1. Обробка різних алгоритмів: Коли потрібно вирішити одну задачу різними


способами або з різними алгоритмами, наприклад, сортування даних.
2. Заміна алгоритмів на льоту: Коли під час виконання програми потрібно
змінювати алгоритм, який використовується, без внесення змін до клієнтського
коду.
3. Розділення бізнес-логіки та алгоритміки: Якщо є необхідність відокремити
бізнес-логіку від різних алгоритмів, паттерн Strategy дозволяє це зробити,
зберігаючи гнучкість.
4. Реалізація патерну "впливання" (inversion of control): Паттерн Strategy
допомагає реалізувати принцип "впливання" (IoC) та інверсії керування, коли не
клієнт вибирає алгоритм, а алгоритм "підказує" клієнту, як його виконувати.

Паттерн Strategy допомагає створити більш гнучку та підтримувану архітектуру


програми, дозволяючи змінювати поведінку об'єкту без зміни його коду та
забезпечуючи можливість підставляти різні алгоритми в залежності від потреб.

66.Які ключові відмінності між розподіленими системами та монолітними?

Розподілені системи та монолітні застосунки мають різні підходи до архітектури та


організації коду. Ось ключові відмінності між ними:

Монолітні застосунки (.NET):

1. Архітектура: У монолітних застосунках весь код, логіка та функціонал розташовані


в одному великому модулі або компоненті. Це означає, що весь код запускається
разом.
2. Масштабованість: Масштабувати монолітні застосунки може бути складніше,
оскільки весь стек технологій доводиться масштабувати разом.
3. Розвиток: Розвивати та розширювати монолітні застосунки може стати
проблематичним через велику кількість коду та можливість появи залежностей між
різними частинами.
4. Ризики виходу з ладу: Проблеми в одному компоненті можуть вплинути на весь
застосунок, що може призвести до великих збоїв.

Розподілені системи (.NET):

1. Мікросервісна архітектура: У розподілених системах великий застосунок


розбивається на менші незалежні мікросервіси. Кожен мікросервіс виконує
конкретну функцію та може бути розвинутий, масштабований та розгорнутий
окремо.
2. Масштабованість: Масштабувати окремі мікросервіси може бути ефективніше,
оскільки ви можете масштабувати лише ті сервіси, які вимагають більше ресурсів.
3. Розвиток: Розробка та розгортання нового функціоналу може бути ефективнішою,
оскільки вона зосереджена на конкретному мікросервісі без значних змін у інших
частинах системи.
4. Ризики виходу з ладу: Помилки в одному мікросервісі зазвичай не впливають на
інші сервіси, що знижує ризик великих збоїв.
5. Командна робота: Різні команди можуть працювати над окремими
мікросервісами паралельно, що полегшує розробку та підтримку.

Обираючи між монолітною та розподіленою архітектурою, слід враховувати


особливості вашого проекту, вимоги до масштабованості, ризики виходу з ладу та
здатність команди до роботи з великими та складними системами.

67.Які патерни проєктування розподілених систем ви знаєте?

У розподілених системах існує безліч патернів проєктування, які допомагають


вирішувати різноманітні проблеми, пов'язані з масштабованістю, доступністю,
надійністю та іншими аспектами. Ось деякі популярні патерни проєктування для
розподілених систем, які можна застосовувати в .NET:

1. Мікросервіси (Microservices): Цей патерн передбачає розбиття великого


застосунку на невеликі незалежні мікросервіси, кожен з яких виконує конкретну
функцію. Кожен мікросервіс може бути розгорнутий, масштабований та
розвинений окремо.
2. API Gateway: Цей патерн використовується для створення централізованої точки
доступу до мікросервісів через API. Він може включати маршрутизацію,
аутентифікацію, авторизацію та кешування запитів.
3. Event Sourcing: Цей патерн використовується для зберігання подій, які
відображають зміни стану системи. Він дозволяє відновити стан системи в будь-
який момент та зберігати історію змін.
4. CQRS (Command Query Responsibility Segregation): Цей патерн передбачає
розділення команд (запити, які змінюють стан) та запитів (запити, які повертають
дані) в різні моделі. Це дозволяє оптимізувати читання та записи незалежно один
від одного.
5. Реплікація та шарування (Replication and Sharding): Ці патерни
використовуються для розподілу даних на кілька вузлів або баз даних для
забезпечення масштабованості та доступності.
6. Федерація (Federation): Цей патерн дозволяє об'єднувати різні сервіси та ресурси
для забезпечення єдиного доступу для клієнтів.
7. Bulkhead: Цей патерн передбачає розділення ресурсів між різними частинами
системи, щоб зменшити вплив збоїв на інші частини.
8. Circuit Breaker: Цей патерн використовується для забезпечення надійності системи.
Він перекриває доступ до сервісу, якщо він переживає збої, і дозволяє уникнути
перевантаження.

Це лише деякі приклади патернів проєктування для розподілених систем. Вибір


конкретних патернів буде залежати від ваших потреб та особливостей проекту.

You might also like