[{"data":1,"prerenderedAt":9439},["ShallowReactive",2],{"navigation_docs":3,"-cpp-multifile-programs":3403,"-cpp-multifile-programs-surround":9434},[4,1707,1912,2366,2547,2673,2880,3002,3052,3109,3143,3269,3346,3399],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"План навчання: Курс C++ — Продовження (Статті 29–60+)","\u002Fcpp\u002Fcurriculum-plan","02.cpp\u002Fcurriculum-plan",{"title":1913,"icon":1914,"path":1915,"stem":1916,"children":1917,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[1918,1944,1998,2020,2324,2362],{"title":1919,"icon":1920,"path":1921,"stem":1922,"children":1923,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[1924,1928,1932,1936,1940],{"title":1925,"path":1926,"stem":1927},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":1929,"path":1930,"stem":1931},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":1933,"path":1934,"stem":1935},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":1937,"path":1938,"stem":1939},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":1941,"path":1942,"stem":1943},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":1945,"icon":1946,"path":1947,"stem":1948,"children":1949,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[1950,1954,1958,1962,1966,1970,1974,1978,1982,1986,1990,1994],{"title":1951,"path":1952,"stem":1953},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":1955,"path":1956,"stem":1957},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":1959,"path":1960,"stem":1961},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":1963,"path":1964,"stem":1965},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":1967,"path":1968,"stem":1969},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":1971,"path":1972,"stem":1973},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":1975,"path":1976,"stem":1977},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":1979,"path":1980,"stem":1981},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":1983,"path":1984,"stem":1985},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":1987,"path":1988,"stem":1989},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":1991,"path":1992,"stem":1993},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":1995,"path":1996,"stem":1997},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":1999,"icon":2000,"path":2001,"stem":2002,"children":2003,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2004,2008,2012,2016],{"title":2005,"path":2006,"stem":2007},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2009,"path":2010,"stem":2011},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2013,"path":2014,"stem":2015},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2017,"path":2018,"stem":2019},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2021,"icon":2022,"path":2023,"stem":2024,"children":2025},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2026,2027,2031,2035,2039,2043,2106,2141,2293],{"title":2021,"path":2023,"stem":2024},{"title":2028,"path":2029,"stem":2030},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2032,"path":2033,"stem":2034},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2036,"path":2037,"stem":2038},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2040,"path":2041,"stem":2042},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2044,"icon":132,"path":2045,"stem":2046,"children":2047},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2048,2050,2054,2058,2062,2066,2070,2074,2078,2082,2086,2090,2094,2098,2102],{"title":2049,"path":2045,"stem":2046},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2051,"path":2052,"stem":2053},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2055,"path":2056,"stem":2057},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2059,"path":2060,"stem":2061},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2063,"path":2064,"stem":2065},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2067,"path":2068,"stem":2069},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2071,"path":2072,"stem":2073},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2075,"path":2076,"stem":2077},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2079,"path":2080,"stem":2081},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2083,"path":2084,"stem":2085},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2087,"path":2088,"stem":2089},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2091,"path":2092,"stem":2093},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2095,"path":2096,"stem":2097},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2099,"path":2100,"stem":2101},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2103,"path":2104,"stem":2105},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2107,"icon":2022,"path":2108,"stem":2109,"children":2110},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2111,2113,2117,2121,2125,2129,2133,2137],{"title":2112,"path":2108,"stem":2109},"React Router: Навігаційна система сучасного вебу",{"title":2114,"path":2115,"stem":2116},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2118,"path":2119,"stem":2120},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2122,"path":2123,"stem":2124},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2126,"path":2127,"stem":2128},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2130,"path":2131,"stem":2132},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2134,"path":2135,"stem":2136},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2138,"path":2139,"stem":2140},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2142,"icon":132,"path":2143,"stem":2144,"children":2145},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2146,2148,2164,2193,2202,2223,2239,2268],{"title":2147,"path":2143,"stem":2144},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2149,"stem":2150,"children":2151,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2152,2156,2160],{"title":2153,"path":2154,"stem":2155},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2157,"path":2158,"stem":2159},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2161,"path":2162,"stem":2163},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2165,"icon":132,"path":2166,"stem":2167,"children":2168,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2169,2173,2177,2181,2185,2189],{"title":2170,"path":2171,"stem":2172},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2174,"path":2175,"stem":2176},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2178,"path":2179,"stem":2180},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2182,"path":2183,"stem":2184},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2186,"path":2187,"stem":2188},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2190,"path":2191,"stem":2192},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2194,"icon":132,"path":2195,"stem":2196,"children":2197,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2198],{"title":2199,"path":2200,"stem":2201},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2203,"icon":132,"path":2204,"stem":2205,"children":2206,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2207,2211,2215,2219],{"title":2208,"path":2209,"stem":2210},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2212,"path":2213,"stem":2214},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2216,"path":2217,"stem":2218},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2220,"path":2221,"stem":2222},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2224,"icon":92,"path":2225,"stem":2226,"children":2227,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2228,2232,2236],{"title":2229,"path":2230,"stem":2231},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2233,"path":2234,"stem":2235},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2083,"path":2237,"stem":2238},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2240,"icon":132,"path":2241,"stem":2242,"children":2243,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2244,2248,2252,2256,2260,2264],{"title":2245,"path":2246,"stem":2247},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2249,"path":2250,"stem":2251},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2253,"path":2254,"stem":2255},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2257,"path":2258,"stem":2259},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2261,"path":2262,"stem":2263},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2265,"path":2266,"stem":2267},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2269,"icon":132,"path":2270,"stem":2271,"children":2272,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2273,2277,2281,2285,2289],{"title":2274,"path":2275,"stem":2276},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2278,"path":2279,"stem":2280},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2282,"path":2283,"stem":2284},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2286,"path":2287,"stem":2288},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2290,"path":2291,"stem":2292},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2294,"icon":132,"path":2295,"stem":2296,"children":2297},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2298,2300,2304,2308,2312,2316,2320],{"title":2299,"path":2295,"stem":2296},"UI Бібліотеки в React",{"title":2301,"path":2302,"stem":2303},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2305,"path":2306,"stem":2307},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2309,"path":2310,"stem":2311},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2313,"path":2314,"stem":2315},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2317,"path":2318,"stem":2319},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2321,"path":2322,"stem":2323},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2325,"icon":2326,"path":2327,"stem":2328,"children":2329,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2330,2334,2338,2342,2346,2350,2354,2358],{"title":2331,"path":2332,"stem":2333},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2335,"path":2336,"stem":2337},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2339,"path":2340,"stem":2341},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2343,"path":2344,"stem":2345},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2347,"path":2348,"stem":2349},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2351,"path":2352,"stem":2353},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2355,"path":2356,"stem":2357},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2359,"path":2360,"stem":2361},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2363,"path":2364,"stem":2365},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2367,"icon":2368,"path":2369,"stem":2370,"children":2371,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2372,2375,2378,2382,2386,2390,2394],{"title":162,"path":2373,"stem":2374},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2376,"stem":2377},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2379,"path":2380,"stem":2381},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2383,"path":2384,"stem":2385},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2387,"path":2388,"stem":2389},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2391,"path":2392,"stem":2393},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2395,"path":2396,"stem":2397,"children":2398,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2399,2403,2407,2411,2415,2419,2423,2427,2431,2435,2439,2443,2447,2451,2455,2459,2463,2467,2471,2475,2479,2483,2487,2491,2495,2499,2503,2507,2511,2515,2519,2523,2527,2531,2535,2539,2543],{"title":2400,"path":2401,"stem":2402},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2404,"path":2405,"stem":2406},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2408,"path":2409,"stem":2410},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2412,"path":2413,"stem":2414},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2416,"path":2417,"stem":2418},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2420,"path":2421,"stem":2422},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2424,"path":2425,"stem":2426},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2428,"path":2429,"stem":2430},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2432,"path":2433,"stem":2434},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2436,"path":2437,"stem":2438},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2440,"path":2441,"stem":2442},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2444,"path":2445,"stem":2446},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2448,"path":2449,"stem":2450},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2452,"path":2453,"stem":2454},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2456,"path":2457,"stem":2458},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2460,"path":2461,"stem":2462},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2464,"path":2465,"stem":2466},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2468,"path":2469,"stem":2470},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2472,"path":2473,"stem":2474},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2476,"path":2477,"stem":2478},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2480,"path":2481,"stem":2482},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2484,"path":2485,"stem":2486},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2488,"path":2489,"stem":2490},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2492,"path":2493,"stem":2494},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2496,"path":2497,"stem":2498},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2500,"path":2501,"stem":2502},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2504,"path":2505,"stem":2506},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2508,"path":2509,"stem":2510},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2512,"path":2513,"stem":2514},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2516,"path":2517,"stem":2518},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2520,"path":2521,"stem":2522},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2524,"path":2525,"stem":2526},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2528,"path":2529,"stem":2530},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2532,"path":2533,"stem":2534},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2536,"path":2537,"stem":2538},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2540,"path":2541,"stem":2542},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2544,"path":2545,"stem":2546},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2548,"icon":2549,"path":2550,"stem":2551,"children":2552,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2553,2557,2560,2564,2568,2572,2576,2580,2584,2588,2592,2596,2600,2604,2608,2669],{"title":2554,"path":2555,"stem":2556},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2558,"stem":2559},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2561,"path":2562,"stem":2563},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2565,"path":2566,"stem":2567},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2569,"path":2570,"stem":2571},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2573,"path":2574,"stem":2575},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2577,"path":2578,"stem":2579},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2581,"path":2582,"stem":2583},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2585,"path":2586,"stem":2587},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2589,"path":2590,"stem":2591},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2593,"path":2594,"stem":2595},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2597,"path":2598,"stem":2599},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2601,"path":2602,"stem":2603},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2605,"path":2606,"stem":2607},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2609,"icon":92,"path":2610,"stem":2611,"children":2612,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665],{"title":2614,"path":2615,"stem":2616},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2618,"path":2619,"stem":2620},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2622,"path":2623,"stem":2624},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2626,"path":2627,"stem":2628},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2630,"path":2631,"stem":2632},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2634,"path":2635,"stem":2636},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2638,"path":2639,"stem":2640},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2642,"path":2643,"stem":2644},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2646,"path":2647,"stem":2648},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2650,"path":2651,"stem":2652},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2654,"path":2655,"stem":2656},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2658,"path":2659,"stem":2660},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2662,"path":2663,"stem":2664},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2666,"path":2667,"stem":2668},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2670,"path":2671,"stem":2672},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2674,"icon":2675,"path":2676,"stem":2677,"children":2678,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2679,2709,2732,2769,2798,2816,2850,2862,2871],{"title":2680,"icon":2681,"path":2682,"stem":2683,"children":2684,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2685,2689,2693,2697,2701,2705],{"title":2686,"path":2687,"stem":2688},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2690,"path":2691,"stem":2692},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2694,"path":2695,"stem":2696},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2698,"path":2699,"stem":2700},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2702,"path":2703,"stem":2704},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2706,"path":2707,"stem":2708},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2710,"icon":2675,"path":2711,"stem":2712,"children":2713,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2714,2718,2724,2728],{"title":2715,"path":2716,"stem":2717},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2719,"path":2720,"stem":2721,"children":2722},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2723],{"title":2719,"path":2720,"stem":2721},{"title":2725,"path":2726,"stem":2727},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2729,"path":2730,"stem":2731},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2733,"icon":2675,"path":2734,"stem":2735,"children":2736,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2737,2741,2745,2749,2753,2757,2761,2765],{"title":2738,"path":2739,"stem":2740},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2742,"path":2743,"stem":2744},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2746,"path":2747,"stem":2748},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2750,"path":2751,"stem":2752},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2754,"path":2755,"stem":2756},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2758,"path":2759,"stem":2760},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2762,"path":2763,"stem":2764},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2766,"path":2767,"stem":2768},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2770,"icon":2675,"path":2771,"stem":2772,"children":2773,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2774,2778,2782,2786,2790,2794],{"title":2775,"path":2776,"stem":2777},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2779,"path":2780,"stem":2781},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2783,"path":2784,"stem":2785},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2787,"path":2788,"stem":2789},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2791,"path":2792,"stem":2793},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2795,"path":2796,"stem":2797},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2799,"icon":2800,"path":2801,"stem":2802,"children":2803,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2804,2808,2812],{"title":2805,"path":2806,"stem":2807},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2809,"path":2810,"stem":2811},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2813,"path":2814,"stem":2815},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2817,"icon":2818,"path":2819,"stem":2820,"children":2821,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2822,2826,2830,2834,2838,2842,2846],{"title":2823,"path":2824,"stem":2825},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2827,"path":2828,"stem":2829},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2831,"path":2832,"stem":2833},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2835,"path":2836,"stem":2837},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2839,"path":2840,"stem":2841},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2843,"path":2844,"stem":2845},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2847,"path":2848,"stem":2849},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2847,"icon":793,"path":2851,"stem":2852,"children":2853,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[2854,2858],{"title":2855,"path":2856,"stem":2857},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":2859,"path":2860,"stem":2861},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":2863,"icon":2864,"path":2865,"stem":2866,"children":2867,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[2868],{"title":2863,"path":2869,"stem":2870},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":2872,"icon":2873,"path":2874,"stem":2875,"children":2876,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[2877],{"title":2872,"path":2878,"stem":2879},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":2881,"icon":2882,"path":2883,"stem":2884,"children":2885,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[2886,2962],{"title":2887,"icon":2888,"path":2889,"stem":2890,"children":2891},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[2892,2894,2898,2902,2906,2910,2914,2918,2922,2926,2930,2934,2938,2942,2946,2950,2954,2958],{"title":2893,"path":2889,"stem":2890},"Docker: від нуля до production",{"title":2895,"path":2896,"stem":2897},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":2899,"path":2900,"stem":2901},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":2903,"path":2904,"stem":2905},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":2907,"path":2908,"stem":2909},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":2911,"path":2912,"stem":2913},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":2915,"path":2916,"stem":2917},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":2919,"path":2920,"stem":2921},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":2923,"path":2924,"stem":2925},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":2927,"path":2928,"stem":2929},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":2931,"path":2932,"stem":2933},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":2935,"path":2936,"stem":2937},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":2939,"path":2940,"stem":2941},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":2943,"path":2944,"stem":2945},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":2947,"path":2948,"stem":2949},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":2951,"path":2952,"stem":2953},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":2955,"path":2956,"stem":2957},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":2959,"path":2960,"stem":2961},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":2963,"icon":2964,"path":2965,"stem":2966,"children":2967},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[2968,2970,2974,2978,2982,2986,2990,2994,2998],{"title":2969,"path":2965,"stem":2966},"Kubernetes: від розробки до production",{"title":2971,"path":2972,"stem":2973},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":2975,"path":2976,"stem":2977},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":2979,"path":2980,"stem":2981},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":2983,"path":2984,"stem":2985},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":2987,"path":2988,"stem":2989},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":2991,"path":2992,"stem":2993},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":2995,"path":2996,"stem":2997},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":2999,"path":3000,"stem":3001},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3003,"icon":3004,"path":3005,"stem":3006,"children":3007,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3008,3012,3016,3020,3024,3028,3032,3036,3040,3044,3048],{"title":3009,"path":3010,"stem":3011},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3013,"path":3014,"stem":3015},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3017,"path":3018,"stem":3019},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3021,"path":3022,"stem":3023},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3025,"path":3026,"stem":3027},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3029,"path":3030,"stem":3031},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3033,"path":3034,"stem":3035},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3037,"path":3038,"stem":3039},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3041,"path":3042,"stem":3043},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3045,"path":3046,"stem":3047},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3049,"path":3050,"stem":3051},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3053,"icon":943,"path":3054,"stem":3055,"children":3056,"page":59},"DDD","\u002Fddd","10.ddd",[3057,3061,3065,3069,3073,3077,3081,3085,3089,3093,3097,3101,3105],{"title":3058,"path":3059,"stem":3060},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3062,"path":3063,"stem":3064},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3066,"path":3067,"stem":3068},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3070,"path":3071,"stem":3072},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3074,"path":3075,"stem":3076},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3078,"path":3079,"stem":3080},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3082,"path":3083,"stem":3084},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3086,"path":3087,"stem":3088},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3090,"path":3091,"stem":3092},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3094,"path":3095,"stem":3096},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3098,"path":3099,"stem":3100},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3102,"path":3103,"stem":3104},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3106,"path":3107,"stem":3108},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3110,"icon":3111,"path":3112,"stem":3113,"children":3114,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3115,3119,3123,3127,3131,3135,3139],{"title":3116,"path":3117,"stem":3118},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3120,"path":3121,"stem":3122},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3124,"path":3125,"stem":3126},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3128,"path":3129,"stem":3130},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3132,"path":3133,"stem":3134},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3136,"path":3137,"stem":3138},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3140,"path":3141,"stem":3142},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3144,"icon":3145,"path":3146,"stem":3147,"children":3148,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3149,3153,3157,3161,3165,3169,3173,3177,3181,3185,3189,3193,3197,3201,3205,3209,3213,3217,3221,3225,3229,3233,3237,3241,3245,3249,3253,3257,3261,3265],{"title":3150,"path":3151,"stem":3152},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3154,"path":3155,"stem":3156},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3158,"path":3159,"stem":3160},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3162,"path":3163,"stem":3164},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3166,"path":3167,"stem":3168},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3170,"path":3171,"stem":3172},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3174,"path":3175,"stem":3176},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3178,"path":3179,"stem":3180},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3182,"path":3183,"stem":3184},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3186,"path":3187,"stem":3188},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3190,"path":3191,"stem":3192},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3194,"path":3195,"stem":3196},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3198,"path":3199,"stem":3200},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3202,"path":3203,"stem":3204},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3206,"path":3207,"stem":3208},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3210,"path":3211,"stem":3212},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3214,"path":3215,"stem":3216},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3218,"path":3219,"stem":3220},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3222,"path":3223,"stem":3224},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3226,"path":3227,"stem":3228},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3230,"path":3231,"stem":3232},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3234,"path":3235,"stem":3236},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3238,"path":3239,"stem":3240},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3242,"path":3243,"stem":3244},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3246,"path":3247,"stem":3248},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3250,"path":3251,"stem":3252},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3254,"path":3255,"stem":3256},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3258,"path":3259,"stem":3260},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3262,"path":3263,"stem":3264},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3266,"path":3267,"stem":3268},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3270,"path":3271,"stem":3272,"children":3273,"page":59},"AWS","\u002Faws","13.aws",[3274,3278,3282,3286,3290,3294,3298,3302,3306,3310,3314,3318,3322,3326,3330,3334,3338,3342],{"title":3275,"path":3276,"stem":3277},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3279,"path":3280,"stem":3281},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3283,"path":3284,"stem":3285},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3287,"path":3288,"stem":3289},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3291,"path":3292,"stem":3293},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3295,"path":3296,"stem":3297},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3299,"path":3300,"stem":3301},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3303,"path":3304,"stem":3305},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3307,"path":3308,"stem":3309},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3311,"path":3312,"stem":3313},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3315,"path":3316,"stem":3317},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3319,"path":3320,"stem":3321},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3323,"path":3324,"stem":3325},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3327,"path":3328,"stem":3329},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3331,"path":3332,"stem":3333},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3335,"path":3336,"stem":3337},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3339,"path":3340,"stem":3341},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3343,"path":3344,"stem":3345},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3347,"path":3348,"stem":3349,"children":3350,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[3351,3355,3359,3363,3367,3371,3375,3379,3383,3387,3391,3395],{"title":3352,"path":3353,"stem":3354},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":3356,"path":3357,"stem":3358},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":3360,"path":3361,"stem":3362},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":3364,"path":3365,"stem":3366},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":3368,"path":3369,"stem":3370},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":3372,"path":3373,"stem":3374},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":3376,"path":3377,"stem":3378},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":3380,"path":3381,"stem":3382},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":3384,"path":3385,"stem":3386},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":3388,"path":3389,"stem":3390},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":3392,"path":3393,"stem":3394},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":3396,"path":3397,"stem":3398},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":3400,"path":3401,"stem":3402},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":3404,"title":1897,"body":3405,"description":9428,"extension":9429,"links":9430,"meta":9431,"navigation":3587,"path":1898,"seo":9432,"stem":1899,"__hash__":9433},"docs\u002F02.cpp\u002F46.multifile-programs.md",{"type":3406,"value":3407,"toc":9365},"minimark",[3408,3412,3417,3421,3429,3432,3444,3448,3451,3455,3466,3489,3495,3518,3528,3539,3543,3545,3549,3562,3709,3751,3788,3791,3815,3826,3837,3839,3843,3849,3854,3860,3865,3882,3892,3907,3913,3928,3941,3947,3965,3969,3974,4005,4011,4015,4018,4077,4080,4083,4086,4095,4105,4109,4112,4121,4124,4153,4156,4160,4179,4183,4189,4193,4307,4311,4324,4338,4342,4347,4369,4374,4391,4396,4413,4418,4434,4438,4450,4453,4455,4459,4463,4469,4490,4497,4539,4545,4628,4631,4657,4661,4674,4700,4704,4714,4760,4763,4765,4769,4772,4781,4792,4802,4828,4830,4834,4838,4847,4857,4861,4871,4886,4896,4916,5034,5190,5333,5348,5359,5375,5378,5400,5411,5431,5451,5470,5474,5480,5530,5532,5536,5540,5549,5555,5561,5572,5582,5588,5597,5624,5676,5679,5738,5751,5765,5768,5774,5780,5789,5795,5927,5965,5968,5997,6006,6067,6076,6102,6106,6115,6278,6312,6315,6358,6503,6537,6540,6599,6652,6656,6662,6701,6707,6735,6739,6749,6803,6805,6812,6816,6819,6842,6854,6890,6910,6926,6929,6998,7001,7005,7015,7063,7066,7094,7117,7131,7136,7139,7165,7171,7175,7241,7247,7261,7263,7267,7271,7281,7336,7343,7349,7355,7361,7423,7507,7618,7647,7671,7685,7689,7695,7812,7818,7825,7830,7854,7867,7876,7887,7893,7982,8054,8058,8067,8290,8305,8309,8312,8494,8503,8506,8604,8610,8628,8641,8643,8647,8650,8654,8782,8786,9043,9047,9262,9264,9268,9354,9361],[3409,3410,1897],"h1",{"id":3411},"організація-коду-файли-препроцесор-простори-імен",[3413,3414,3416],"h2",{"id":3415},"межа-одного-файлу","Межа одного файлу",[3418,3419,3420],"p",{},"Усі програми, які ми писали до цього моменту, жили в одному файлі. Це зручно: весь код перед очима, нічого не треба шукати, компіляція — одна команда. Але ця зручність оманлива. Вона зберігається рівно до того моменту, поки програма залишається маленькою.",[3418,3422,3423,3424,3428],{},"Уявіть реальний сценарій. Ви розробляєте систему обліку студентів університету. З часом у файлі з'являються функції для читання даних із консолі, функції для обчислення середнього балу, функції для сортування, функції для форматованого виводу звіту, допоміжні функції перевірки вхідних даних. Через місяць роботи файл розростається до восьмисот рядків. Щоб знайти функцію ",[3425,3426,3427],"code",{},"calculateGpa()",", доводиться прокручувати сотні рядків або покладатися на пошук. Колега, якому ви передаєте проєкт, витрачає годину лише на те, щоб зрозуміти, де що знаходиться.",[3418,3430,3431],{},"Тепер ускладнимо картину: вас двоє, і обидва хочете одночасно вносити зміни. Один редагує функцію виводу, інший — логіку сортування. Але файл один. Система контролю версій (git) зафіксує конфлікт при спробі об'єднати зміни, навіть якщо ви торкалися абсолютно різних частин коду. Один файл стає вузьким місцем командної роботи.",[3418,3433,3434,3435,3439,3440,3443],{},"Рішення, вироблене індустрією за десятиліття, — ",[3436,3437,3438],"strong",{},"розбивати програму на кілька файлів",". Кожен файл відповідає за чітко визначену частину програми: один містить логіку введення даних, інший — математичні обчислення, третій — форматування виводу. Цей принцип називається ",[3436,3441,3442],{},"поділом відповідальностей"," (separation of concerns) і є одним із фундаментальних у програмній інженерії.",[3445,3446,3447],"note",{},"Поділ відповідальностей — це не лише організаційна зручність. Він безпосередньо впливає на якість коду: кожен модуль можна тестувати окремо, змінювати незалежно від решти, повторно використовувати в інших проєктах.",[3449,3450],"hr",{},[3413,3452,3454],{"id":3453},"як-компілятор-бачить-проєкт","Як компілятор бачить проєкт",[3418,3456,3457,3458,3461,3462,3465],{},"Перш ніж навчитися розбивати програму на файли, необхідно зрозуміти фундаментальний принцип роботи компілятора C++: він обробляє кожен ",[3425,3459,3460],{},".cpp","-файл ",[3436,3463,3464],{},"окремо і незалежно",".",[3418,3467,3468,3469,3472,3473,3476,3477,3480,3481,3484,3485,3488],{},"Цей файл — разом із усіма заголовками, які він підключає через ",[3425,3470,3471],{},"#include"," — називається ",[3436,3474,3475],{},"одиницею трансляції"," (translation unit). Одиниця трансляції є базовою одиницею компіляції в C++. Компілятор перетворює її на ",[3436,3478,3479],{},"об'єктний файл"," (",[3425,3482,3483],{},".o"," на Linux\u002FmacOS, ",[3425,3486,3487],{},".obj"," на Windows) — машинний код, ще не готовий до виконання.",[3418,3490,3491,3492,3494],{},"Якщо у проєкті три ",[3425,3493,3460],{},"-файли, компілятор виконає три незалежні прогони і породить три об'єктних файли. Жоден із них не знає про існування інших під час компіляції. Це ізоляція за задумом: вона дозволяє перекомпільовувати лише змінений файл, не торкаючись решти.",[3418,3496,3497,3498,3501,3502,3505,3506,3509,3510,3513,3514,3517],{},"Після компіляції всіх файлів у справу вступає ",[3436,3499,3500],{},"лінкер"," (linker) — окрема програма, яка збирає об'єктні файли в єдиний виконуваний файл. Лінкер вирішує «посилання»: якщо ",[3425,3503,3504],{},"main.cpp"," викликає функцію ",[3425,3507,3508],{},"add()",", визначену в ",[3425,3511,3512],{},"math.cpp",", лінкер знаходить її адресу в ",[3425,3515,3516],{},"math.o"," і «зшиває» виклик із визначенням.",[3519,3520,3525],"pre",{"className":3521,"code":3523,"language":3524},[3522],"language-text","main.cpp  ──► компілятор ──► main.o ──┐\nmath.cpp  ──► компілятор ──► math.o ──┼──► лінкер ──► program\nutils.cpp ──► компілятор ──► utils.o ─┘\n","text",[3425,3526,3523],{"__ignoreMap":3527},"",[3418,3529,3530,3531,3534,3535,3538],{},"Ця дворівнева архітектура (компіляція + лінкування) існує з перших днів мови C і залишається незмінною досі. Розуміння різниці між помилкою ",[3436,3532,3533],{},"компілятора"," і помилкою ",[3436,3536,3537],{},"лінкера"," — одна з перших практичних навичок, яку слід виробити.",[3540,3541,3542],"tip",{},"Помилки компілятора — це синтаксичні та семантичні проблеми всередині одного файлу. Помилки лінкера — це проблеми зв'язків між файлами: виклик функції, визначення якої ніде не знайдено, або навпаки — два визначення одного імені.",[3449,3544],{},[3413,3546,3548],{"id":3547},"попереднє-оголошення-та-правило-odr","Попереднє оголошення та правило ODR",[3418,3550,3551,3552,3554,3555,3557,3558,3561],{},"Щоб компілятор погодився скомпілювати ",[3425,3553,3504],{},", він повинен знати про функцію ",[3425,3556,3508],{}," до її виклику. Для цього достатньо ",[3436,3559,3560],{},"попереднього оголошення"," (forward declaration) — рядка, що повідомляє компілятору ім'я функції, типи її параметрів і тип значення, що повертається.",[3519,3563,3568],{"className":3564,"code":3565,"filename":3504,"language":3566,"meta":3567,"style":3527},"language-cpp shiki shiki-themes light-plus dark-plus dark-plus","#include \u003Ciostream>\n\nint add(int a, int b); \u002F\u002F попереднє оголошення\n\nint main()\n{\n    std::cout \u003C\u003C \"3 + 4 = \" \u003C\u003C add(3, 4) \u003C\u003C \"\\n\";\n    return 0;\n}\n","cpp","showLineNumbers",[3425,3569,3570,3582,3589,3625,3630,3641,3647,3692,3703],{"__ignoreMap":3527},[3571,3572,3575,3578],"span",{"class":3573,"line":3574},"line",1,[3571,3576,3471],{"class":3577},"s8xlr",[3571,3579,3581],{"class":3580},"sbdoH"," \u003Ciostream>\n",[3571,3583,3585],{"class":3573,"line":3584},2,[3571,3586,3588],{"emptyLinePlaceholder":3587},true,"\n",[3571,3590,3592,3596,3600,3604,3606,3610,3613,3615,3618,3621],{"class":3573,"line":3591},3,[3571,3593,3595],{"class":3594},"su1O8","int",[3571,3597,3599],{"class":3598},"s8Opu"," add",[3571,3601,3603],{"class":3602},"sHH4Y","(",[3571,3605,3595],{"class":3594},[3571,3607,3609],{"class":3608},"siwwj"," a",[3571,3611,3612],{"class":3602},", ",[3571,3614,3595],{"class":3594},[3571,3616,3617],{"class":3608}," b",[3571,3619,3620],{"class":3602},");",[3571,3622,3624],{"class":3623},"spJ8K"," \u002F\u002F попереднє оголошення\n",[3571,3626,3628],{"class":3573,"line":3627},4,[3571,3629,3588],{"emptyLinePlaceholder":3587},[3571,3631,3633,3635,3638],{"class":3573,"line":3632},5,[3571,3634,3595],{"class":3594},[3571,3636,3637],{"class":3598}," main",[3571,3639,3640],{"class":3602},"()\n",[3571,3642,3644],{"class":3573,"line":3643},6,[3571,3645,3646],{"class":3602},"{\n",[3571,3648,3650,3654,3657,3660,3663,3666,3668,3672,3674,3677,3680,3683,3687,3689],{"class":3573,"line":3649},7,[3571,3651,3653],{"class":3652},"sN1BT","    std",[3571,3655,3656],{"class":3602},"::cout \u003C\u003C ",[3571,3658,3659],{"class":3580},"\"3 + 4 = \"",[3571,3661,3662],{"class":3602}," \u003C\u003C ",[3571,3664,3665],{"class":3598},"add",[3571,3667,3603],{"class":3602},[3571,3669,3671],{"class":3670},"sJj4R","3",[3571,3673,3612],{"class":3602},[3571,3675,3676],{"class":3670},"4",[3571,3678,3679],{"class":3602},") \u003C\u003C ",[3571,3681,3682],{"class":3580},"\"",[3571,3684,3686],{"class":3685},"sjcCO","\\n",[3571,3688,3682],{"class":3580},[3571,3690,3691],{"class":3602},";\n",[3571,3693,3695,3698,3701],{"class":3573,"line":3694},8,[3571,3696,3697],{"class":3577},"    return",[3571,3699,3700],{"class":3670}," 0",[3571,3702,3691],{"class":3602},[3571,3704,3706],{"class":3573,"line":3705},9,[3571,3707,3708],{"class":3602},"}\n",[3519,3710,3713],{"className":3564,"code":3711,"filename":3712,"language":3566,"meta":3567,"style":3527},"int add(int a, int b)\n{\n    return a + b;\n}\n","add.cpp",[3425,3714,3715,3736,3740,3747],{"__ignoreMap":3527},[3571,3716,3717,3719,3721,3723,3725,3727,3729,3731,3733],{"class":3573,"line":3574},[3571,3718,3595],{"class":3594},[3571,3720,3599],{"class":3598},[3571,3722,3603],{"class":3602},[3571,3724,3595],{"class":3594},[3571,3726,3609],{"class":3608},[3571,3728,3612],{"class":3602},[3571,3730,3595],{"class":3594},[3571,3732,3617],{"class":3608},[3571,3734,3735],{"class":3602},")\n",[3571,3737,3738],{"class":3573,"line":3584},[3571,3739,3646],{"class":3602},[3571,3741,3742,3744],{"class":3573,"line":3591},[3571,3743,3697],{"class":3577},[3571,3745,3746],{"class":3602}," a + b;\n",[3571,3748,3749],{"class":3573,"line":3627},[3571,3750,3708],{"class":3602},[3752,3753,3755,3770,3779],"terminal-preview",{"title":3754},".\u002Fprogram",[3756,3757,3759,3764,3765],"div",{"className":3758},[3573],[3571,3760,3763],{"className":3761},[3762],"opacity-40","$"," ",[3436,3766,3769],{"className":3767},[3768],"font-bold","g++ main.cpp add.cpp -o program && .\u002Fprogram",[3756,3771,3773,3774],{"className":3772},[3573],"3 + 4 = ",[3571,3775,3778],{"className":3776},[3777],"text-blue-400","7",[3756,3780,3782,3783,3465],{"className":3781},[3573],"Execution finished with ",[3571,3784,3787],{"className":3785},[3786,3768],"text-green-400","exit code 0",[3418,3789,3790],{},"Важливо розрізняти два поняття:",[3792,3793,3794,3805],"ul",{},[3795,3796,3797,3800,3801,3804],"li",{},[3436,3798,3799],{},"Оголошення"," (declaration) — повідомляє компілятору про існування сутності та її тип. Пам'ять не виділяється. ",[3425,3802,3803],{},"int add(int a, int b);"," — це оголошення.",[3795,3806,3807,3810,3811,3814],{},[3436,3808,3809],{},"Визначення"," (definition) — повне описання сутності з реалізацією. ",[3425,3812,3813],{},"int add(int a, int b) { return a + b; }"," — це визначення.",[3418,3816,3817,3818,3821,3822,3825],{},"Звідси випливає ",[3436,3819,3820],{},"правило одного визначення"," (One Definition Rule, ODR): у всій програмі кожна функція може мати ",[3436,3823,3824],{},"рівно одне"," визначення. Оголошень — скільки завгодно. Порушення ODR призводить до помилки лінкера «multiple definition».",[3827,3828,3829,3830,3832,3833,3836],"caution",{},"Найпоширеніше порушення ODR — визначення функції у заголовковому файлі, який підключається в кількох ",[3425,3831,3460],{},". Кожне підключення породжує нове визначення. Заголовкові файли мають містити ",[3436,3834,3835],{},"оголошення",", а не визначення.",[3449,3838],{},[3413,3840,3842],{"id":3841},"встановлення-компілятора-g","Встановлення компілятора g++",[3418,3844,3845,3848],{},[3425,3846,3847],{},"g++"," — це компілятор C++ із набору GCC (GNU Compiler Collection). Він доступний на всіх основних операційних системах, але спосіб встановлення відрізняється.",[3850,3851,3853],"h3",{"id":3852},"windows","Windows",[3418,3855,3856,3857,3859],{},"На Windows ",[3425,3858,3847],{}," не входить до складу ОС. Оберіть спосіб, що підходить до вашої ситуації.",[3861,3862,3864],"h4",{"id":3863},"msys2-рекомендовано","MSYS2 (рекомендовано)",[3418,3866,3867,3870,3871,3878,3879,3465],{},[3436,3868,3869],{},"Крок 1."," Завантажте інсталятор з ",[3872,3873,3877],"a",{"href":3874,"rel":3875},"https:\u002F\u002Fwww.msys2.org",[3876],"nofollow","msys2.org",", встановіть у ",[3425,3880,3881],{},"C:\\msys64",[3418,3883,3884,3887,3888,3891],{},[3436,3885,3886],{},"Крок 2."," Відкрийте ",[3436,3889,3890],{},"MSYS2 UCRT64"," і оновіть пакети:",[3519,3893,3897],{"className":3894,"code":3895,"language":3896,"meta":3527,"style":3527},"language-bash shiki shiki-themes light-plus dark-plus dark-plus","pacman -Syu\n","bash",[3425,3898,3899],{"__ignoreMap":3527},[3571,3900,3901,3904],{"class":3573,"line":3574},[3571,3902,3903],{"class":3598},"pacman",[3571,3905,3906],{"class":3594}," -Syu\n",[3418,3908,3909,3912],{},[3436,3910,3911],{},"Крок 3."," Встановіть компілятор:",[3519,3914,3916],{"className":3894,"code":3915,"language":3896,"meta":3527,"style":3527},"pacman -S mingw-w64-ucrt-x86_64-gcc\n",[3425,3917,3918],{"__ignoreMap":3527},[3571,3919,3920,3922,3925],{"class":3573,"line":3574},[3571,3921,3903],{"class":3598},[3571,3923,3924],{"class":3594}," -S",[3571,3926,3927],{"class":3580}," mingw-w64-ucrt-x86_64-gcc\n",[3418,3929,3930,3933,3934,3937,3938,3465],{},[3436,3931,3932],{},"Крок 4."," Додайте ",[3425,3935,3936],{},"C:\\msys64\\ucrt64\\bin"," до змінної середовища ",[3425,3939,3940],{},"PATH",[3418,3942,3943,3946],{},[3436,3944,3945],{},"Крок 5."," Перевірте у PowerShell:",[3752,3948,3950,3961],{"title":3949},"PowerShell",[3756,3951,3953,3764,3957],{"className":3952},[3573],[3571,3954,3956],{"className":3955},[3762],">",[3436,3958,3960],{"className":3959},[3768],"g++ --version",[3756,3962,3964],{"className":3963},[3573],"g++ (GCC) 14.2.0",[3861,3966,3968],{"id":3967},"scoop","Scoop",[3418,3970,3971,3972,3465],{},"Не потребує прав адміністратора, автоматично налаштовує ",[3425,3973,3940],{},[3519,3975,3979],{"className":3976,"code":3977,"language":3978,"meta":3527,"style":3527},"language-powershell shiki shiki-themes light-plus dark-plus dark-plus","Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser\nInvoke-RestMethod -Uri https:\u002F\u002Fget.scoop.sh | Invoke-Expression\nscoop install gcc\n","powershell",[3425,3980,3981,3989,4000],{"__ignoreMap":3527},[3571,3982,3983,3986],{"class":3573,"line":3574},[3571,3984,3985],{"class":3598},"Set-ExecutionPolicy",[3571,3987,3988],{"class":3602}," -ExecutionPolicy RemoteSigned -Scope CurrentUser\n",[3571,3990,3991,3994,3997],{"class":3573,"line":3584},[3571,3992,3993],{"class":3598},"Invoke-RestMethod",[3571,3995,3996],{"class":3602}," -Uri https:\u002F\u002Fget.scoop.sh | ",[3571,3998,3999],{"class":3598},"Invoke-Expression\n",[3571,4001,4002],{"class":3573,"line":3591},[3571,4003,4004],{"class":3602},"scoop install gcc\n",[3418,4006,4007,4008],{},"Оновлення: ",[3425,4009,4010],{},"scoop update gcc",[3861,4012,4014],{"id":4013},"chocolatey","Chocolatey",[3418,4016,4017],{},"Вимагає прав адміністратора.",[3519,4019,4021],{"className":3976,"code":4020,"language":3978,"meta":3527,"style":3527},"Set-ExecutionPolicy Bypass -Scope Process -Force\n[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072\niex ((New-Object System.Net.WebClient).DownloadString('https:\u002F\u002Fcommunity.chocolatey.org\u002Finstall.ps1'))\nchoco install mingw\n",[3425,4022,4023,4036,4055,4072],{"__ignoreMap":3527},[3571,4024,4025,4027,4030,4033],{"class":3573,"line":3574},[3571,4026,3985],{"class":3598},[3571,4028,4029],{"class":3602}," Bypass -Scope ",[3571,4031,4032],{"class":3577},"Process",[3571,4034,4035],{"class":3602}," -Force\n",[3571,4037,4038,4041,4044,4047,4049,4052],{"class":3573,"line":3584},[3571,4039,4040],{"class":3602},"[",[3571,4042,4043],{"class":3594},"System.Net.ServicePointManager",[3571,4045,4046],{"class":3602},"]::SecurityProtocol = [",[3571,4048,4043],{"class":3594},[3571,4050,4051],{"class":3602},"]::SecurityProtocol -bor ",[3571,4053,4054],{"class":3670},"3072\n",[3571,4056,4057,4060,4063,4066,4069],{"class":3573,"line":3591},[3571,4058,4059],{"class":3602},"iex ((",[3571,4061,4062],{"class":3598},"New-Object",[3571,4064,4065],{"class":3602}," System.Net.WebClient).DownloadString(",[3571,4067,4068],{"class":3580},"'https:\u002F\u002Fcommunity.chocolatey.org\u002Finstall.ps1'",[3571,4070,4071],{"class":3602},"))\n",[3571,4073,4074],{"class":3573,"line":3627},[3571,4075,4076],{"class":3602},"choco install mingw\n",[3445,4078,4079],{},"Chocolatey вимагає прав адміністратора. Якщо їх немає — оберіть Scoop.",[3861,4081,4082],{"id":4082},"winget",[3418,4084,4085],{},"Вбудований у Windows 10\u002F11, не потребує окремого встановлення.",[3519,4087,4089],{"className":3976,"code":4088,"language":3978,"meta":3527,"style":3527},"winget install -e --id BrechtSanders.WinLibs.POSIX.UCRT\n",[3425,4090,4091],{"__ignoreMap":3527},[3571,4092,4093],{"class":3573,"line":3574},[3571,4094,4088],{"class":3602},[3418,4096,4097,4098,4101,4102,4104],{},"Після встановлення додайте шлях до ",[3425,4099,4100],{},"bin"," у ",[3425,4103,3940],{}," вручну.",[3861,4106,4108],{"id":4107},"wsl2","WSL2",[3418,4110,4111],{},"Справжній нативний Linux-GCC на Windows.",[3519,4113,4115],{"className":3976,"code":4114,"language":3978,"meta":3527,"style":3527},"wsl --install\n",[3425,4116,4117],{"__ignoreMap":3527},[3571,4118,4119],{"class":3573,"line":3574},[3571,4120,4114],{"class":3602},[3418,4122,4123],{},"Після перезавантаження у терміналі Ubuntu:",[3519,4125,4127],{"className":3894,"code":4126,"language":3896,"meta":3527,"style":3527},"sudo apt update && sudo apt install build-essential\n",[3425,4128,4129],{"__ignoreMap":3527},[3571,4130,4131,4134,4137,4140,4143,4145,4147,4150],{"class":3573,"line":3574},[3571,4132,4133],{"class":3598},"sudo",[3571,4135,4136],{"class":3580}," apt",[3571,4138,4139],{"class":3580}," update",[3571,4141,4142],{"class":3602}," && ",[3571,4144,4133],{"class":3598},[3571,4146,4136],{"class":3580},[3571,4148,4149],{"class":3580}," install",[3571,4151,4152],{"class":3580}," build-essential\n",[3540,4154,4155],{},"WSL2 — найкращий варіант для системного або серверного C++ без встановлення окремої ОС.",[3861,4157,4159],{"id":4158},"mingw-w64-ручне-встановлення","MinGW-w64 (ручне встановлення)",[3418,4161,4162,4163,4168,4169,4172,4173,4176,4177,3465],{},"Завантажте архів з ",[3872,4164,4167],{"href":4165,"rel":4166},"https:\u002F\u002Fwinlibs.com",[3876],"winlibs.com",", розпакуйте в ",[3425,4170,4171],{},"C:\\mingw64"," і додайте ",[3425,4174,4175],{},"C:\\mingw64\\bin"," до ",[3425,4178,3940],{},[3861,4180,4182],{"id":4181},"visual-c-msvc","Visual C++ (MSVC)",[3418,4184,4185,4186,4188],{},"Встановлюється разом із Visual Studio. Повністю підтримує C++17\u002F20. Якщо Visual Studio вже є — окремо встановлювати ",[3425,4187,3847],{}," не обов'язково.",[3861,4190,4192],{"id":4191},"порівняльна-таблиця","Порівняльна таблиця",[4194,4195,4196,4216],"table",{},[4197,4198,4199],"thead",{},[4200,4201,4202,4206,4210,4213],"tr",{},[4203,4204,4205],"th",{},"Варіант",[4203,4207,4209],{"align":4208},"center","Права адмін",[4203,4211,4212],{"align":4208},"Автоматичний PATH",[4203,4214,4215],{},"Підходить коли",[4217,4218,4219,4234,4247,4258,4270,4283,4295],"tbody",{},[4200,4220,4221,4225,4228,4231],{},[4222,4223,4224],"td",{},"MSYS2",[4222,4226,4227],{"align":4208},"Бажані",[4222,4229,4230],{"align":4208},"❌ вручну",[4222,4232,4233],{},"Потрібне Unix-оточення",[4200,4235,4236,4238,4241,4244],{},[4222,4237,3968],{},[4222,4239,4240],{"align":4208},"❌",[4222,4242,4243],{"align":4208},"✅",[4222,4245,4246],{},"Немає прав адміністратора",[4200,4248,4249,4251,4253,4255],{},[4222,4250,4014],{},[4222,4252,4243],{"align":4208},[4222,4254,4243],{"align":4208},[4222,4256,4257],{},"Корпоративна машина",[4200,4259,4260,4263,4265,4267],{},[4222,4261,4262],{},"winget + WinLibs",[4222,4264,4240],{"align":4208},[4222,4266,4230],{"align":4208},[4222,4268,4269],{},"Вбудований менеджер",[4200,4271,4272,4274,4277,4280],{},[4222,4273,4108],{},[4222,4275,4276],{"align":4208},"✅ (одноразово)",[4222,4278,4279],{"align":4208},"—",[4222,4281,4282],{},"Справжній Linux",[4200,4284,4285,4288,4290,4292],{},[4222,4286,4287],{},"MinGW-w64 вручну",[4222,4289,4240],{"align":4208},[4222,4291,4230],{"align":4208},[4222,4293,4294],{},"Без доступу до мережі",[4200,4296,4297,4300,4302,4304],{},[4222,4298,4299],{},"MSVC",[4222,4301,4243],{"align":4208},[4222,4303,4243],{"align":4208},[4222,4305,4306],{},"Вже є Visual Studio",[3850,4308,4310],{"id":4309},"macos","macOS",[3519,4312,4314],{"className":3894,"code":4313,"language":3896,"meta":3527,"style":3527},"xcode-select --install\n",[3425,4315,4316],{"__ignoreMap":3527},[3571,4317,4318,4321],{"class":3573,"line":3574},[3571,4319,4320],{"class":3598},"xcode-select",[3571,4322,4323],{"class":3594}," --install\n",[3445,4325,4326,4327,4329,4330,4333,4334,4337],{},"На macOS ",[3425,4328,3847],{}," є псевдонімом Clang від Apple. Для цілей курсу різниця несуттєва. Якщо потрібен справжній GCC: ",[3425,4331,4332],{},"brew install gcc"," (потім доступний як ",[3425,4335,4336],{},"g++-14",").",[3850,4339,4341],{"id":4340},"linux","Linux",[3418,4343,4344],{},[3436,4345,4346],{},"Ubuntu \u002F Debian \u002F Linux Mint:",[3519,4348,4349],{"className":3894,"code":4126,"language":3896,"meta":3527,"style":3527},[3425,4350,4351],{"__ignoreMap":3527},[3571,4352,4353,4355,4357,4359,4361,4363,4365,4367],{"class":3573,"line":3574},[3571,4354,4133],{"class":3598},[3571,4356,4136],{"class":3580},[3571,4358,4139],{"class":3580},[3571,4360,4142],{"class":3602},[3571,4362,4133],{"class":3598},[3571,4364,4136],{"class":3580},[3571,4366,4149],{"class":3580},[3571,4368,4152],{"class":3580},[3418,4370,4371],{},[3436,4372,4373],{},"Fedora \u002F RHEL:",[3519,4375,4377],{"className":3894,"code":4376,"language":3896,"meta":3527,"style":3527},"sudo dnf install gcc-c++\n",[3425,4378,4379],{"__ignoreMap":3527},[3571,4380,4381,4383,4386,4388],{"class":3573,"line":3574},[3571,4382,4133],{"class":3598},[3571,4384,4385],{"class":3580}," dnf",[3571,4387,4149],{"class":3580},[3571,4389,4390],{"class":3580}," gcc-c++\n",[3418,4392,4393],{},[3436,4394,4395],{},"Arch Linux:",[3519,4397,4399],{"className":3894,"code":4398,"language":3896,"meta":3527,"style":3527},"sudo pacman -S gcc\n",[3425,4400,4401],{"__ignoreMap":3527},[3571,4402,4403,4405,4408,4410],{"class":3573,"line":3574},[3571,4404,4133],{"class":3598},[3571,4406,4407],{"class":3580}," pacman",[3571,4409,3924],{"class":3594},[3571,4411,4412],{"class":3580}," gcc\n",[3418,4414,4415],{},[3436,4416,4417],{},"openSUSE:",[3519,4419,4421],{"className":3894,"code":4420,"language":3896,"meta":3527,"style":3527},"sudo zypper install gcc-c++\n",[3425,4422,4423],{"__ignoreMap":3527},[3571,4424,4425,4427,4430,4432],{"class":3573,"line":3574},[3571,4426,4133],{"class":3598},[3571,4428,4429],{"class":3580}," zypper",[3571,4431,4149],{"class":3580},[3571,4433,4390],{"class":3580},[3850,4435,4437],{"id":4436},"перевірка","Перевірка",[3519,4439,4441],{"className":3894,"code":4440,"language":3896,"meta":3527,"style":3527},"g++ --version\n",[3425,4442,4443],{"__ignoreMap":3527},[3571,4444,4445,4447],{"class":3573,"line":3574},[3571,4446,3847],{"class":3598},[3571,4448,4449],{"class":3594}," --version\n",[3418,4451,4452],{},"Якщо бачите рядок із версією — компілятор готовий до роботи.",[3449,4454],{},[3413,4456,4458],{"id":4457},"компіляція-через-командний-рядок-та-ide","Компіляція через командний рядок та IDE",[3850,4460,4462],{"id":4461},"командний-рядок","Командний рядок",[3418,4464,4465,4466,4468],{},"Найпростіший спосіб — передати всі ",[3425,4467,3460],{},"-файли одразу:",[3519,4470,4472],{"className":3894,"code":4471,"language":3896,"meta":3527,"style":3527},"g++ main.cpp add.cpp -o program\n",[3425,4473,4474],{"__ignoreMap":3527},[3571,4475,4476,4478,4481,4484,4487],{"class":3573,"line":3574},[3571,4477,3847],{"class":3598},[3571,4479,4480],{"class":3580}," main.cpp",[3571,4482,4483],{"class":3580}," add.cpp",[3571,4485,4486],{"class":3594}," -o",[3571,4488,4489],{"class":3580}," program\n",[3418,4491,4492,4493,4496],{},"Прапор ",[3425,4494,4495],{},"-c"," компілює файл без лінкування — на виході лише об'єктний файл:",[3519,4498,4500],{"className":3894,"code":4499,"language":3896,"meta":3527,"style":3527},"g++ -c add.cpp    # породжує add.o\ng++ -c main.cpp   # породжує main.o\ng++ main.o add.o -o program\n",[3425,4501,4502,4514,4525],{"__ignoreMap":3527},[3571,4503,4504,4506,4509,4511],{"class":3573,"line":3574},[3571,4505,3847],{"class":3598},[3571,4507,4508],{"class":3594}," -c",[3571,4510,4483],{"class":3580},[3571,4512,4513],{"class":3623},"    # породжує add.o\n",[3571,4515,4516,4518,4520,4522],{"class":3573,"line":3584},[3571,4517,3847],{"class":3598},[3571,4519,4508],{"class":3594},[3571,4521,4480],{"class":3580},[3571,4523,4524],{"class":3623},"   # породжує main.o\n",[3571,4526,4527,4529,4532,4535,4537],{"class":3573,"line":3591},[3571,4528,3847],{"class":3598},[3571,4530,4531],{"class":3580}," main.o",[3571,4533,4534],{"class":3580}," add.o",[3571,4536,4486],{"class":3594},[3571,4538,4489],{"class":3580},[3418,4540,4541,4542,4544],{},"Роздільна компіляція корисна у великих проєктах: при зміні одного файлу перекомпільовується лише він, решта ",[3425,4543,3483],{}," залишаються.",[4194,4546,4547,4557],{},[4197,4548,4549],{},[4200,4550,4551,4554],{},[4203,4552,4553],{},"Прапор",[4203,4555,4556],{},"Призначення",[4217,4558,4559,4569,4578,4588,4598,4608,4618],{},[4200,4560,4561,4566],{},[4222,4562,4563],{},[3425,4564,4565],{},"-o ім'я",[4222,4567,4568],{},"Задати ім'я вихідного файлу",[4200,4570,4571,4575],{},[4222,4572,4573],{},[3425,4574,4495],{},[4222,4576,4577],{},"Компілювати без лінкування",[4200,4579,4580,4585],{},[4222,4581,4582],{},[3425,4583,4584],{},"-Wall",[4222,4586,4587],{},"Усі попередження",[4200,4589,4590,4595],{},[4222,4591,4592],{},[3425,4593,4594],{},"-Wextra",[4222,4596,4597],{},"Додаткові попередження",[4200,4599,4600,4605],{},[4222,4601,4602],{},[3425,4603,4604],{},"-std=c++17",[4222,4606,4607],{},"Стандарт C++",[4200,4609,4610,4615],{},[4222,4611,4612],{},[3425,4613,4614],{},"-g",[4222,4616,4617],{},"Інформація для дебаґера",[4200,4619,4620,4625],{},[4222,4621,4622],{},[3425,4623,4624],{},"-D СИМВОЛ",[4222,4626,4627],{},"Визначити символ препроцесора",[3418,4629,4630],{},"Рекомендований мінімум:",[3519,4632,4634],{"className":3894,"code":4633,"language":3896,"meta":3527,"style":3527},"g++ -std=c++17 -Wall -Wextra main.cpp add.cpp -o program\n",[3425,4635,4636],{"__ignoreMap":3527},[3571,4637,4638,4640,4643,4646,4649,4651,4653,4655],{"class":3573,"line":3574},[3571,4639,3847],{"class":3598},[3571,4641,4642],{"class":3594}," -std=c++17",[3571,4644,4645],{"class":3594}," -Wall",[3571,4647,4648],{"class":3594}," -Wextra",[3571,4650,4480],{"class":3580},[3571,4652,4483],{"class":3580},[3571,4654,4486],{"class":3594},[3571,4656,4489],{"class":3580},[3850,4658,4660],{"id":4659},"clion","CLion",[3418,4662,4663,4664,4667,4668,4176,4670,4673],{},"CLion використовує ",[3436,4665,4666],{},"CMake",". Додайте новий ",[3425,4669,3460],{},[3425,4671,4672],{},"CMakeLists.txt",":",[3519,4675,4679],{"className":4676,"code":4677,"language":4678,"meta":3527,"style":3527},"language-cmake shiki shiki-themes light-plus dark-plus dark-plus","add_executable(program\n    main.cpp\n    add.cpp\n)\n","cmake",[3425,4680,4681,4686,4691,4696],{"__ignoreMap":3527},[3571,4682,4683],{"class":3573,"line":3574},[3571,4684,4685],{},"add_executable(program\n",[3571,4687,4688],{"class":3573,"line":3584},[3571,4689,4690],{},"    main.cpp\n",[3571,4692,4693],{"class":3573,"line":3591},[3571,4694,4695],{},"    add.cpp\n",[3571,4697,4698],{"class":3573,"line":3627},[3571,4699,3735],{},[3850,4701,4703],{"id":4702},"vs-code","VS Code",[3418,4705,4706,4707,4710,4711,4673],{},"У ",[3425,4708,4709],{},"tasks.json"," явно перерахуйте файли у полі ",[3425,4712,4713],{},"args",[3519,4715,4719],{"className":4716,"code":4717,"language":4718,"meta":3527,"style":3527},"language-json shiki shiki-themes light-plus dark-plus dark-plus","\"args\": [\"-std=c++17\", \"-Wall\", \"main.cpp\", \"add.cpp\", \"-o\", \"program\"]\n","json",[3425,4720,4721],{"__ignoreMap":3527},[3571,4722,4723,4726,4729,4732,4734,4737,4739,4742,4744,4747,4749,4752,4754,4757],{"class":3573,"line":3574},[3571,4724,4725],{"class":3580},"\"args\"",[3571,4727,4728],{"class":3602},": [",[3571,4730,4731],{"class":3580},"\"-std=c++17\"",[3571,4733,3612],{"class":3602},[3571,4735,4736],{"class":3580},"\"-Wall\"",[3571,4738,3612],{"class":3602},[3571,4740,4741],{"class":3580},"\"main.cpp\"",[3571,4743,3612],{"class":3602},[3571,4745,4746],{"class":3580},"\"add.cpp\"",[3571,4748,3612],{"class":3602},[3571,4750,4751],{"class":3580},"\"-o\"",[3571,4753,3612],{"class":3602},[3571,4755,4756],{"class":3580},"\"program\"",[3571,4758,4759],{"class":3602},"]\n",[3827,4761,4762],{},"Найпоширеніша помилка в IDE: файл фізично існує в папці проєкту, але не підключений до збірки. Симптом — «undefined reference» при правильному коді. Завжди перевіряйте конфігурацію збірки.",[3449,4764],{},[3413,4766,4768],{"id":4767},"типові-помилки-та-їх-діагностика","Типові помилки та їх діагностика",[3418,4770,4771],{},"При роботі з багатофайловими проєктами виникають три характерні помилки.",[3418,4773,4774,4777,4778,4780],{},[3436,4775,4776],{},"«was not declared in this scope»"," — помилка ",[3436,4779,3533],{},". Відсутнє попереднє оголошення функції. Додайте прототип перед першим використанням.",[3418,4782,4783,4777,4786,4788,4789,4791],{},[3436,4784,4785],{},"«undefined reference»",[3436,4787,3537],{},". Оголошення є, але визначення не знайдено. Переконайтеся, що файл із реалізацією є в команді ",[3425,4790,3847],{}," або у конфігурації IDE.",[3418,4793,4794,4777,4797,4799,4800,3465],{},[3436,4795,4796],{},"«multiple definition»",[3436,4798,3537],{},". Визначення зустрічається більше одного разу — найчастіше через визначення функції в заголовку, який підключається в кількох ",[3425,4801,3460],{},[4803,4804,4805,4811,4821],"field-group",{},[4806,4807,4810],"field",{"name":4808,"type":4809},"was not declared","Помилка компілятора","Відсутнє попереднє оголошення. Додайте прототип функції у файл, де вона використовується.",[4806,4812,4815,4816,4818,4819,3465],{"name":4813,"type":4814},"undefined reference","Помилка лінкера","Файл із визначенням не підключено до збірки. Перевірте команду ",[3425,4817,3847],{}," або ",[3425,4820,4672],{},[4806,4822,4824,4825,4827],{"name":4823,"type":4814},"multiple definition","Визначення функції більше одного разу. Визначення — лише в одному ",[3425,4826,3460],{},", у заголовку — лише оголошення.",[3449,4829],{},[3413,4831,4833],{"id":4832},"заголовкові-файли","Заголовкові файли",[3850,4835,4837],{"id":4836},"проблема-повторення-оголошень","Проблема повторення оголошень",[3418,4839,4840,4841,4843,4844,4846],{},"Попереднє оголошення вручну в кожному ",[3425,4842,3460],{}," — рішення, що погано масштабується. Якщо функція ",[3425,4845,3508],{}," потрібна в п'яти файлах, доведеться вписати її прототип у кожен. Коли сигнатура зміниться — виправляти у п'яти місцях.",[3418,4848,4849,4850,4853,4854,3465],{},"Це порушення принципу ",[3436,4851,4852],{},"DRY"," (Don't Repeat Yourself): одна й та сама інформація існує в кількох місцях. Рішення мови C++ — ",[3436,4855,4856],{},"заголовковий файл",[3850,4858,4860],{"id":4859},"що-таке-заголовковий-файл","Що таке заголовковий файл",[3418,4862,4863,4866,4867,4870],{},[3436,4864,4865],{},"Заголовковий файл"," (header file) — файл із розширенням ",[3425,4868,4869],{},".h",", що містить оголошення: прототипи функцій, визначення структур і класів, псевдоніми типів, константи. Не реалізації — лише «контракти».",[3418,4872,4873,4874,4877,4878,4881,4882,4885],{},"Директива ",[3425,4875,4876],{},"#include \"math.h\""," — це не «підключення модуля». Препроцесор буквально ",[3436,4879,4880],{},"копіює весь вміст"," файлу ",[3425,4883,4884],{},"math.h"," і вставляє його на місці рядка. Те, що бачить компілятор — суцільний текст, ніби ви вписали вміст заголовка власноруч.",[3850,4887,4889,4890,4892,4893,4895],{"id":4888},"пара-h-cpp-еталонний-патерн","Пара ",[3425,4891,4869],{}," \u002F ",[3425,4894,3460],{}," — еталонний патерн",[3418,4897,4898,4899,4901,4902,4904,4905,4908,4909,4911,4912,4915],{},"Стандартна організація: для кожного ",[3425,4900,3460],{}," існує відповідний ",[3425,4903,4869],{},". Заголовок описує ",[3436,4906,4907],{},"що"," робить модуль (інтерфейс), ",[3425,4910,3460],{}," — ",[3436,4913,4914],{},"як"," (реалізація).",[3519,4917,4919],{"className":3564,"code":4918,"filename":4884,"language":3566,"meta":3567,"style":3527},"#ifndef MATH_H\n#define MATH_H\n\nint add(int a, int b);\nint subtract(int a, int b);\nint multiply(int a, int b);\ndouble divide(double a, double b);\n\n#endif\n",[3425,4920,4921,4929,4936,4940,4961,4982,5003,5025,5029],{"__ignoreMap":3527},[3571,4922,4923,4926],{"class":3573,"line":3574},[3571,4924,4925],{"class":3577},"#ifndef",[3571,4927,4928],{"class":3594}," MATH_H\n",[3571,4930,4931,4934],{"class":3573,"line":3584},[3571,4932,4933],{"class":3577},"#define",[3571,4935,4928],{"class":3594},[3571,4937,4938],{"class":3573,"line":3591},[3571,4939,3588],{"emptyLinePlaceholder":3587},[3571,4941,4942,4944,4946,4948,4950,4952,4954,4956,4958],{"class":3573,"line":3627},[3571,4943,3595],{"class":3594},[3571,4945,3599],{"class":3598},[3571,4947,3603],{"class":3602},[3571,4949,3595],{"class":3594},[3571,4951,3609],{"class":3608},[3571,4953,3612],{"class":3602},[3571,4955,3595],{"class":3594},[3571,4957,3617],{"class":3608},[3571,4959,4960],{"class":3602},");\n",[3571,4962,4963,4965,4968,4970,4972,4974,4976,4978,4980],{"class":3573,"line":3632},[3571,4964,3595],{"class":3594},[3571,4966,4967],{"class":3598}," subtract",[3571,4969,3603],{"class":3602},[3571,4971,3595],{"class":3594},[3571,4973,3609],{"class":3608},[3571,4975,3612],{"class":3602},[3571,4977,3595],{"class":3594},[3571,4979,3617],{"class":3608},[3571,4981,4960],{"class":3602},[3571,4983,4984,4986,4989,4991,4993,4995,4997,4999,5001],{"class":3573,"line":3643},[3571,4985,3595],{"class":3594},[3571,4987,4988],{"class":3598}," multiply",[3571,4990,3603],{"class":3602},[3571,4992,3595],{"class":3594},[3571,4994,3609],{"class":3608},[3571,4996,3612],{"class":3602},[3571,4998,3595],{"class":3594},[3571,5000,3617],{"class":3608},[3571,5002,4960],{"class":3602},[3571,5004,5005,5008,5011,5013,5015,5017,5019,5021,5023],{"class":3573,"line":3649},[3571,5006,5007],{"class":3594},"double",[3571,5009,5010],{"class":3598}," divide",[3571,5012,3603],{"class":3602},[3571,5014,5007],{"class":3594},[3571,5016,3609],{"class":3608},[3571,5018,3612],{"class":3602},[3571,5020,5007],{"class":3594},[3571,5022,3617],{"class":3608},[3571,5024,4960],{"class":3602},[3571,5026,5027],{"class":3573,"line":3694},[3571,5028,3588],{"emptyLinePlaceholder":3587},[3571,5030,5031],{"class":3573,"line":3705},[3571,5032,5033],{"class":3577},"#endif\n",[3519,5035,5037],{"className":3564,"code":5036,"filename":3512,"language":3566,"meta":3567,"style":3527},"#include \"math.h\"\n\nint add(int a, int b)      { return a + b; }\nint subtract(int a, int b) { return a - b; }\nint multiply(int a, int b) { return a * b; }\n\ndouble divide(double a, double b)\n{\n    if (b == 0.0) return 0.0;\n    return a \u002F b;\n}\n",[3425,5038,5039,5046,5050,5077,5103,5128,5132,5152,5156,5177,5185],{"__ignoreMap":3527},[3571,5040,5041,5043],{"class":3573,"line":3574},[3571,5042,3471],{"class":3577},[3571,5044,5045],{"class":3580}," \"math.h\"\n",[3571,5047,5048],{"class":3573,"line":3584},[3571,5049,3588],{"emptyLinePlaceholder":3587},[3571,5051,5052,5054,5056,5058,5060,5062,5064,5066,5068,5071,5074],{"class":3573,"line":3591},[3571,5053,3595],{"class":3594},[3571,5055,3599],{"class":3598},[3571,5057,3603],{"class":3602},[3571,5059,3595],{"class":3594},[3571,5061,3609],{"class":3608},[3571,5063,3612],{"class":3602},[3571,5065,3595],{"class":3594},[3571,5067,3617],{"class":3608},[3571,5069,5070],{"class":3602},")      { ",[3571,5072,5073],{"class":3577},"return",[3571,5075,5076],{"class":3602}," a + b; }\n",[3571,5078,5079,5081,5083,5085,5087,5089,5091,5093,5095,5098,5100],{"class":3573,"line":3627},[3571,5080,3595],{"class":3594},[3571,5082,4967],{"class":3598},[3571,5084,3603],{"class":3602},[3571,5086,3595],{"class":3594},[3571,5088,3609],{"class":3608},[3571,5090,3612],{"class":3602},[3571,5092,3595],{"class":3594},[3571,5094,3617],{"class":3608},[3571,5096,5097],{"class":3602},") { ",[3571,5099,5073],{"class":3577},[3571,5101,5102],{"class":3602}," a - b; }\n",[3571,5104,5105,5107,5109,5111,5113,5115,5117,5119,5121,5123,5125],{"class":3573,"line":3632},[3571,5106,3595],{"class":3594},[3571,5108,4988],{"class":3598},[3571,5110,3603],{"class":3602},[3571,5112,3595],{"class":3594},[3571,5114,3609],{"class":3608},[3571,5116,3612],{"class":3602},[3571,5118,3595],{"class":3594},[3571,5120,3617],{"class":3608},[3571,5122,5097],{"class":3602},[3571,5124,5073],{"class":3577},[3571,5126,5127],{"class":3602}," a * b; }\n",[3571,5129,5130],{"class":3573,"line":3643},[3571,5131,3588],{"emptyLinePlaceholder":3587},[3571,5133,5134,5136,5138,5140,5142,5144,5146,5148,5150],{"class":3573,"line":3649},[3571,5135,5007],{"class":3594},[3571,5137,5010],{"class":3598},[3571,5139,3603],{"class":3602},[3571,5141,5007],{"class":3594},[3571,5143,3609],{"class":3608},[3571,5145,3612],{"class":3602},[3571,5147,5007],{"class":3594},[3571,5149,3617],{"class":3608},[3571,5151,3735],{"class":3602},[3571,5153,5154],{"class":3573,"line":3694},[3571,5155,3646],{"class":3602},[3571,5157,5158,5161,5164,5167,5170,5172,5175],{"class":3573,"line":3705},[3571,5159,5160],{"class":3577},"    if",[3571,5162,5163],{"class":3602}," (b == ",[3571,5165,5166],{"class":3670},"0.0",[3571,5168,5169],{"class":3602},") ",[3571,5171,5073],{"class":3577},[3571,5173,5174],{"class":3670}," 0.0",[3571,5176,3691],{"class":3602},[3571,5178,5180,5182],{"class":3573,"line":5179},10,[3571,5181,3697],{"class":3577},[3571,5183,5184],{"class":3602}," a \u002F b;\n",[3571,5186,5188],{"class":3573,"line":5187},11,[3571,5189,3708],{"class":3602},[3519,5191,5193],{"className":3564,"code":5192,"filename":3504,"language":3566,"meta":3567,"style":3527},"#include \u003Ciostream>\n#include \"math.h\"\n\nint main()\n{\n    std::cout \u003C\u003C \"Сума:    \" \u003C\u003C add(10, 3)      \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"Різниця: \" \u003C\u003C subtract(10, 3) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"Частка:  \" \u003C\u003C divide(10, 3)   \u003C\u003C \"\\n\";\n    return 0;\n}\n",[3425,5194,5195,5201,5207,5211,5219,5223,5256,5288,5321,5329],{"__ignoreMap":3527},[3571,5196,5197,5199],{"class":3573,"line":3574},[3571,5198,3471],{"class":3577},[3571,5200,3581],{"class":3580},[3571,5202,5203,5205],{"class":3573,"line":3584},[3571,5204,3471],{"class":3577},[3571,5206,5045],{"class":3580},[3571,5208,5209],{"class":3573,"line":3591},[3571,5210,3588],{"emptyLinePlaceholder":3587},[3571,5212,5213,5215,5217],{"class":3573,"line":3627},[3571,5214,3595],{"class":3594},[3571,5216,3637],{"class":3598},[3571,5218,3640],{"class":3602},[3571,5220,5221],{"class":3573,"line":3632},[3571,5222,3646],{"class":3602},[3571,5224,5225,5227,5229,5232,5234,5236,5238,5241,5243,5245,5248,5250,5252,5254],{"class":3573,"line":3643},[3571,5226,3653],{"class":3652},[3571,5228,3656],{"class":3602},[3571,5230,5231],{"class":3580},"\"Сума:    \"",[3571,5233,3662],{"class":3602},[3571,5235,3665],{"class":3598},[3571,5237,3603],{"class":3602},[3571,5239,5240],{"class":3670},"10",[3571,5242,3612],{"class":3602},[3571,5244,3671],{"class":3670},[3571,5246,5247],{"class":3602},")      \u003C\u003C ",[3571,5249,3682],{"class":3580},[3571,5251,3686],{"class":3685},[3571,5253,3682],{"class":3580},[3571,5255,3691],{"class":3602},[3571,5257,5258,5260,5262,5265,5267,5270,5272,5274,5276,5278,5280,5282,5284,5286],{"class":3573,"line":3649},[3571,5259,3653],{"class":3652},[3571,5261,3656],{"class":3602},[3571,5263,5264],{"class":3580},"\"Різниця: \"",[3571,5266,3662],{"class":3602},[3571,5268,5269],{"class":3598},"subtract",[3571,5271,3603],{"class":3602},[3571,5273,5240],{"class":3670},[3571,5275,3612],{"class":3602},[3571,5277,3671],{"class":3670},[3571,5279,3679],{"class":3602},[3571,5281,3682],{"class":3580},[3571,5283,3686],{"class":3685},[3571,5285,3682],{"class":3580},[3571,5287,3691],{"class":3602},[3571,5289,5290,5292,5294,5297,5299,5302,5304,5306,5308,5310,5313,5315,5317,5319],{"class":3573,"line":3694},[3571,5291,3653],{"class":3652},[3571,5293,3656],{"class":3602},[3571,5295,5296],{"class":3580},"\"Частка:  \"",[3571,5298,3662],{"class":3602},[3571,5300,5301],{"class":3598},"divide",[3571,5303,3603],{"class":3602},[3571,5305,5240],{"class":3670},[3571,5307,3612],{"class":3602},[3571,5309,3671],{"class":3670},[3571,5311,5312],{"class":3602},")   \u003C\u003C ",[3571,5314,3682],{"class":3580},[3571,5316,3686],{"class":3685},[3571,5318,3682],{"class":3580},[3571,5320,3691],{"class":3602},[3571,5322,5323,5325,5327],{"class":3573,"line":3705},[3571,5324,3697],{"class":3577},[3571,5326,3700],{"class":3670},[3571,5328,3691],{"class":3602},[3571,5330,5331],{"class":3573,"line":5179},[3571,5332,3708],{"class":3602},[3418,5334,5335,5336,5338,5339,5341,5342,5344,5345,5347],{},"Зверніть: ",[3425,5337,3512],{}," підключає власний заголовок ",[3425,5340,4884],{},". Це захисний прийом — якщо сигнатура у ",[3425,5343,4869],{}," і ",[3425,5346,3460],{}," розійдуться, компілятор одразу повідомить про невідповідність.",[3850,5349,5351,5354,5355,5358],{"id":5350},"vs-де-шукає-препроцесор",[3425,5352,5353],{},"\u003C>"," vs ",[3425,5356,5357],{},"\"\""," — де шукає препроцесор",[3418,5360,5361,3764,5364,5367,5368,3764,5371,5374],{},[3436,5362,5363],{},"Кутові дужки",[3425,5365,5366],{},"\u003Ciostream>"," — пошук у системних директоріях стандартної бібліотеки.\n",[3436,5369,5370],{},"Подвійні лапки",[3425,5372,5373],{},"\"math.h\""," — спочатку поточна директорія, потім системні.",[3418,5376,5377],{},"Правило абсолютне:",[3792,5379,5380,5392],{},[3795,5381,5382,5383,3612,5386,3612,5389],{},"Стандартна бібліотека та сторонні бібліотеки — ",[3425,5384,5385],{},"\u003Cvector>",[3425,5387,5388],{},"\u003Ccmath>",[3425,5390,5391],{},"\u003Cstring>",[3795,5393,5394,5395,3612,5397],{},"Власні заголовки проєкту — ",[3425,5396,5373],{},[3425,5398,5399],{},"\"student.h\"",[3850,5401,5403,5404,5407,5408],{"id":5402},"чому-iostream-а-не-iostreamh","Чому ",[3425,5405,5406],{},"iostream",", а не ",[3425,5409,5410],{},"iostream.h",[3418,5412,5413,5414,5417,5418,5420,5421,5424,5425,5427,5428,5430],{},"У 1980-х ідентифікатори C++ (включно з ",[3425,5415,5416],{},"cout",") жили у глобальному просторі імен, а заголовки мали розширення ",[3425,5419,4869],{},". При стандартизації C++98 весь функціонал перемістили у простір імен ",[3425,5422,5423],{},"std"," і запровадили нові заголовки без ",[3425,5426,4869],{},". Старі (",[3425,5429,5410],{},") оголошені застарілими.",[3418,5432,5433,5434,5436,5437,3612,5439,5436,5442,3612,5445,5436,5448,3465],{},"Те саме стосується C-заголовків: ",[3425,5435,4884],{}," → ",[3425,5438,5388],{},[3425,5440,5441],{},"stdlib.h",[3425,5443,5444],{},"\u003Ccstdlib>",[3425,5446,5447],{},"string.h",[3425,5449,5450],{},"\u003Ccstring>",[3827,5452,5453,5454,4818,5457,5460,5461,5463,5464,3612,5466,3612,5468,3465],{},"Ніколи не підключайте ",[3425,5455,5456],{},"\u003Ciostream.h>",[3425,5458,5459],{},"\u003Cstring.h>"," у сучасному C++. Завжди без ",[3425,5462,4869],{},": ",[3425,5465,5366],{},[3425,5467,5391],{},[3425,5469,5388],{},[3850,5471,5473],{"id":5472},"що-можна-і-що-не-можна-класти-у-заголовок","Що можна і що не можна класти у заголовок",[3418,5475,5476,5477,5479],{},"Заголовок підключається до багатьох ",[3425,5478,3460],{}," — кожне підключення породжує копію вмісту. Якщо це визначення — порушується ODR.",[5481,5482,5483,5508],"card-group",{},[5484,5485,5488],"card",{"icon":5486,"title":5487},"i-lucide-check-circle","✅ Можна у заголовку",[3792,5489,5490,5493,5496,5502],{},[3795,5491,5492],{},"Прототипи функцій",[3795,5494,5495],{},"Визначення структур і класів",[3795,5497,5498,5501],{},[3425,5499,5500],{},"constexpr","-константи",[3795,5503,5504,5507],{},[3425,5505,5506],{},"using","-псевдоніми типів",[5484,5509,5512],{"icon":5510,"title":5511},"i-lucide-x-circle","❌ Не можна у заголовку",[3792,5513,5514,5517,5520,5525],{},[3795,5515,5516],{},"Визначення функцій (тіло)",[3795,5518,5519],{},"Визначення змінних",[3795,5521,5522],{},[3425,5523,5524],{},"using namespace std;",[3795,5526,5527],{},[3425,5528,5529],{},"#include \"file.cpp\"",[3449,5531],{},[3413,5533,5535],{"id":5534},"директиви-препроцесора","Директиви препроцесора",[3850,5537,5539],{"id":5538},"препроцесор-як-окрема-фаза","Препроцесор як окрема фаза",[3418,5541,5542,5543,4911,5546,3465],{},"Щоразу, коли ви запускаєте компіляцію, відбувається не одна, а кілька послідовних фаз. Більшість програмістів знають про дві: компіляцію і лінкування. Але є ще одна, що виконується ",[3436,5544,5545],{},"першою",[3436,5547,5548],{},"препроцесінг",[3418,5550,5551,5552,5554],{},"Препроцесор — це окрема програма, що запускається до компілятора. Він отримує вихідний ",[3425,5553,3460],{},"-файл, обробляє його зверху донизу і передає компілятору вже перетворений текст. Компілятор ніколи не бачить оригінальний файл.",[3519,5556,5559],{"className":5557,"code":5558,"language":3524},[3522],"Вихідний .cpp  →  Препроцесор  →  Розгорнутий код  →  Компілятор  →  .o файл\n",[3425,5560,5558],{"__ignoreMap":3527},[3418,5562,5563,5564,5567,5568,5571],{},"Інструкції для препроцесора — ",[3436,5565,5566],{},"директиви"," — починаються з ",[3425,5569,5570],{},"#"," і не закінчуються крапкою з комою. Вони не є операторами C++, не виконуються під час роботи програми і не генерують машинного коду.",[3445,5573,5574,5575,5578,5579,5581],{},"Препроцесор «не знає» мови C++. Він не розуміє функцій, класів, блоків ",[3425,5576,5577],{},"{}",", типів даних — лише потік тексту і рядки, що починаються з ",[3425,5580,5570],{},". Звідси виростає більшість пасток, пов'язаних із макросами.",[3850,5583,4873,5585,5587],{"id":5584},"директива-include-текстова-підстановка",[3425,5586,3471],{},": текстова підстановка",[3418,5589,5590,5591,5593,5594,5596],{},"Механіка ",[3425,5592,3471],{}," до прямолінійності проста: препроцесор ",[3436,5595,4880],{}," вказаного файлу і вставляє його на місці рядка директиви. Рядок за рядком, символ за символом. Це не «імпорт модуля» — це текстова підстановка.",[3519,5598,5601],{"className":3564,"code":5599,"filename":5600,"language":3566,"meta":3527,"style":3527},"void greet(const char* name);\n","greeting.h",[3425,5602,5603],{"__ignoreMap":3527},[3571,5604,5605,5608,5611,5613,5616,5619,5622],{"class":3573,"line":3574},[3571,5606,5607],{"class":3594},"void",[3571,5609,5610],{"class":3598}," greet",[3571,5612,3603],{"class":3602},[3571,5614,5615],{"class":3594},"const",[3571,5617,5618],{"class":3594}," char*",[3571,5620,5621],{"class":3608}," name",[3571,5623,4960],{"class":3602},[3519,5625,5627],{"className":3564,"code":5626,"filename":3504,"language":3566,"meta":3527,"style":3527},"#include \"greeting.h\"\n\nint main()\n{\n    greet(\"Олена\");\n    return 0;\n}\n",[3425,5628,5629,5636,5640,5648,5652,5664,5672],{"__ignoreMap":3527},[3571,5630,5631,5633],{"class":3573,"line":3574},[3571,5632,3471],{"class":3577},[3571,5634,5635],{"class":3580}," \"greeting.h\"\n",[3571,5637,5638],{"class":3573,"line":3584},[3571,5639,3588],{"emptyLinePlaceholder":3587},[3571,5641,5642,5644,5646],{"class":3573,"line":3591},[3571,5643,3595],{"class":3594},[3571,5645,3637],{"class":3598},[3571,5647,3640],{"class":3602},[3571,5649,5650],{"class":3573,"line":3627},[3571,5651,3646],{"class":3602},[3571,5653,5654,5657,5659,5662],{"class":3573,"line":3632},[3571,5655,5656],{"class":3598},"    greet",[3571,5658,3603],{"class":3602},[3571,5660,5661],{"class":3580},"\"Олена\"",[3571,5663,4960],{"class":3602},[3571,5665,5666,5668,5670],{"class":3573,"line":3643},[3571,5667,3697],{"class":3577},[3571,5669,3700],{"class":3670},[3571,5671,3691],{"class":3602},[3571,5673,5674],{"class":3573,"line":3649},[3571,5675,3708],{"class":3602},[3418,5677,5678],{},"Після роботи препроцесора компілятор бачить:",[3519,5680,5682],{"className":3564,"code":5681,"language":3566,"meta":3527,"style":3527},"void greet(const char* name);\n\nint main()\n{\n    greet(\"Олена\");\n    return 0;\n}\n",[3425,5683,5684,5700,5704,5712,5716,5726,5734],{"__ignoreMap":3527},[3571,5685,5686,5688,5690,5692,5694,5696,5698],{"class":3573,"line":3574},[3571,5687,5607],{"class":3594},[3571,5689,5610],{"class":3598},[3571,5691,3603],{"class":3602},[3571,5693,5615],{"class":3594},[3571,5695,5618],{"class":3594},[3571,5697,5621],{"class":3608},[3571,5699,4960],{"class":3602},[3571,5701,5702],{"class":3573,"line":3584},[3571,5703,3588],{"emptyLinePlaceholder":3587},[3571,5705,5706,5708,5710],{"class":3573,"line":3591},[3571,5707,3595],{"class":3594},[3571,5709,3637],{"class":3598},[3571,5711,3640],{"class":3602},[3571,5713,5714],{"class":3573,"line":3627},[3571,5715,3646],{"class":3602},[3571,5717,5718,5720,5722,5724],{"class":3573,"line":3632},[3571,5719,5656],{"class":3598},[3571,5721,3603],{"class":3602},[3571,5723,5661],{"class":3580},[3571,5725,4960],{"class":3602},[3571,5727,5728,5730,5732],{"class":3573,"line":3643},[3571,5729,3697],{"class":3577},[3571,5731,3700],{"class":3670},[3571,5733,3691],{"class":3602},[3571,5735,5736],{"class":3573,"line":3649},[3571,5737,3708],{"class":3602},[3418,5739,5740,5741,5743,5744,5747,5748,5750],{},"Рядок ",[3425,5742,3471],{}," зник — замість нього вміст файлу. ",[3425,5745,5746],{},"#include \u003Ciostream>"," вставляє тисячі рядків оголошень стандартної бібліотеки. Саме тому компіляція з ",[3425,5749,5366],{}," займає більше часу.",[3540,5752,5753,5754,5757,5758,5761,5762,5764],{},"Запустіть ",[3425,5755,5756],{},"g++ -E main.cpp"," — прапор ",[3425,5759,5760],{},"-E"," зупиняє процес після препроцесінгу і виводить розгорнутий текст. Для файлу з ",[3425,5763,5746],{}," це кілька десятків тисяч рядків.",[3418,5766,5767],{},"Заголовок може підключати інший заголовок — препроцесор розгортає ланцюжок рекурсивно:",[3519,5769,5772],{"className":5770,"code":5771,"language":3524},[3522],"main.cpp\n  └── #include \"geometry.h\"\n        └── #include \"math.h\"\n              └── #include \u003Ccmath>\n",[3425,5773,5771],{"__ignoreMap":3527},[3850,5775,4873,5777,5779],{"id":5776},"директива-define-макроси",[3425,5778,4933],{},": макроси",[3418,5781,5782,5784,5785,5788],{},[3425,5783,4933],{}," оголошує ",[3436,5786,5787],{},"макрос"," — правило підстановки тексту. Є два різновиди.",[3418,5790,5791,5794],{},[3436,5792,5793],{},"Макроси з підстановкою тексту"," — ідентифікатор замінюється на заданий текст скрізь у файлі:",[3519,5796,5799],{"className":3564,"code":5797,"filename":5798,"language":3566,"meta":3567,"style":3527},"#include \u003Ciostream>\n\n#define MAX_STUDENTS  30\n#define PI            3.14159265\n#define GREETING      \"Привіт, \"\n\nint main()\n{\n    std::cout \u003C\u003C GREETING \u003C\u003C \"C++!\\n\";\n    std::cout \u003C\u003C \"Макс. студентів: \" \u003C\u003C MAX_STUDENTS \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"Число пі: \" \u003C\u003C PI \u003C\u003C \"\\n\";\n    return 0;\n}\n","MacroDemo.cpp",[3425,5800,5801,5807,5811,5821,5831,5841,5845,5853,5857,5873,5893,5913,5922],{"__ignoreMap":3527},[3571,5802,5803,5805],{"class":3573,"line":3574},[3571,5804,3471],{"class":3577},[3571,5806,3581],{"class":3580},[3571,5808,5809],{"class":3573,"line":3584},[3571,5810,3588],{"emptyLinePlaceholder":3587},[3571,5812,5813,5815,5818],{"class":3573,"line":3591},[3571,5814,4933],{"class":3577},[3571,5816,5817],{"class":3594}," MAX_STUDENTS  ",[3571,5819,5820],{"class":3670},"30\n",[3571,5822,5823,5825,5828],{"class":3573,"line":3627},[3571,5824,4933],{"class":3577},[3571,5826,5827],{"class":3594}," PI            ",[3571,5829,5830],{"class":3670},"3.14159265\n",[3571,5832,5833,5835,5838],{"class":3573,"line":3632},[3571,5834,4933],{"class":3577},[3571,5836,5837],{"class":3594}," GREETING      ",[3571,5839,5840],{"class":3580},"\"Привіт, \"\n",[3571,5842,5843],{"class":3573,"line":3643},[3571,5844,3588],{"emptyLinePlaceholder":3587},[3571,5846,5847,5849,5851],{"class":3573,"line":3649},[3571,5848,3595],{"class":3594},[3571,5850,3637],{"class":3598},[3571,5852,3640],{"class":3602},[3571,5854,5855],{"class":3573,"line":3694},[3571,5856,3646],{"class":3602},[3571,5858,5859,5861,5864,5867,5869,5871],{"class":3573,"line":3705},[3571,5860,3653],{"class":3652},[3571,5862,5863],{"class":3602},"::cout \u003C\u003C GREETING \u003C\u003C ",[3571,5865,5866],{"class":3580},"\"C++!",[3571,5868,3686],{"class":3685},[3571,5870,3682],{"class":3580},[3571,5872,3691],{"class":3602},[3571,5874,5875,5877,5879,5882,5885,5887,5889,5891],{"class":3573,"line":5179},[3571,5876,3653],{"class":3652},[3571,5878,3656],{"class":3602},[3571,5880,5881],{"class":3580},"\"Макс. студентів: \"",[3571,5883,5884],{"class":3602}," \u003C\u003C MAX_STUDENTS \u003C\u003C ",[3571,5886,3682],{"class":3580},[3571,5888,3686],{"class":3685},[3571,5890,3682],{"class":3580},[3571,5892,3691],{"class":3602},[3571,5894,5895,5897,5899,5902,5905,5907,5909,5911],{"class":3573,"line":5187},[3571,5896,3653],{"class":3652},[3571,5898,3656],{"class":3602},[3571,5900,5901],{"class":3580},"\"Число пі: \"",[3571,5903,5904],{"class":3602}," \u003C\u003C PI \u003C\u003C ",[3571,5906,3682],{"class":3580},[3571,5908,3686],{"class":3685},[3571,5910,3682],{"class":3580},[3571,5912,3691],{"class":3602},[3571,5914,5916,5918,5920],{"class":3573,"line":5915},12,[3571,5917,3697],{"class":3577},[3571,5919,3700],{"class":3670},[3571,5921,3691],{"class":3602},[3571,5923,5925],{"class":3573,"line":5924},13,[3571,5926,3708],{"class":3602},[3752,5928,5930,5939,5943,5951,5959],{"title":5929},".\u002FMacroDemo",[3756,5931,5933,3764,5936],{"className":5932},[3573],[3571,5934,3763],{"className":5935},[3762],[3436,5937,5929],{"className":5938},[3768],[3756,5940,5942],{"className":5941},[3573],"Привіт, C++!",[3756,5944,5946,5947],{"className":5945},[3573],"Макс. студентів: ",[3571,5948,5950],{"className":5949},[3777],"30",[3756,5952,5954,5955],{"className":5953},[3573],"Число пі: ",[3571,5956,5958],{"className":5957},[3777],"3.14159265",[3756,5960,3782,5962,3465],{"className":5961},[3573],[3571,5963,3787],{"className":5964},[3786,3768],[3418,5966,5967],{},"Підстановка буквальна: препроцесор не знає типів, пріоритетів операторів чи контексту. Саме тому макроси-функції — антипатерн:",[3519,5969,5971],{"className":3564,"code":5970,"language":3566,"meta":3527,"style":3527},"#define SQUARE(x)  x * x\n\u002F\u002F SQUARE(a+1) → a+1 * a+1 = 11, а не 36 !\n",[3425,5972,5973,5992],{"__ignoreMap":3527},[3571,5974,5975,5977,5980,5983,5986,5989],{"class":3573,"line":3574},[3571,5976,4933],{"class":3577},[3571,5978,5979],{"class":3594}," SQUARE(",[3571,5981,5982],{"class":3608},"x",[3571,5984,5985],{"class":3594},")  x ",[3571,5987,5988],{"class":3602},"*",[3571,5990,5991],{"class":3594}," x\n",[3571,5993,5994],{"class":3573,"line":3584},[3571,5995,5996],{"class":3623},"\u002F\u002F SQUARE(a+1) → a+1 * a+1 = 11, а не 36 !\n",[3827,5998,5999,6000,6002,6003,6005],{},"Для констант завжди використовуйте ",[3425,6001,5500],{}," — вона типобезпечна, видима дебаґером і обмежена лексичною областю видимості. ",[3425,6004,4933],{}," для констант — антипатерн у сучасному C++.",[4194,6007,6008,6023],{},[4197,6009,6010],{},[4200,6011,6012,6015,6019],{},[4203,6013,6014],{},"Критерій",[4203,6016,6017],{"align":4208},[3425,6018,4933],{},[4203,6020,6021],{"align":4208},[3425,6022,5500],{},[4217,6024,6025,6036,6047,6056],{},[4200,6026,6027,6030,6033],{},[4222,6028,6029],{},"Тип",[4222,6031,6032],{"align":4208},"❌ немає",[4222,6034,6035],{"align":4208},"✅ строго типізована",[4200,6037,6038,6041,6044],{},[4222,6039,6040],{},"Область видимості",[4222,6042,6043],{"align":4208},"❌ весь файл",[4222,6045,6046],{"align":4208},"✅ лексична",[4200,6048,6049,6052,6054],{},[4222,6050,6051],{},"Видима дебаґером",[4222,6053,4240],{"align":4208},[4222,6055,4243],{"align":4208},[4200,6057,6058,6061,6064],{},[4222,6059,6060],{},"Рекомендація",[4222,6062,6063],{"align":4208},"Лише для символів умовної компіляції",[4222,6065,6066],{"align":4208},"Для всіх констант",[3418,6068,6069,6072,6073,6075],{},[3436,6070,6071],{},"Макроси без підстановки"," — символи-прапорці. Вони не замінюють жодного тексту, лише реєструють факт: символ визначений. Це основний легітимний сценарій ",[3425,6074,4933],{}," у сучасному C++:",[3519,6077,6079],{"className":3564,"code":6078,"language":3566,"meta":3527,"style":3527},"#define DEBUG\n#define TESTING\n#define PLATFORM_WINDOWS\n",[3425,6080,6081,6088,6095],{"__ignoreMap":3527},[3571,6082,6083,6085],{"class":3573,"line":3574},[3571,6084,4933],{"class":3577},[3571,6086,6087],{"class":3594}," DEBUG\n",[3571,6089,6090,6092],{"class":3573,"line":3584},[3571,6091,4933],{"class":3577},[3571,6093,6094],{"class":3594}," TESTING\n",[3571,6096,6097,6099],{"class":3573,"line":3591},[3571,6098,4933],{"class":3577},[3571,6100,6101],{"class":3594}," PLATFORM_WINDOWS\n",[3850,6103,6105],{"id":6104},"умовна-компіляція","Умовна компіляція",[3418,6107,6108,6110,6111,6114],{},[3436,6109,6105],{}," дозволяє включати або виключати блоки коду залежно від визначених символів. Рішення приймається препроцесором ",[3436,6112,6113],{},"до компіляції"," — відповідний блок або вставляється в код, або взагалі не потрапляє до компілятора.",[3519,6116,6119],{"className":3564,"code":6117,"filename":6118,"language":3566,"meta":3567,"style":3527},"#include \u003Ciostream>\n\n\u002F\u002F #define DEBUG  ← розкоментуйте для відлагоджувального виводу\n\nint calculateSum(int a, int b)\n{\n#ifdef DEBUG\n    std::cerr \u003C\u003C \"[DEBUG] calculateSum(\" \u003C\u003C a \u003C\u003C \", \" \u003C\u003C b \u003C\u003C \")\\n\";\n#endif\n    return a + b;\n}\n\nint main()\n{\n    std::cout \u003C\u003C \"Sum: \" \u003C\u003C calculateSum(3, 4) \u003C\u003C \"\\n\";\n    return 0;\n}\n","DebugLog.cpp",[3425,6120,6121,6127,6131,6136,6140,6161,6165,6172,6200,6204,6210,6214,6218,6226,6231,6264,6273],{"__ignoreMap":3527},[3571,6122,6123,6125],{"class":3573,"line":3574},[3571,6124,3471],{"class":3577},[3571,6126,3581],{"class":3580},[3571,6128,6129],{"class":3573,"line":3584},[3571,6130,3588],{"emptyLinePlaceholder":3587},[3571,6132,6133],{"class":3573,"line":3591},[3571,6134,6135],{"class":3623},"\u002F\u002F #define DEBUG  ← розкоментуйте для відлагоджувального виводу\n",[3571,6137,6138],{"class":3573,"line":3627},[3571,6139,3588],{"emptyLinePlaceholder":3587},[3571,6141,6142,6144,6147,6149,6151,6153,6155,6157,6159],{"class":3573,"line":3632},[3571,6143,3595],{"class":3594},[3571,6145,6146],{"class":3598}," calculateSum",[3571,6148,3603],{"class":3602},[3571,6150,3595],{"class":3594},[3571,6152,3609],{"class":3608},[3571,6154,3612],{"class":3602},[3571,6156,3595],{"class":3594},[3571,6158,3617],{"class":3608},[3571,6160,3735],{"class":3602},[3571,6162,6163],{"class":3573,"line":3643},[3571,6164,3646],{"class":3602},[3571,6166,6167,6170],{"class":3573,"line":3649},[3571,6168,6169],{"class":3577},"#ifdef",[3571,6171,6087],{"class":3594},[3571,6173,6174,6176,6179,6182,6185,6188,6191,6194,6196,6198],{"class":3573,"line":3694},[3571,6175,3653],{"class":3652},[3571,6177,6178],{"class":3602},"::cerr \u003C\u003C ",[3571,6180,6181],{"class":3580},"\"[DEBUG] calculateSum(\"",[3571,6183,6184],{"class":3602}," \u003C\u003C a \u003C\u003C ",[3571,6186,6187],{"class":3580},"\", \"",[3571,6189,6190],{"class":3602}," \u003C\u003C b \u003C\u003C ",[3571,6192,6193],{"class":3580},"\")",[3571,6195,3686],{"class":3685},[3571,6197,3682],{"class":3580},[3571,6199,3691],{"class":3602},[3571,6201,6202],{"class":3573,"line":3705},[3571,6203,5033],{"class":3577},[3571,6205,6206,6208],{"class":3573,"line":5179},[3571,6207,3697],{"class":3577},[3571,6209,3746],{"class":3602},[3571,6211,6212],{"class":3573,"line":5187},[3571,6213,3708],{"class":3602},[3571,6215,6216],{"class":3573,"line":5915},[3571,6217,3588],{"emptyLinePlaceholder":3587},[3571,6219,6220,6222,6224],{"class":3573,"line":5924},[3571,6221,3595],{"class":3594},[3571,6223,3637],{"class":3598},[3571,6225,3640],{"class":3602},[3571,6227,6229],{"class":3573,"line":6228},14,[3571,6230,3646],{"class":3602},[3571,6232,6234,6236,6238,6241,6243,6246,6248,6250,6252,6254,6256,6258,6260,6262],{"class":3573,"line":6233},15,[3571,6235,3653],{"class":3652},[3571,6237,3656],{"class":3602},[3571,6239,6240],{"class":3580},"\"Sum: \"",[3571,6242,3662],{"class":3602},[3571,6244,6245],{"class":3598},"calculateSum",[3571,6247,3603],{"class":3602},[3571,6249,3671],{"class":3670},[3571,6251,3612],{"class":3602},[3571,6253,3676],{"class":3670},[3571,6255,3679],{"class":3602},[3571,6257,3682],{"class":3580},[3571,6259,3686],{"class":3685},[3571,6261,3682],{"class":3580},[3571,6263,3691],{"class":3602},[3571,6265,6267,6269,6271],{"class":3573,"line":6266},16,[3571,6268,3697],{"class":3577},[3571,6270,3700],{"class":3670},[3571,6272,3691],{"class":3602},[3571,6274,6276],{"class":3573,"line":6275},17,[3571,6277,3708],{"class":3602},[3752,6279,6281,6291,6299,6306],{"title":6280},".\u002FDebugLog (з DEBUG)",[3756,6282,6284,3764,6287],{"className":6283},[3573],[3571,6285,3763],{"className":6286},[3762],[3436,6288,6290],{"className":6289},[3768],".\u002FDebugLog",[3756,6292,6294],{"className":6293},[3573],[3571,6295,6298],{"className":6296},[6297],"text-yellow-400","[DEBUG] calculateSum(3, 4)",[3756,6300,6302,6303],{"className":6301},[3573],"Sum: ",[3571,6304,3778],{"className":6305},[3777],[3756,6307,3782,6309,3465],{"className":6308},[3573],[3571,6310,3787],{"className":6311},[3786,3768],[3418,6313,6314],{},"Основні директиви умовної компіляції:",[3792,6316,6317,6326,6334,6349],{},[3795,6318,6319,6322,6323],{},[3425,6320,6321],{},"#ifdef СИМВОЛ"," — якщо символ ",[3436,6324,6325],{},"визначено",[3795,6327,6328,6322,6331],{},[3425,6329,6330],{},"#ifndef СИМВОЛ",[3436,6332,6333],{},"не визначено",[3795,6335,6336,4892,6339,4892,6342,4892,6345,6348],{},[3425,6337,6338],{},"#if вираз",[3425,6340,6341],{},"#elif вираз",[3425,6343,6344],{},"#else",[3425,6346,6347],{},"#endif"," — повноцінні умовні гілки",[3795,6350,6351,6354,6355],{},[3425,6352,6353],{},"defined()"," — перевірка у виразах ",[3425,6356,6357],{},"#if",[3519,6359,6362],{"className":3564,"code":6360,"filename":6361,"language":3566,"meta":3567,"style":3527},"#include \u003Ciostream>\n\n#define LOG_LEVEL 2\n\nint main()\n{\n#if LOG_LEVEL >= 3\n    std::cout \u003C\u003C \"[INFO]  Програма запущена\\n\";\n#endif\n#if LOG_LEVEL >= 2\n    std::cout \u003C\u003C \"[WARN]  Рівень заряду батареї низький\\n\";\n#endif\n#if LOG_LEVEL >= 1\n    std::cout \u003C\u003C \"[ERROR] Підключення втрачено\\n\";\n#endif\n    return 0;\n}\n","LogLevel.cpp",[3425,6363,6364,6370,6374,6384,6388,6396,6400,6412,6427,6431,6442,6457,6461,6472,6487,6491,6499],{"__ignoreMap":3527},[3571,6365,6366,6368],{"class":3573,"line":3574},[3571,6367,3471],{"class":3577},[3571,6369,3581],{"class":3580},[3571,6371,6372],{"class":3573,"line":3584},[3571,6373,3588],{"emptyLinePlaceholder":3587},[3571,6375,6376,6378,6381],{"class":3573,"line":3591},[3571,6377,4933],{"class":3577},[3571,6379,6380],{"class":3594}," LOG_LEVEL ",[3571,6382,6383],{"class":3670},"2\n",[3571,6385,6386],{"class":3573,"line":3627},[3571,6387,3588],{"emptyLinePlaceholder":3587},[3571,6389,6390,6392,6394],{"class":3573,"line":3632},[3571,6391,3595],{"class":3594},[3571,6393,3637],{"class":3598},[3571,6395,3640],{"class":3602},[3571,6397,6398],{"class":3573,"line":3643},[3571,6399,3646],{"class":3602},[3571,6401,6402,6404,6406,6409],{"class":3573,"line":3649},[3571,6403,6357],{"class":3577},[3571,6405,6380],{"class":3594},[3571,6407,6408],{"class":3602},">=",[3571,6410,6411],{"class":3670}," 3\n",[3571,6413,6414,6416,6418,6421,6423,6425],{"class":3573,"line":3694},[3571,6415,3653],{"class":3652},[3571,6417,3656],{"class":3602},[3571,6419,6420],{"class":3580},"\"[INFO]  Програма запущена",[3571,6422,3686],{"class":3685},[3571,6424,3682],{"class":3580},[3571,6426,3691],{"class":3602},[3571,6428,6429],{"class":3573,"line":3705},[3571,6430,5033],{"class":3577},[3571,6432,6433,6435,6437,6439],{"class":3573,"line":5179},[3571,6434,6357],{"class":3577},[3571,6436,6380],{"class":3594},[3571,6438,6408],{"class":3602},[3571,6440,6441],{"class":3670}," 2\n",[3571,6443,6444,6446,6448,6451,6453,6455],{"class":3573,"line":5187},[3571,6445,3653],{"class":3652},[3571,6447,3656],{"class":3602},[3571,6449,6450],{"class":3580},"\"[WARN]  Рівень заряду батареї низький",[3571,6452,3686],{"class":3685},[3571,6454,3682],{"class":3580},[3571,6456,3691],{"class":3602},[3571,6458,6459],{"class":3573,"line":5915},[3571,6460,5033],{"class":3577},[3571,6462,6463,6465,6467,6469],{"class":3573,"line":5924},[3571,6464,6357],{"class":3577},[3571,6466,6380],{"class":3594},[3571,6468,6408],{"class":3602},[3571,6470,6471],{"class":3670}," 1\n",[3571,6473,6474,6476,6478,6481,6483,6485],{"class":3573,"line":6228},[3571,6475,3653],{"class":3652},[3571,6477,3656],{"class":3602},[3571,6479,6480],{"class":3580},"\"[ERROR] Підключення втрачено",[3571,6482,3686],{"class":3685},[3571,6484,3682],{"class":3580},[3571,6486,3691],{"class":3602},[3571,6488,6489],{"class":3573,"line":6233},[3571,6490,5033],{"class":3577},[3571,6492,6493,6495,6497],{"class":3573,"line":6266},[3571,6494,3697],{"class":3577},[3571,6496,3700],{"class":3670},[3571,6498,3691],{"class":3602},[3571,6500,6501],{"class":3573,"line":6275},[3571,6502,3708],{"class":3602},[3752,6504,6506,6516,6523,6531],{"title":6505},".\u002FLogLevel (LOG_LEVEL=2)",[3756,6507,6509,3764,6512],{"className":6508},[3573],[3571,6510,3763],{"className":6511},[3762],[3436,6513,6515],{"className":6514},[3768],".\u002FLogLevel",[3756,6517,6519],{"className":6518},[3573],[3571,6520,6522],{"className":6521},[6297],"[WARN]  Рівень заряду батареї низький",[3756,6524,6526],{"className":6525},[3573],[3571,6527,6530],{"className":6528},[6529],"text-red-400","[ERROR] Підключення втрачено",[3756,6532,3782,6534,3465],{"className":6533},[3573],[3571,6535,3787],{"className":6536},[3786,3768],[3418,6538,6539],{},"Компілятори автоматично визначають символи платформи, що дозволяє писати крос-платформний код:",[3519,6541,6543],{"className":3564,"code":6542,"language":3566,"meta":3527,"style":3527},"#if defined(_WIN32)\n    using FileHandle = void*;   \u002F\u002F HANDLE у Windows API\n#else\n    using FileHandle = int;     \u002F\u002F файловий дескриптор POSIX\n#endif\n",[3425,6544,6545,6555,6575,6580,6595],{"__ignoreMap":3527},[3571,6546,6547,6549,6552],{"class":3573,"line":3574},[3571,6548,6357],{"class":3577},[3571,6550,6551],{"class":3577}," defined",[3571,6553,6554],{"class":3594},"(_WIN32)\n",[3571,6556,6557,6560,6563,6566,6569,6572],{"class":3573,"line":3584},[3571,6558,6559],{"class":3577},"    using",[3571,6561,6562],{"class":3652}," FileHandle",[3571,6564,6565],{"class":3602}," = ",[3571,6567,6568],{"class":3594},"void*",[3571,6570,6571],{"class":3602},";",[3571,6573,6574],{"class":3623},"   \u002F\u002F HANDLE у Windows API\n",[3571,6576,6577],{"class":3573,"line":3591},[3571,6578,6579],{"class":3577},"#else\n",[3571,6581,6582,6584,6586,6588,6590,6592],{"class":3573,"line":3627},[3571,6583,6559],{"class":3577},[3571,6585,6562],{"class":3652},[3571,6587,6565],{"class":3602},[3571,6589,3595],{"class":3594},[3571,6591,6571],{"class":3602},[3571,6593,6594],{"class":3623},"     \u002F\u002F файловий дескриптор POSIX\n",[3571,6596,6597],{"class":3573,"line":3632},[3571,6598,5033],{"class":3577},[4194,6600,6601,6611],{},[4197,6602,6603],{},[4200,6604,6605,6608],{},[4203,6606,6607],{},"Символ",[4203,6609,6610],{},"Платформа",[4217,6612,6613,6623,6632,6642],{},[4200,6614,6615,6620],{},[4222,6616,6617],{},[3425,6618,6619],{},"_WIN32",[4222,6621,6622],{},"Windows (32 і 64-bit)",[4200,6624,6625,6630],{},[4222,6626,6627],{},[3425,6628,6629],{},"__linux__",[4222,6631,4341],{},[4200,6633,6634,6639],{},[4222,6635,6636],{},[3425,6637,6638],{},"__APPLE__",[4222,6640,6641],{},"macOS \u002F iOS",[4200,6643,6644,6649],{},[4222,6645,6646],{},[3425,6647,6648],{},"__unix__",[4222,6650,6651],{},"Unix-подібні",[3850,6653,6655],{"id":6654},"область-видимості-директив","Область видимості директив",[3418,6657,6658,6659,6661],{},"Три правила, що відрізняють ",[3425,6660,4933],{}," від C++-змінних:",[6663,6664,6665,6676,6686],"ol",{},[3795,6666,6667,6670,6671,6673,6674,3465],{},[3436,6668,6669],{},"Від точки визначення до кінця файлу"," — символ активний одразу після рядка ",[3425,6672,4933],{}," і до кінця поточного ",[3425,6675,3460],{},[3795,6677,6678,4911,6683,6685],{},[3436,6679,6680,6681],{},"Препроцесор не бачить блоків ",[3425,6682,5577],{},[3425,6684,4933],{}," всередині функції діє на весь файл, ніби він написаний зовні.",[3795,6687,6688,4911,6691,4101,6694,6696,6697,6700],{},[3436,6689,6690],{},"Символи не перетинають межі файлів",[3425,6692,6693],{},"#define DEBUG",[3425,6695,3504],{}," не впливає на ",[3425,6698,6699],{},"utils.cpp",". Кожен файл компілюється окремо.",[3418,6702,6703,6706],{},[3425,6704,6705],{},"#undef"," явно скасовує визначення:",[3519,6708,6710],{"className":3564,"code":6709,"language":3566,"meta":3527,"style":3527},"#define TEMP_DEBUG\n\u002F\u002F ... код з відлагоджувальним виводом ...\n#undef TEMP_DEBUG\n\u002F\u002F Тут TEMP_DEBUG більше не визначено\n",[3425,6711,6712,6719,6724,6730],{"__ignoreMap":3527},[3571,6713,6714,6716],{"class":3573,"line":3574},[3571,6715,4933],{"class":3577},[3571,6717,6718],{"class":3594}," TEMP_DEBUG\n",[3571,6720,6721],{"class":3573,"line":3584},[3571,6722,6723],{"class":3623},"\u002F\u002F ... код з відлагоджувальним виводом ...\n",[3571,6725,6726,6728],{"class":3573,"line":3591},[3571,6727,6705],{"class":3577},[3571,6729,6718],{"class":3594},[3571,6731,6732],{"class":3573,"line":3627},[3571,6733,6734],{"class":3623},"\u002F\u002F Тут TEMP_DEBUG більше не визначено\n",[3850,6736,6738],{"id":6737},"визначення-символів-через-командний-рядок","Визначення символів через командний рядок",[3418,6740,6741,6742,6744,6745,6748],{},"Замість ",[3425,6743,4933],{}," у коді символи можна передавати через прапор ",[3425,6746,6747],{},"-D"," під час компіляції. Код залишається незмінним для будь-якого режиму збірки:",[3519,6750,6752],{"className":3894,"code":6751,"language":3896,"meta":3527,"style":3527},"g++ main.cpp -o program -DDEBUG           # визначає символ DEBUG\ng++ main.cpp -o program -DLOG_LEVEL=3     # LOG_LEVEL зі значенням 3\ng++ main.cpp -o program -DNDEBUG          # стандартний release-режим\n",[3425,6753,6754,6771,6787],{"__ignoreMap":3527},[3571,6755,6756,6758,6760,6762,6765,6768],{"class":3573,"line":3574},[3571,6757,3847],{"class":3598},[3571,6759,4480],{"class":3580},[3571,6761,4486],{"class":3594},[3571,6763,6764],{"class":3580}," program",[3571,6766,6767],{"class":3594}," -DDEBUG",[3571,6769,6770],{"class":3623},"           # визначає символ DEBUG\n",[3571,6772,6773,6775,6777,6779,6781,6784],{"class":3573,"line":3584},[3571,6774,3847],{"class":3598},[3571,6776,4480],{"class":3580},[3571,6778,4486],{"class":3594},[3571,6780,6764],{"class":3580},[3571,6782,6783],{"class":3594}," -DLOG_LEVEL=3",[3571,6785,6786],{"class":3623},"     # LOG_LEVEL зі значенням 3\n",[3571,6788,6789,6791,6793,6795,6797,6800],{"class":3573,"line":3591},[3571,6790,3847],{"class":3598},[3571,6792,4480],{"class":3580},[3571,6794,4486],{"class":3594},[3571,6796,6764],{"class":3580},[3571,6798,6799],{"class":3594}," -DNDEBUG",[3571,6801,6802],{"class":3623},"          # стандартний release-режим\n",[3449,6804],{},[3413,6806,6808,6809],{"id":6807},"header-guards-і-pragma-once","Header guards і ",[3425,6810,6811],{},"#pragma once",[3850,6813,6815],{"id":6814},"проблема-подвійного-підключення","Проблема подвійного підключення",[3418,6817,6818],{},"Заголовкові файли породжують тонку, але системну проблему. Розглянемо три файли, кожен із яких написаний бездоганно:",[3519,6820,6822],{"className":3564,"code":6821,"filename":4884,"language":3566,"meta":3527,"style":3527},"int getSquareSides() { return 4; }\n",[3425,6823,6824],{"__ignoreMap":3527},[3571,6825,6826,6828,6831,6834,6836,6839],{"class":3573,"line":3574},[3571,6827,3595],{"class":3594},[3571,6829,6830],{"class":3598}," getSquareSides",[3571,6832,6833],{"class":3602},"() { ",[3571,6835,5073],{"class":3577},[3571,6837,6838],{"class":3670}," 4",[3571,6840,6841],{"class":3602},"; }\n",[3519,6843,6846],{"className":3564,"code":6844,"filename":6845,"language":3566,"meta":3527,"style":3527},"#include \"math.h\"\n","geometry.h",[3425,6847,6848],{"__ignoreMap":3527},[3571,6849,6850,6852],{"class":3573,"line":3574},[3571,6851,3471],{"class":3577},[3571,6853,5045],{"class":3580},[3519,6855,6857],{"className":3564,"code":6856,"filename":3504,"language":3566,"meta":3527,"style":3527},"#include \"math.h\"\n#include \"geometry.h\"\n\nint main() { return 0; }\n",[3425,6858,6859,6865,6872,6876],{"__ignoreMap":3527},[3571,6860,6861,6863],{"class":3573,"line":3574},[3571,6862,3471],{"class":3577},[3571,6864,5045],{"class":3580},[3571,6866,6867,6869],{"class":3573,"line":3584},[3571,6868,3471],{"class":3577},[3571,6870,6871],{"class":3580}," \"geometry.h\"\n",[3571,6873,6874],{"class":3573,"line":3591},[3571,6875,3588],{"emptyLinePlaceholder":3587},[3571,6877,6878,6880,6882,6884,6886,6888],{"class":3573,"line":3627},[3571,6879,3595],{"class":3594},[3571,6881,3637],{"class":3598},[3571,6883,6833],{"class":3602},[3571,6885,5073],{"class":3577},[3571,6887,3700],{"class":3670},[3571,6889,6841],{"class":3602},[3752,6891,6893,6903],{"title":6892},"Помилка компіляції",[3756,6894,6896,3764,6899],{"className":6895},[3573],[3571,6897,3763],{"className":6898},[3762],[3436,6900,6902],{"className":6901},[3768],"g++ main.cpp -o program",[3756,6904,6906],{"className":6905},[3573],[3571,6907,6909],{"className":6908},[6529],"math.h:1:5: error: redefinition of 'int getSquareSides()'",[3418,6911,6912,6913,6915,6916,4101,6918,6920,6921,5436,6923,6925],{},"Препроцесор вставляє вміст ",[3425,6914,4884],{}," двічі: перший раз — через прямий ",[3425,6917,4876],{},[3425,6919,3504],{},", другий — через ",[3425,6922,6845],{},[3425,6924,4884],{},". Компілятор бачить два визначення однієї функції — порушення ODR.",[3418,6927,6928],{},"Покрокове розгортання показує результат:",[3519,6930,6932],{"className":3564,"code":6931,"language":3566,"meta":3527,"style":3527},"\u002F\u002F 1-а вставка math.h:\nint getSquareSides() { return 4; }\n\n\u002F\u002F 2-а вставка через geometry.h → math.h:\nint getSquareSides() { return 4; }  \u002F\u002F ODR порушено!\n\nint main() { return 0; }\n",[3425,6933,6934,6939,6953,6957,6962,6980,6984],{"__ignoreMap":3527},[3571,6935,6936],{"class":3573,"line":3574},[3571,6937,6938],{"class":3623},"\u002F\u002F 1-а вставка math.h:\n",[3571,6940,6941,6943,6945,6947,6949,6951],{"class":3573,"line":3584},[3571,6942,3595],{"class":3594},[3571,6944,6830],{"class":3598},[3571,6946,6833],{"class":3602},[3571,6948,5073],{"class":3577},[3571,6950,6838],{"class":3670},[3571,6952,6841],{"class":3602},[3571,6954,6955],{"class":3573,"line":3591},[3571,6956,3588],{"emptyLinePlaceholder":3587},[3571,6958,6959],{"class":3573,"line":3627},[3571,6960,6961],{"class":3623},"\u002F\u002F 2-а вставка через geometry.h → math.h:\n",[3571,6963,6964,6966,6968,6970,6972,6974,6977],{"class":3573,"line":3632},[3571,6965,3595],{"class":3594},[3571,6967,6830],{"class":3598},[3571,6969,6833],{"class":3602},[3571,6971,5073],{"class":3577},[3571,6973,6838],{"class":3670},[3571,6975,6976],{"class":3602},"; }",[3571,6978,6979],{"class":3623},"  \u002F\u002F ODR порушено!\n",[3571,6981,6982],{"class":3573,"line":3643},[3571,6983,3588],{"emptyLinePlaceholder":3587},[3571,6985,6986,6988,6990,6992,6994,6996],{"class":3573,"line":3649},[3571,6987,3595],{"class":3594},[3571,6989,3637],{"class":3598},[3571,6991,6833],{"class":3602},[3571,6993,5073],{"class":3577},[3571,6995,3700],{"class":3670},[3571,6997,6841],{"class":3602},[3418,6999,7000],{},"Проблема масштабується: у великому проєкті з десятками заголовків, що підключають один одного, відстежити ланцюжки вручну неможливо. Потрібен автоматичний захист.",[3850,7002,7004],{"id":7003},"header-guards","Header guards",[3418,7006,7007,7010,7011,7014],{},[3436,7008,7009],{},"Header guard"," — шаблон умовної компіляції, що гарантує: вміст заголовка обробляється ",[3436,7012,7013],{},"рівно один раз",", незалежно від кількості підключень.",[3519,7016,7018],{"className":3564,"code":7017,"filename":4884,"language":3566,"meta":3567,"style":3527},"#ifndef MATH_H   \u002F\u002F якщо MATH_H ще не визначено — входимо\n#define MATH_H   \u002F\u002F визначаємо символ\n\nint getSquareSides();\n\n#endif           \u002F\u002F кінець захисного блоку\n",[3425,7019,7020,7030,7039,7043,7052,7056],{"__ignoreMap":3527},[3571,7021,7022,7024,7027],{"class":3573,"line":3574},[3571,7023,4925],{"class":3577},[3571,7025,7026],{"class":3594}," MATH_H",[3571,7028,7029],{"class":3623},"   \u002F\u002F якщо MATH_H ще не визначено — входимо\n",[3571,7031,7032,7034,7036],{"class":3573,"line":3584},[3571,7033,4933],{"class":3577},[3571,7035,7026],{"class":3594},[3571,7037,7038],{"class":3623},"   \u002F\u002F визначаємо символ\n",[3571,7040,7041],{"class":3573,"line":3591},[3571,7042,3588],{"emptyLinePlaceholder":3587},[3571,7044,7045,7047,7049],{"class":3573,"line":3627},[3571,7046,3595],{"class":3594},[3571,7048,6830],{"class":3598},[3571,7050,7051],{"class":3602},"();\n",[3571,7053,7054],{"class":3573,"line":3632},[3571,7055,3588],{"emptyLinePlaceholder":3587},[3571,7057,7058,7060],{"class":3573,"line":3643},[3571,7059,6347],{"class":3577},[3571,7061,7062],{"class":3623},"           \u002F\u002F кінець захисного блоку\n",[3418,7064,7065],{},"Механіка:",[3792,7067,7068,7083],{},[3795,7069,7070,5463,7073,7076,7077,7079,7080,7082],{},[3436,7071,7072],{},"Перше підключення",[3425,7074,7075],{},"MATH_H"," не визначений → умова ",[3425,7078,4925],{}," істинна → визначаємо ",[3425,7081,7075],{}," → вміст вставляється.",[3795,7084,7085,5463,7088,7090,7091,7093],{},[3436,7086,7087],{},"Будь-яке наступне підключення",[3425,7089,7075],{}," вже визначений → умова ",[3425,7092,4925],{}," хибна → весь блок пропускається.",[3418,7095,7096,7097,7100,7101,5436,7103,3612,7105,5436,7108,3612,7111,5436,7114,3465],{},"Конвенція іменування: ",[3425,7098,7099],{},"ІМ'Я_ФАЙЛУ_H"," великими літерами, крапка → підкреслення. ",[3425,7102,4884],{},[3425,7104,7075],{},[3425,7106,7107],{},"Vec2.h",[3425,7109,7110],{},"VEC2_H",[3425,7112,7113],{},"student_record.h",[3425,7115,7116],{},"STUDENT_RECORD_H",[3418,7118,7119,7120,7123,7124,7127,7128,3465],{},"У великих проєктах із двома файлами ",[3425,7121,7122],{},"utils.h"," у різних директоріях простий ",[3425,7125,7126],{},"UTILS_H"," конфліктуватиме. Вирішення — включати в ім'я шлях або префікс: ",[3425,7129,7130],{},"MYPROJECT_NETWORK_UTILS_H",[3850,7132,7134],{"id":7133},"pragma-once",[3425,7135,6811],{},[3418,7137,7138],{},"Більшість сучасних компіляторів підтримують простішу директиву:",[3519,7140,7142],{"className":3564,"code":7141,"filename":4884,"language":3566,"meta":3567,"style":3527},"#pragma once\n\nint getSquareSides();\n",[3425,7143,7144,7153,7157],{"__ignoreMap":3527},[3571,7145,7146,7149],{"class":3573,"line":3574},[3571,7147,7148],{"class":3577},"#pragma",[3571,7150,7152],{"class":7151},"sa4r_"," once\n",[3571,7154,7155],{"class":3573,"line":3584},[3571,7156,3588],{"emptyLinePlaceholder":3587},[3571,7158,7159,7161,7163],{"class":3573,"line":3591},[3571,7160,3595],{"class":3594},[3571,7162,6830],{"class":3598},[3571,7164,7051],{"class":3602},[3418,7166,7167,7168,7170],{},"Один рядок замість трьох. Жодних символів, жодного ризику опечатки. Компілятор запам'ятовує абсолютний шлях до файлу і при повторному ",[3425,7169,3471],{}," просто пропускає його, не відкриваючи.",[3850,7172,7174],{"id":7173},"порівняння","Порівняння",[4194,7176,7177,7189],{},[4197,7178,7179],{},[4200,7180,7181,7183,7185],{},[4203,7182,6014],{},[4203,7184,7004],{"align":4208},[4203,7186,7187],{"align":4208},[3425,7188,6811],{},[4217,7190,7191,7201,7210,7220,7231],{},[4200,7192,7193,7196,7198],{},[4222,7194,7195],{},"Офіційний стандарт C++",[4222,7197,4243],{"align":4208},[4222,7199,7200],{"align":4208},"⚠️ розширення",[4200,7202,7203,7206,7208],{},[4222,7204,7205],{},"GCC \u002F Clang \u002F MSVC",[4222,7207,4243],{"align":4208},[4222,7209,4243],{"align":4208},[4200,7211,7212,7215,7218],{},[4222,7213,7214],{},"Ризик опечатки",[4222,7216,7217],{"align":4208},"⚠️ є",[4222,7219,4240],{"align":4208},[4200,7221,7222,7225,7228],{},[4222,7223,7224],{},"Обсяг коду",[4222,7226,7227],{"align":4208},"3 рядки",[4222,7229,7230],{"align":4208},"1 рядок",[4200,7232,7233,7236,7238],{},[4222,7234,7235],{},"Робота із symlink",[4222,7237,4243],{"align":4208},[4222,7239,7240],{"align":4208},"⚠️ залежить",[3540,7242,7243,7244,7246],{},"У сучасних проєктах із GCC, Clang або MSVC — ",[3425,7245,6811],{}," є зручним і безпечним вибором. Обидва підходи рівноцінні для цілей цього курсу.",[3418,7248,7249,7252,7253,7255,7256,3612,7258,7260],{},[3436,7250,7251],{},"Правило без винятків",": кожен заголовковий файл проєкту зобов'язаний мати захист від подвійного підключення — header guard або ",[3425,7254,6811],{},". Це не опція, а норма індустрії. Навіть заголовки стандартної бібліотеки (",[3425,7257,5366],{},[3425,7259,5385],{},") мають такий захист.",[3449,7262],{},[3413,7264,7266],{"id":7265},"простори-імен","Простори імен",[3850,7268,7270],{"id":7269},"конфлікт-імен","Конфлікт імен",[3418,7272,7273,7274,7277,7278,7280],{},"Зі зростанням проєкту зростає ймовірність того, що дві різні частини кодової бази дадуть однакові імена різним сутностям. Уявіть: перший розробник пише функцію ",[3425,7275,7276],{},"log()"," — логарифм числа, другий — ",[3425,7279,7276],{}," для запису в журнал. Коли файли об'єднуються:",[3519,7282,7284],{"className":3564,"code":7283,"language":3566,"meta":3527,"style":3527},"double log(double x);               \u002F\u002F у math_utils.cpp\nvoid   log(const std::string& msg); \u002F\u002F у logger.cpp\n",[3425,7285,7286,7305],{"__ignoreMap":3527},[3571,7287,7288,7290,7293,7295,7297,7300,7302],{"class":3573,"line":3574},[3571,7289,5007],{"class":3594},[3571,7291,7292],{"class":3598}," log",[3571,7294,3603],{"class":3602},[3571,7296,5007],{"class":3594},[3571,7298,7299],{"class":3608}," x",[3571,7301,3620],{"class":3602},[3571,7303,7304],{"class":3623},"               \u002F\u002F у math_utils.cpp\n",[3571,7306,7307,7309,7312,7314,7316,7319,7322,7325,7328,7331,7333],{"class":3573,"line":3584},[3571,7308,5607],{"class":3594},[3571,7310,7311],{"class":3598},"   log",[3571,7313,3603],{"class":3602},[3571,7315,5615],{"class":3594},[3571,7317,7318],{"class":3652}," std",[3571,7320,7321],{"class":3602},"::",[3571,7323,7324],{"class":3652},"string",[3571,7326,7327],{"class":3594},"&",[3571,7329,7330],{"class":3608}," msg",[3571,7332,3620],{"class":3602},[3571,7334,7335],{"class":3623}," \u002F\u002F у logger.cpp\n",[3418,7337,7338,7339,7342],{},"Обидві функції у глобальному просторі імен із різними сигнатурами — це не перевантаження між двома одиницями трансляції, а ",[3436,7340,7341],{},"конфлікт імен",". Лінкер знаходить два символи і не знає, який використати.",[3418,7344,7345,7346,3465],{},"Конфлікт імен — природний наслідок росту. Чим більший проєкт і чим більше підключено сторонніх бібліотек, тим вища ймовірність збігу. Мова C++ вирішує цю проблему через ",[3436,7347,7348],{},"простори імен",[3850,7350,7352,7353],{"id":7351},"синтаксис-і-оператор","Синтаксис і оператор ",[3425,7354,7321],{},[3418,7356,7357,7360],{},[3436,7358,7359],{},"Простір імен"," (namespace) — іменована область видимості, що об'єднує пов'язані ідентифікатори та ізолює їх від решти. Два ідентифікатори з однаковим іменем у різних просторах — абсолютно різні сутності.",[3519,7362,7365],{"className":3564,"code":7363,"filename":7364,"language":3566,"meta":3567,"style":3527},"#pragma once\n\nnamespace Math\n{\n    double log(double x);\n    double sqrt(double x);\n}\n","math_utils.h",[3425,7366,7367,7373,7377,7385,7389,7404,7419],{"__ignoreMap":3527},[3571,7368,7369,7371],{"class":3573,"line":3574},[3571,7370,7148],{"class":3577},[3571,7372,7152],{"class":7151},[3571,7374,7375],{"class":3573,"line":3584},[3571,7376,3588],{"emptyLinePlaceholder":3587},[3571,7378,7379,7382],{"class":3573,"line":3591},[3571,7380,7381],{"class":3594},"namespace",[3571,7383,7384],{"class":3652}," Math\n",[3571,7386,7387],{"class":3573,"line":3627},[3571,7388,3646],{"class":3602},[3571,7390,7391,7394,7396,7398,7400,7402],{"class":3573,"line":3632},[3571,7392,7393],{"class":3594},"    double",[3571,7395,7292],{"class":3598},[3571,7397,3603],{"class":3602},[3571,7399,5007],{"class":3594},[3571,7401,7299],{"class":3608},[3571,7403,4960],{"class":3602},[3571,7405,7406,7408,7411,7413,7415,7417],{"class":3573,"line":3643},[3571,7407,7393],{"class":3594},[3571,7409,7410],{"class":3598}," sqrt",[3571,7412,3603],{"class":3602},[3571,7414,5007],{"class":3594},[3571,7416,7299],{"class":3608},[3571,7418,4960],{"class":3602},[3571,7420,7421],{"class":3573,"line":3649},[3571,7422,3708],{"class":3602},[3519,7424,7427],{"className":3564,"code":7425,"filename":7426,"language":3566,"meta":3567,"style":3527},"#pragma once\n#include \u003Cstring>\n\nnamespace Logger\n{\n    void log(const std::string& msg);\n    void warn(const std::string& msg);\n}\n","logger.h",[3425,7428,7429,7435,7442,7446,7453,7457,7480,7503],{"__ignoreMap":3527},[3571,7430,7431,7433],{"class":3573,"line":3574},[3571,7432,7148],{"class":3577},[3571,7434,7152],{"class":7151},[3571,7436,7437,7439],{"class":3573,"line":3584},[3571,7438,3471],{"class":3577},[3571,7440,7441],{"class":3580}," \u003Cstring>\n",[3571,7443,7444],{"class":3573,"line":3591},[3571,7445,3588],{"emptyLinePlaceholder":3587},[3571,7447,7448,7450],{"class":3573,"line":3627},[3571,7449,7381],{"class":3594},[3571,7451,7452],{"class":3652}," Logger\n",[3571,7454,7455],{"class":3573,"line":3632},[3571,7456,3646],{"class":3602},[3571,7458,7459,7462,7464,7466,7468,7470,7472,7474,7476,7478],{"class":3573,"line":3643},[3571,7460,7461],{"class":3594},"    void",[3571,7463,7292],{"class":3598},[3571,7465,3603],{"class":3602},[3571,7467,5615],{"class":3594},[3571,7469,7318],{"class":3652},[3571,7471,7321],{"class":3602},[3571,7473,7324],{"class":3652},[3571,7475,7327],{"class":3594},[3571,7477,7330],{"class":3608},[3571,7479,4960],{"class":3602},[3571,7481,7482,7484,7487,7489,7491,7493,7495,7497,7499,7501],{"class":3573,"line":3649},[3571,7483,7461],{"class":3594},[3571,7485,7486],{"class":3598}," warn",[3571,7488,3603],{"class":3602},[3571,7490,5615],{"class":3594},[3571,7492,7318],{"class":3652},[3571,7494,7321],{"class":3602},[3571,7496,7324],{"class":3652},[3571,7498,7327],{"class":3594},[3571,7500,7330],{"class":3608},[3571,7502,4960],{"class":3602},[3571,7504,7505],{"class":3573,"line":3694},[3571,7506,3708],{"class":3602},[3519,7508,7510],{"className":3564,"code":7509,"filename":3504,"language":3566,"meta":3567,"style":3527},"#include \u003Ciostream>\n#include \"math_utils.h\"\n#include \"logger.h\"\n\nint main()\n{\n    Logger::log(\"Програма запущена\");\n    double result = Math::log(2.718);\n    std::cout \u003C\u003C \"log(e) ≈ \" \u003C\u003C result \u003C\u003C \"\\n\";\n    return 0;\n}\n",[3425,7511,7512,7518,7525,7532,7536,7544,7548,7565,7586,7606,7614],{"__ignoreMap":3527},[3571,7513,7514,7516],{"class":3573,"line":3574},[3571,7515,3471],{"class":3577},[3571,7517,3581],{"class":3580},[3571,7519,7520,7522],{"class":3573,"line":3584},[3571,7521,3471],{"class":3577},[3571,7523,7524],{"class":3580}," \"math_utils.h\"\n",[3571,7526,7527,7529],{"class":3573,"line":3591},[3571,7528,3471],{"class":3577},[3571,7530,7531],{"class":3580}," \"logger.h\"\n",[3571,7533,7534],{"class":3573,"line":3627},[3571,7535,3588],{"emptyLinePlaceholder":3587},[3571,7537,7538,7540,7542],{"class":3573,"line":3632},[3571,7539,3595],{"class":3594},[3571,7541,3637],{"class":3598},[3571,7543,3640],{"class":3602},[3571,7545,7546],{"class":3573,"line":3643},[3571,7547,3646],{"class":3602},[3571,7549,7550,7553,7555,7558,7560,7563],{"class":3573,"line":3649},[3571,7551,7552],{"class":3652},"    Logger",[3571,7554,7321],{"class":3602},[3571,7556,7557],{"class":3598},"log",[3571,7559,3603],{"class":3602},[3571,7561,7562],{"class":3580},"\"Програма запущена\"",[3571,7564,4960],{"class":3602},[3571,7566,7567,7569,7572,7575,7577,7579,7581,7584],{"class":3573,"line":3694},[3571,7568,7393],{"class":3594},[3571,7570,7571],{"class":3602}," result = ",[3571,7573,7574],{"class":3652},"Math",[3571,7576,7321],{"class":3602},[3571,7578,7557],{"class":3598},[3571,7580,3603],{"class":3602},[3571,7582,7583],{"class":3670},"2.718",[3571,7585,4960],{"class":3602},[3571,7587,7588,7590,7592,7595,7598,7600,7602,7604],{"class":3573,"line":3705},[3571,7589,3653],{"class":3652},[3571,7591,3656],{"class":3602},[3571,7593,7594],{"class":3580},"\"log(e) ≈ \"",[3571,7596,7597],{"class":3602}," \u003C\u003C result \u003C\u003C ",[3571,7599,3682],{"class":3580},[3571,7601,3686],{"class":3685},[3571,7603,3682],{"class":3580},[3571,7605,3691],{"class":3602},[3571,7607,7608,7610,7612],{"class":3573,"line":5179},[3571,7609,3697],{"class":3577},[3571,7611,3700],{"class":3670},[3571,7613,3691],{"class":3602},[3571,7615,7616],{"class":3573,"line":5187},[3571,7617,3708],{"class":3602},[3752,7619,7620,7629,7633,7641],{"title":3754},[3756,7621,7623,3764,7626],{"className":7622},[3573],[3571,7624,3763],{"className":7625},[3762],[3436,7627,3754],{"className":7628},[3768],[3756,7630,7632],{"className":7631},[3573],"[INFO]  Програма запущена",[3756,7634,7636,7637],{"className":7635},[3573],"log(e) ≈ ",[3571,7638,7640],{"className":7639},[3777],"1.0",[3756,7642,3782,7644,3465],{"className":7643},[3573],[3571,7645,3787],{"className":7646},[3786,3768],[3418,7648,7649,7650,7652,7653,7656,7657,7659,7660,7662,7663,7666,7667,7670],{},"Оператор ",[3425,7651,7321],{}," (scope resolution) вказує компілятору, де саме шукати ідентифікатор. ",[3425,7654,7655],{},"Math::log"," — «",[3425,7658,7557],{}," у просторі ",[3425,7661,7574],{},"». ",[3425,7664,7665],{},"::log"," без імені зліва — явне звернення до ",[3436,7668,7669],{},"глобального"," простору.",[3418,7672,7673,7674,7677,7678,7680,7681,7684],{},"Після закриваючої ",[3425,7675,7676],{},"}"," блоку ",[3425,7679,7381],{}," крапка з комою ",[3436,7682,7683],{},"не потрібна"," — на відміну від структур і класів.",[3850,7686,7688],{"id":7687},"розміщення-у-файлах","Розміщення у файлах",[3418,7690,7691,7692,7694],{},"Простір імен може бути розкиданий по кількох файлах — частини об'єднуються автоматично. Визначення функцій у ",[3425,7693,3460],{}," записуються двома рівноцінними способами:",[3519,7696,7699],{"className":3564,"code":7697,"filename":7698,"language":3566,"meta":3567,"style":3527},"#include \"math_utils.h\"\n#include \u003Ccmath>\n\n\u002F\u002F Варіант A: всередині блоку namespace\nnamespace Math\n{\n    double log(double x) { return std::log(x); }\n}\n\n\u002F\u002F Варіант B: поза блоком, через ::\ndouble Math::sqrt(double x)\n{\n    return std::sqrt(x);\n}\n","math_utils.cpp",[3425,7700,7701,7707,7714,7718,7723,7729,7733,7758,7762,7766,7771,7791,7795,7808],{"__ignoreMap":3527},[3571,7702,7703,7705],{"class":3573,"line":3574},[3571,7704,3471],{"class":3577},[3571,7706,7524],{"class":3580},[3571,7708,7709,7711],{"class":3573,"line":3584},[3571,7710,3471],{"class":3577},[3571,7712,7713],{"class":3580}," \u003Ccmath>\n",[3571,7715,7716],{"class":3573,"line":3591},[3571,7717,3588],{"emptyLinePlaceholder":3587},[3571,7719,7720],{"class":3573,"line":3627},[3571,7721,7722],{"class":3623},"\u002F\u002F Варіант A: всередині блоку namespace\n",[3571,7724,7725,7727],{"class":3573,"line":3632},[3571,7726,7381],{"class":3594},[3571,7728,7384],{"class":3652},[3571,7730,7731],{"class":3573,"line":3643},[3571,7732,3646],{"class":3602},[3571,7734,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755],{"class":3573,"line":3649},[3571,7736,7393],{"class":3594},[3571,7738,7292],{"class":3598},[3571,7740,3603],{"class":3602},[3571,7742,5007],{"class":3594},[3571,7744,7299],{"class":3608},[3571,7746,5097],{"class":3602},[3571,7748,5073],{"class":3577},[3571,7750,7318],{"class":3652},[3571,7752,7321],{"class":3602},[3571,7754,7557],{"class":3598},[3571,7756,7757],{"class":3602},"(x); }\n",[3571,7759,7760],{"class":3573,"line":3694},[3571,7761,3708],{"class":3602},[3571,7763,7764],{"class":3573,"line":3705},[3571,7765,3588],{"emptyLinePlaceholder":3587},[3571,7767,7768],{"class":3573,"line":5179},[3571,7769,7770],{"class":3623},"\u002F\u002F Варіант B: поза блоком, через ::\n",[3571,7772,7773,7775,7778,7780,7783,7785,7787,7789],{"class":3573,"line":5187},[3571,7774,5007],{"class":3594},[3571,7776,7777],{"class":3652}," Math",[3571,7779,7321],{"class":3602},[3571,7781,7782],{"class":3598},"sqrt",[3571,7784,3603],{"class":3602},[3571,7786,5007],{"class":3594},[3571,7788,7299],{"class":3608},[3571,7790,3735],{"class":3602},[3571,7792,7793],{"class":3573,"line":5915},[3571,7794,3646],{"class":3602},[3571,7796,7797,7799,7801,7803,7805],{"class":3573,"line":5924},[3571,7798,3697],{"class":3577},[3571,7800,7318],{"class":3652},[3571,7802,7321],{"class":3602},[3571,7804,7782],{"class":3598},[3571,7806,7807],{"class":3602},"(x);\n",[3571,7809,7810],{"class":3573,"line":6228},[3571,7811,3708],{"class":3602},[3418,7813,7814,7815,7817],{},"У промисловому коді частіше зустрічається Варіант B для ",[3425,7816,3460],{},"-файлів — він чіткіше відокремлює оголошення від визначення.",[3850,7819,7821,7824],{"id":7820},"using-namespace-зручність-із-наслідками",[3425,7822,7823],{},"using namespace"," — зручність із наслідками",[3418,7826,7827,7829],{},[3425,7828,5524],{}," поширений у підручниках, але несе реальні ризики.",[3418,7831,7832,3764,7835,7838,7839,7842,7843,7846,7847,7850,7851,3465],{},[3436,7833,7834],{},"Ризик 1: прихований конфлікт.",[3425,7836,7837],{},"using namespace std"," вносить усі ідентифікатори STL у поточний простір. Ваша змінна ",[3425,7840,7841],{},"count"," конфліктуватиме зі ",[3425,7844,7845],{},"std::count",", ваш тип ",[3425,7848,7849],{},"distance"," — зі ",[3425,7852,7853],{},"std::distance",[3418,7855,7856,3764,7859,4101,7861,7863,7864,7866],{},[3436,7857,7858],{},"Ризик 2: отруєння заголовка.",[3425,7860,7823],{},[3425,7862,4869],{},"-файлі забруднює простір імен кожного ",[3425,7865,3460],{},", що підключить цей заголовок. Програміст, що використовує ваш заголовок, навіть не підозрює про приховані конфлікти.",[3418,7868,7869,7872,7873,7875],{},[3436,7870,7871],{},"Ризик 3: майбутні версії стандарту."," C++ постійно розширюється. Новий ідентифікатор у ",[3425,7874,5423],{}," може конфліктувати з вашим існуючим кодом.",[3827,7877,7878,5463,7881,4911,7883,7886],{},[3436,7879,7880],{},"Абсолютне правило",[3425,7882,7823],{},[3436,7884,7885],{},"ніколи"," у заголовкових файлах. Без жодних винятків.",[3418,7888,7889,7890,7892],{},"Безпечна альтернатива — ",[3425,7891,5506],{},"-оголошення для конкретного ідентифікатора, локально у функції:",[3519,7894,7896],{"className":3564,"code":7895,"language":3566,"meta":3527,"style":3527},"void printNames(const std::vector\u003Cstd::string>& names)\n{\n    using std::cout; \u002F\u002F лише cout, лише всередині цієї функції\n    for (const auto& name : names)\n        cout \u003C\u003C name \u003C\u003C \"\\n\";\n}\n",[3425,7897,7898,7934,7938,7950,7965,7978],{"__ignoreMap":3527},[3571,7899,7900,7902,7905,7907,7909,7911,7913,7916,7919,7921,7923,7925,7927,7929,7932],{"class":3573,"line":3574},[3571,7901,5607],{"class":3594},[3571,7903,7904],{"class":3598}," printNames",[3571,7906,3603],{"class":3602},[3571,7908,5615],{"class":3594},[3571,7910,7318],{"class":3652},[3571,7912,7321],{"class":3602},[3571,7914,7915],{"class":3652},"vector",[3571,7917,7918],{"class":3602},"\u003C",[3571,7920,5423],{"class":3652},[3571,7922,7321],{"class":3602},[3571,7924,7324],{"class":3652},[3571,7926,3956],{"class":3602},[3571,7928,7327],{"class":3594},[3571,7930,7931],{"class":3608}," names",[3571,7933,3735],{"class":3602},[3571,7935,7936],{"class":3573,"line":3584},[3571,7937,3646],{"class":3602},[3571,7939,7940,7942,7944,7947],{"class":3573,"line":3591},[3571,7941,6559],{"class":3577},[3571,7943,7318],{"class":3652},[3571,7945,7946],{"class":3602},"::cout;",[3571,7948,7949],{"class":3623}," \u002F\u002F лише cout, лише всередині цієї функції\n",[3571,7951,7952,7955,7957,7959,7962],{"class":3573,"line":3627},[3571,7953,7954],{"class":3577},"    for",[3571,7956,3480],{"class":3602},[3571,7958,5615],{"class":3594},[3571,7960,7961],{"class":3594}," auto",[3571,7963,7964],{"class":3602},"& name : names)\n",[3571,7966,7967,7970,7972,7974,7976],{"class":3573,"line":3632},[3571,7968,7969],{"class":3602},"        cout \u003C\u003C name \u003C\u003C ",[3571,7971,3682],{"class":3580},[3571,7973,3686],{"class":3685},[3571,7975,3682],{"class":3580},[3571,7977,3691],{"class":3602},[3571,7979,7980],{"class":3573,"line":3643},[3571,7981,3708],{"class":3602},[4194,7983,7984,7996],{},[4197,7985,7986],{},[4200,7987,7988,7991,7994],{},[4203,7989,7990],{},"Підхід",[4203,7992,7993],{"align":4208},"Ризик",[4203,7995,6060],{"align":4208},[4217,7997,7998,8012,8026,8040],{},[4200,7999,8000,8006,8009],{},[4222,8001,8002,8005],{},[3425,8003,8004],{},"std::cout"," (явний)",[4222,8007,8008],{"align":4208},"❌ жодного",[4222,8010,8011],{"align":4208},"✅ завжди",[4200,8013,8014,8020,8023],{},[4222,8015,8016,8019],{},[3425,8017,8018],{},"using std::cout;"," у функції",[4222,8021,8022],{"align":4208},"⚠️ мінімальний",[4222,8024,8025],{"align":4208},"✅ прийнятний",[4200,8027,8028,8034,8037],{},[4222,8029,8030,4101,8032],{},[3425,8031,5524],{},[3425,8033,3460],{},[4222,8035,8036],{"align":4208},"⚠️ значний",[4222,8038,8039],{"align":4208},"❌ небажано",[4200,8041,8042,8048,8051],{},[4222,8043,8044,4101,8046],{},[3425,8045,5524],{},[3425,8047,4869],{},[4222,8049,8050],{"align":4208},"🔴 критичний",[4222,8052,8053],{"align":4208},"❌ заборонено",[3850,8055,8057],{"id":8056},"анонімні-простори-імен","Анонімні простори імен",[3418,8059,8060,8061,8063,8064,4673],{},"Допоміжні функції та змінні, потрібні лише в межах одного ",[3425,8062,3460],{},", можна приховати через ",[3436,8065,8066],{},"анонімний простір імен",[3519,8068,8071],{"className":3564,"code":8069,"filename":8070,"language":3566,"meta":3567,"style":3527},"#include \"AppLog.h\"\n#include \u003Ciostream>\n\nnamespace \u002F\u002F без імені — видимий лише у цьому файлі\n{\n    void printLine(const char* level, const std::string& msg)\n    {\n        std::cout \u003C\u003C \"[\" \u003C\u003C level \u003C\u003C \"] \" \u003C\u003C msg \u003C\u003C \"\\n\";\n    }\n}\n\nvoid AppLog::info(const std::string& msg)  { printLine(\"INFO \", msg); }\nvoid AppLog::warn(const std::string& msg)  { printLine(\"WARN \", msg); }\nvoid AppLog::error(const std::string& msg) { printLine(\"ERROR\", msg); }\n","AppLog.cpp",[3425,8072,8073,8080,8086,8090,8097,8101,8133,8138,8165,8170,8174,8178,8218,8254],{"__ignoreMap":3527},[3571,8074,8075,8077],{"class":3573,"line":3574},[3571,8076,3471],{"class":3577},[3571,8078,8079],{"class":3580}," \"AppLog.h\"\n",[3571,8081,8082,8084],{"class":3573,"line":3584},[3571,8083,3471],{"class":3577},[3571,8085,3581],{"class":3580},[3571,8087,8088],{"class":3573,"line":3591},[3571,8089,3588],{"emptyLinePlaceholder":3587},[3571,8091,8092,8094],{"class":3573,"line":3627},[3571,8093,7381],{"class":3594},[3571,8095,8096],{"class":3623}," \u002F\u002F без імені — видимий лише у цьому файлі\n",[3571,8098,8099],{"class":3573,"line":3632},[3571,8100,3646],{"class":3602},[3571,8102,8103,8105,8108,8110,8112,8114,8117,8119,8121,8123,8125,8127,8129,8131],{"class":3573,"line":3643},[3571,8104,7461],{"class":3594},[3571,8106,8107],{"class":3598}," printLine",[3571,8109,3603],{"class":3602},[3571,8111,5615],{"class":3594},[3571,8113,5618],{"class":3594},[3571,8115,8116],{"class":3608}," level",[3571,8118,3612],{"class":3602},[3571,8120,5615],{"class":3594},[3571,8122,7318],{"class":3652},[3571,8124,7321],{"class":3602},[3571,8126,7324],{"class":3652},[3571,8128,7327],{"class":3594},[3571,8130,7330],{"class":3608},[3571,8132,3735],{"class":3602},[3571,8134,8135],{"class":3573,"line":3649},[3571,8136,8137],{"class":3602},"    {\n",[3571,8139,8140,8143,8145,8148,8151,8154,8157,8159,8161,8163],{"class":3573,"line":3694},[3571,8141,8142],{"class":3652},"        std",[3571,8144,3656],{"class":3602},[3571,8146,8147],{"class":3580},"\"[\"",[3571,8149,8150],{"class":3602}," \u003C\u003C level \u003C\u003C ",[3571,8152,8153],{"class":3580},"\"] \"",[3571,8155,8156],{"class":3602}," \u003C\u003C msg \u003C\u003C ",[3571,8158,3682],{"class":3580},[3571,8160,3686],{"class":3685},[3571,8162,3682],{"class":3580},[3571,8164,3691],{"class":3602},[3571,8166,8167],{"class":3573,"line":3705},[3571,8168,8169],{"class":3602},"    }\n",[3571,8171,8172],{"class":3573,"line":5179},[3571,8173,3708],{"class":3602},[3571,8175,8176],{"class":3573,"line":5187},[3571,8177,3588],{"emptyLinePlaceholder":3587},[3571,8179,8180,8182,8185,8187,8190,8192,8194,8196,8198,8200,8202,8204,8207,8210,8212,8215],{"class":3573,"line":5915},[3571,8181,5607],{"class":3594},[3571,8183,8184],{"class":3652}," AppLog",[3571,8186,7321],{"class":3602},[3571,8188,8189],{"class":3598},"info",[3571,8191,3603],{"class":3602},[3571,8193,5615],{"class":3594},[3571,8195,7318],{"class":3652},[3571,8197,7321],{"class":3602},[3571,8199,7324],{"class":3652},[3571,8201,7327],{"class":3594},[3571,8203,7330],{"class":3608},[3571,8205,8206],{"class":3602},")  { ",[3571,8208,8209],{"class":3598},"printLine",[3571,8211,3603],{"class":3602},[3571,8213,8214],{"class":3580},"\"INFO \"",[3571,8216,8217],{"class":3602},", msg); }\n",[3571,8219,8220,8222,8224,8226,8229,8231,8233,8235,8237,8239,8241,8243,8245,8247,8249,8252],{"class":3573,"line":5924},[3571,8221,5607],{"class":3594},[3571,8223,8184],{"class":3652},[3571,8225,7321],{"class":3602},[3571,8227,8228],{"class":3598},"warn",[3571,8230,3603],{"class":3602},[3571,8232,5615],{"class":3594},[3571,8234,7318],{"class":3652},[3571,8236,7321],{"class":3602},[3571,8238,7324],{"class":3652},[3571,8240,7327],{"class":3594},[3571,8242,7330],{"class":3608},[3571,8244,8206],{"class":3602},[3571,8246,8209],{"class":3598},[3571,8248,3603],{"class":3602},[3571,8250,8251],{"class":3580},"\"WARN \"",[3571,8253,8217],{"class":3602},[3571,8255,8256,8258,8260,8262,8265,8267,8269,8271,8273,8275,8277,8279,8281,8283,8285,8288],{"class":3573,"line":6228},[3571,8257,5607],{"class":3594},[3571,8259,8184],{"class":3652},[3571,8261,7321],{"class":3602},[3571,8263,8264],{"class":3598},"error",[3571,8266,3603],{"class":3602},[3571,8268,5615],{"class":3594},[3571,8270,7318],{"class":3652},[3571,8272,7321],{"class":3602},[3571,8274,7324],{"class":3652},[3571,8276,7327],{"class":3594},[3571,8278,7330],{"class":3608},[3571,8280,5097],{"class":3602},[3571,8282,8209],{"class":3598},[3571,8284,3603],{"class":3602},[3571,8286,8287],{"class":3580},"\"ERROR\"",[3571,8289,8217],{"class":3602},[3418,8291,8292,8294,8295,8297,8298,8301,8302,8304],{},[3425,8293,8209],{}," недоступна за межами ",[3425,8296,8070],{},". Навіть якщо інший файл визначить однойменну функцію — конфлікту не виникне. Анонімний простір імен є сучасним еквівалентом ",[3425,8299,8300],{},"static"," для функцій і змінних файлового рівня — і на відміну від ",[3425,8303,8300],{},", він застосовується і до типів.",[3850,8306,8308],{"id":8307},"вкладені-простори-імен","Вкладені простори імен",[3418,8310,8311],{},"Простори імен вкладаються один в одного для ієрархічної організації великих проєктів:",[3519,8313,8316],{"className":3564,"code":8314,"filename":8315,"language":3566,"meta":3567,"style":3527},"#pragma once\n#include \u003Cstring>\n\nnamespace AppCore\n{\n    namespace Logger\n    {\n        void log(const std::string& msg);\n        void warn(const std::string& msg);\n    }\n\n    namespace Config\n    {\n        std::string get(const std::string& key);\n        void        set(const std::string& key, const std::string& value);\n    }\n}\n","AppCore.h",[3425,8317,8318,8324,8330,8334,8341,8345,8352,8356,8379,8401,8405,8409,8416,8420,8448,8486,8490],{"__ignoreMap":3527},[3571,8319,8320,8322],{"class":3573,"line":3574},[3571,8321,7148],{"class":3577},[3571,8323,7152],{"class":7151},[3571,8325,8326,8328],{"class":3573,"line":3584},[3571,8327,3471],{"class":3577},[3571,8329,7441],{"class":3580},[3571,8331,8332],{"class":3573,"line":3591},[3571,8333,3588],{"emptyLinePlaceholder":3587},[3571,8335,8336,8338],{"class":3573,"line":3627},[3571,8337,7381],{"class":3594},[3571,8339,8340],{"class":3652}," AppCore\n",[3571,8342,8343],{"class":3573,"line":3632},[3571,8344,3646],{"class":3602},[3571,8346,8347,8350],{"class":3573,"line":3643},[3571,8348,8349],{"class":3594},"    namespace",[3571,8351,7452],{"class":3652},[3571,8353,8354],{"class":3573,"line":3649},[3571,8355,8137],{"class":3602},[3571,8357,8358,8361,8363,8365,8367,8369,8371,8373,8375,8377],{"class":3573,"line":3694},[3571,8359,8360],{"class":3594},"        void",[3571,8362,7292],{"class":3598},[3571,8364,3603],{"class":3602},[3571,8366,5615],{"class":3594},[3571,8368,7318],{"class":3652},[3571,8370,7321],{"class":3602},[3571,8372,7324],{"class":3652},[3571,8374,7327],{"class":3594},[3571,8376,7330],{"class":3608},[3571,8378,4960],{"class":3602},[3571,8380,8381,8383,8385,8387,8389,8391,8393,8395,8397,8399],{"class":3573,"line":3705},[3571,8382,8360],{"class":3594},[3571,8384,7486],{"class":3598},[3571,8386,3603],{"class":3602},[3571,8388,5615],{"class":3594},[3571,8390,7318],{"class":3652},[3571,8392,7321],{"class":3602},[3571,8394,7324],{"class":3652},[3571,8396,7327],{"class":3594},[3571,8398,7330],{"class":3608},[3571,8400,4960],{"class":3602},[3571,8402,8403],{"class":3573,"line":5179},[3571,8404,8169],{"class":3602},[3571,8406,8407],{"class":3573,"line":5187},[3571,8408,3588],{"emptyLinePlaceholder":3587},[3571,8410,8411,8413],{"class":3573,"line":5915},[3571,8412,8349],{"class":3594},[3571,8414,8415],{"class":3652}," Config\n",[3571,8417,8418],{"class":3573,"line":5924},[3571,8419,8137],{"class":3602},[3571,8421,8422,8424,8426,8428,8431,8433,8435,8437,8439,8441,8443,8446],{"class":3573,"line":6228},[3571,8423,8142],{"class":3652},[3571,8425,7321],{"class":3602},[3571,8427,7324],{"class":3652},[3571,8429,8430],{"class":3598}," get",[3571,8432,3603],{"class":3602},[3571,8434,5615],{"class":3594},[3571,8436,7318],{"class":3652},[3571,8438,7321],{"class":3602},[3571,8440,7324],{"class":3652},[3571,8442,7327],{"class":3594},[3571,8444,8445],{"class":3608}," key",[3571,8447,4960],{"class":3602},[3571,8449,8450,8452,8455,8457,8459,8461,8463,8465,8467,8469,8471,8473,8475,8477,8479,8481,8484],{"class":3573,"line":6233},[3571,8451,8360],{"class":3594},[3571,8453,8454],{"class":3598},"        set",[3571,8456,3603],{"class":3602},[3571,8458,5615],{"class":3594},[3571,8460,7318],{"class":3652},[3571,8462,7321],{"class":3602},[3571,8464,7324],{"class":3652},[3571,8466,7327],{"class":3594},[3571,8468,8445],{"class":3608},[3571,8470,3612],{"class":3602},[3571,8472,5615],{"class":3594},[3571,8474,7318],{"class":3652},[3571,8476,7321],{"class":3602},[3571,8478,7324],{"class":3652},[3571,8480,7327],{"class":3594},[3571,8482,8483],{"class":3608}," value",[3571,8485,4960],{"class":3602},[3571,8487,8488],{"class":3573,"line":6266},[3571,8489,8169],{"class":3602},[3571,8491,8492],{"class":3573,"line":6275},[3571,8493,3708],{"class":3602},[3418,8495,8496,8497,8499,8500,3465],{},"Доступ — через ",[3425,8498,7321],{}," для кожного рівня: ",[3425,8501,8502],{},"AppCore::Logger::log(\"msg\")",[3418,8504,8505],{},"C++17 додав скорочений синтаксис:",[3519,8507,8509],{"className":3564,"code":8508,"language":3566,"meta":3527,"style":3527},"\u002F\u002F До C++17:\nnamespace AppCore { namespace Logger { void log(const std::string& msg); } }\n\n\u002F\u002F C++17:\nnamespace AppCore::Logger\n{\n    void log(const std::string& msg);\n}\n",[3425,8510,8511,8516,8554,8558,8563,8574,8578,8600],{"__ignoreMap":3527},[3571,8512,8513],{"class":3573,"line":3574},[3571,8514,8515],{"class":3623},"\u002F\u002F До C++17:\n",[3571,8517,8518,8520,8523,8526,8528,8531,8533,8535,8537,8539,8541,8543,8545,8547,8549,8551],{"class":3573,"line":3584},[3571,8519,7381],{"class":3594},[3571,8521,8522],{"class":3652}," AppCore",[3571,8524,8525],{"class":3602}," { ",[3571,8527,7381],{"class":3594},[3571,8529,8530],{"class":3652}," Logger",[3571,8532,8525],{"class":3602},[3571,8534,5607],{"class":3594},[3571,8536,7292],{"class":3598},[3571,8538,3603],{"class":3602},[3571,8540,5615],{"class":3594},[3571,8542,7318],{"class":3652},[3571,8544,7321],{"class":3602},[3571,8546,7324],{"class":3652},[3571,8548,7327],{"class":3594},[3571,8550,7330],{"class":3608},[3571,8552,8553],{"class":3602},"); } }\n",[3571,8555,8556],{"class":3573,"line":3591},[3571,8557,3588],{"emptyLinePlaceholder":3587},[3571,8559,8560],{"class":3573,"line":3627},[3571,8561,8562],{"class":3623},"\u002F\u002F C++17:\n",[3571,8564,8565,8567,8569,8571],{"class":3573,"line":3632},[3571,8566,7381],{"class":3594},[3571,8568,8522],{"class":3652},[3571,8570,7321],{"class":3602},[3571,8572,8573],{"class":3652},"Logger\n",[3571,8575,8576],{"class":3573,"line":3643},[3571,8577,3646],{"class":3602},[3571,8579,8580,8582,8584,8586,8588,8590,8592,8594,8596,8598],{"class":3573,"line":3649},[3571,8581,7461],{"class":3594},[3571,8583,7292],{"class":3598},[3571,8585,3603],{"class":3602},[3571,8587,5615],{"class":3594},[3571,8589,7318],{"class":3652},[3571,8591,7321],{"class":3602},[3571,8593,7324],{"class":3652},[3571,8595,7327],{"class":3594},[3571,8597,7330],{"class":3608},[3571,8599,4960],{"class":3602},[3571,8601,8602],{"class":3573,"line":3694},[3571,8603,3708],{"class":3602},[3850,8605,8607,8608],{"id":8606},"чому-весь-stl-живе-у-std","Чому весь STL живе у ",[3425,8609,5423],{},[3418,8611,8612,8613,8615,8616,3612,8618,3612,8621,3612,8624,8627],{},"При стандартизації C++98 весь функціонал стандартної бібліотеки перемістили у простір імен ",[3425,8614,5423],{},", щоб усунути конфлікти між бібліотечними іменами та іменами користувача. До цього ",[3425,8617,5416],{},[3425,8619,8620],{},"sort",[3425,8622,8623],{},"find",[3425,8625,8626],{},"max"," жили у глобальному просторі — і будь-який збіг з вашим іменем ламав код.",[3418,8629,8630,8631,8637,8638,8640],{},"Правило курсу: ",[3436,8632,8633,8634],{},"завжди писати ",[3425,8635,8636],{},"std::",", не використовувати ",[3425,8639,7837],{}," — це виробляє правильну звичку для промислового програмування.",[3449,8642],{},[3413,8644,8646],{"id":8645},"практика","Практика",[3418,8648,8649],{},"Завдання нижче охоплюють увесь модуль: організацію файлів, заголовки, препроцесор, header guards і простори імен. Кожен рівень вимагає застосувати кілька концепцій одночасно.",[3850,8651,8653],{"id":8652},"рівень-1-базовий","Рівень 1 — Базовий",[8655,8656,8657,8718,8754],"accordion",{},[8658,8659,8662,8678,8703],"accordion-item",{"icon":8660,"label":8661},"i-lucide-circle-help","Завдання 1.1: Перший модуль",[3418,8663,8664,8665,3612,8667,3612,8670,8673,8674,8677],{},"Розділіть однофайлову програму на три файли: ",[3425,8666,3504],{},[3425,8668,8669],{},"Converter.h",[3425,8671,8672],{},"Converter.cpp",". У модулі ",[3425,8675,8676],{},"Converter"," реалізуйте функції:",[3792,8679,8680,8689,8695],{},[3795,8681,8682,8685,8686],{},[3425,8683,8684],{},"double celsiusToFahrenheit(double c)"," — формула ",[3425,8687,8688],{},"(c * 9.0 \u002F 5.0) + 32",[3795,8690,8691,8694],{},[3425,8692,8693],{},"double fahrenheitToCelsius(double f)"," — зворотна",[3795,8696,8697,4911,8700],{},[3425,8698,8699],{},"double celsiusToKelvin(double c)",[3425,8701,8702],{},"c + 273.15",[3418,8704,8705,8706,8708,8709,8711,8712,8714,8715,3465],{},"Вимоги: ",[3425,8707,8669],{}," має ",[3425,8710,6811],{},", містить лише прототипи. ",[3425,8713,3504],{}," підключає заголовок і демонструє всі три конвертації. Скомпілюйте командою ",[3425,8716,8717],{},"g++ -std=c++17 -Wall main.cpp Converter.cpp -o converter",[8658,8719,8721,8724,8751],{"icon":8660,"label":8720},"Завдання 1.2: Навмисні помилки",[3418,8722,8723],{},"Візьміть результат завдання 1.1 і навмисно спровокуйте три різні помилки:",[6663,8725,8726,8738,8743],{},[3795,8727,8728,8729,8731,8732,8734,8735,8737],{},"Видаліть ",[3425,8730,6811],{}," із ",[3425,8733,8669],{}," і підключіть його двічі в ",[3425,8736,3504],{}," — отримайте «redefinition».",[3795,8739,8728,8740,8742],{},[3425,8741,8672],{}," із команди компіляції — отримайте «undefined reference».",[3795,8744,8745,8746,4176,8748,8750],{},"Додайте ",[3425,8747,5524],{},[3425,8749,8669],{}," — поясніть у коментарі, чому це небезпечно.",[3418,8752,8753],{},"Для кожної помилки зафіксуйте точний текст повідомлення компілятора або лінкера.",[8658,8755,4706,8757,8759,8760,8763,8764,8767,8768,8771,8772,8774,8775,8777,8778,8781],{"icon":8660,"label":8756},"Завдання 1.3: Умовна компіляція",[3425,8758,8672],{}," додайте відлагоджувальний вивід через умовну компіляцію: якщо визначено символ ",[3425,8761,8762],{},"DEBUG",", кожна функція виводить у ",[3425,8765,8766],{},"std::cerr"," свої вхідні та вихідні значення у форматі ",[3425,8769,8770],{},"[DEBUG] celsiusToFahrenheit(100) = 212",". Переконайтеся, що без ",[3425,8773,8762],{}," вивід відсутній. Перевірте обидва варіанти: через ",[3425,8776,6693],{}," у коді і через ",[3425,8779,8780],{},"-DDEBUG"," у командному рядку.",[3850,8783,8785],{"id":8784},"рівень-2-модульний-калькулятор","Рівень 2 — Модульний калькулятор",[8655,8787,8788,8943],{},[8658,8789,8791,8799,8816,8838,8854,8886,8899,8916],{"icon":8660,"label":8790},"Завдання 2.1: Три модулі з просторами імен",[3418,8792,8793,8794,8796,8797,4673],{},"Реалізуйте консольний калькулятор із трьома модулями, кожен у своєму просторі імен і власній парі ",[3425,8795,4869],{},"\u002F",[3425,8798,3460],{},[3418,8800,8801,3480,8806,4892,8809,8812,8813,4673],{},[3436,8802,8803],{},[3425,8804,8805],{},"IO",[3425,8807,8808],{},"IO.h",[3425,8810,8811],{},"IO.cpp",") у просторі ",[3425,8814,8815],{},"namespace IO",[3792,8817,8818,8826,8832],{},[3795,8819,8820,8823,8824],{},[3425,8821,8822],{},"double readDouble(const char* prompt)"," — виводить підказку, читає ",[3425,8825,5007],{},[3795,8827,8828,8831],{},[3425,8829,8830],{},"char readChar(const char* prompt)"," — виводить підказку, читає символ",[3795,8833,8834,8837],{},[3425,8835,8836],{},"void printResult(const char* label, double value)"," — форматований вивід",[3418,8839,8840,3480,8845,4892,8848,8812,8851,4673],{},[3436,8841,8842],{},[3425,8843,8844],{},"Ops",[3425,8846,8847],{},"Ops.h",[3425,8849,8850],{},"Ops.cpp",[3425,8852,8853],{},"namespace Ops",[3792,8855,8856,8861,8866,8871,8880],{},[3795,8857,8858],{},[3425,8859,8860],{},"double add(double a, double b)",[3795,8862,8863],{},[3425,8864,8865],{},"double subtract(double a, double b)",[3795,8867,8868],{},[3425,8869,8870],{},"double multiply(double a, double b)",[3795,8872,8873,8876,8877,8879],{},[3425,8874,8875],{},"double safeDivide(double a, double b)"," — повертає ",[3425,8878,5166],{}," при діленні на нуль",[3795,8881,8882,8885],{},[3425,8883,8884],{},"double power(double base, int exp)"," — зведення в ціле степінь",[3418,8887,8888,3480,8893,8896,8897,4673],{},[3436,8889,8890],{},[3425,8891,8892],{},"Config",[3425,8894,8895],{},"Config.h",") — лише константи через ",[3425,8898,5500],{},[3792,8900,8901,8906,8911],{},[3795,8902,8903],{},[3425,8904,8905],{},"constexpr int VERSION_MAJOR = 1",[3795,8907,8908],{},[3425,8909,8910],{},"constexpr int VERSION_MINOR = 0",[3795,8912,8913],{},[3425,8914,8915],{},"constexpr const char* APP_NAME = \"Калькулятор\"",[3418,8917,8918,8919,8921,8922,8924,8925,8927,8928,8931,8932,8935,8936,8939,8940,3465],{},"Вимоги: усі заголовки захищені (",[3425,8920,6811],{},"). У ",[3425,8923,3504],{}," заборонено ",[3425,8926,7823],{},". Функція ",[3425,8929,8930],{},"main"," читає два числа та операцію через ",[3425,8933,8934],{},"IO::",", виконує через ",[3425,8937,8938],{},"Ops::",", виводить через ",[3425,8941,8942],{},"IO::printResult",[8658,8944,8946,8975,8981,9040],{"icon":8660,"label":8945},"Завдання 2.2: Анонімний namespace та платформа",[3418,8947,8948,8949,8951,8952,8954,8955,8958,8959,8962,8963,8965,8966,8294,8969,8971,8972,8974],{},"До модуля ",[3425,8950,8805],{}," додайте у ",[3425,8953,8811],{}," допоміжну функцію ",[3425,8956,8957],{},"formatValue(double v)"," в ",[3436,8960,8961],{},"анонімному"," просторі імен — вона форматує число до двох знаків після коми. Використовуйте її всередині ",[3425,8964,8942],{},". Переконайтеся, що ",[3425,8967,8968],{},"formatValue",[3425,8970,8811],{}," (спробуйте викликати з ",[3425,8973,3504],{}," — має бути помилка компілятора).",[3418,8976,8977,8978,8980],{},"До ",[3425,8979,8895],{}," додайте крос-платформне визначення через умовну компіляцію:",[3519,8982,8984],{"className":3564,"code":8983,"language":3566,"meta":3527,"style":3527},"#if defined(_WIN32)\n    constexpr const char* PATH_SEP = \"\\\\\";\n#else\n    constexpr const char* PATH_SEP = \"\u002F\";\n#endif\n",[3425,8985,8986,8994,9017,9021,9036],{"__ignoreMap":3527},[3571,8987,8988,8990,8992],{"class":3573,"line":3574},[3571,8989,6357],{"class":3577},[3571,8991,6551],{"class":3577},[3571,8993,6554],{"class":3594},[3571,8995,8996,8999,9002,9005,9008,9010,9013,9015],{"class":3573,"line":3584},[3571,8997,8998],{"class":3594},"    constexpr",[3571,9000,9001],{"class":3594}," const",[3571,9003,9004],{"class":3594}," char",[3571,9006,9007],{"class":3602},"* PATH_SEP = ",[3571,9009,3682],{"class":3580},[3571,9011,9012],{"class":3685},"\\\\",[3571,9014,3682],{"class":3580},[3571,9016,3691],{"class":3602},[3571,9018,9019],{"class":3573,"line":3591},[3571,9020,6579],{"class":3577},[3571,9022,9023,9025,9027,9029,9031,9034],{"class":3573,"line":3627},[3571,9024,8998],{"class":3594},[3571,9026,9001],{"class":3594},[3571,9028,9004],{"class":3594},[3571,9030,9007],{"class":3602},[3571,9032,9033],{"class":3580},"\"\u002F\"",[3571,9035,3691],{"class":3602},[3571,9037,9038],{"class":3573,"line":3632},[3571,9039,5033],{"class":3577},[3418,9041,9042],{},"Виведіть роздільник шляху разом із назвою програми при запуску.",[3850,9044,9046],{"id":9045},"рівень-3-повноцінний-модульний-проєкт","Рівень 3 — Повноцінний модульний проєкт",[8655,9048,9049],{},[8658,9050,9052,9055,9061,9069,9077,9099,9107,9142,9149,9157,9177,9190,9218,9224,9250],{"icon":8660,"label":9051},"Завдання 3.1: Система студентського журналу",[3418,9053,9054],{},"Розробіть повноцінний проєкт із такою структурою:",[3519,9056,9059],{"className":9057,"code":9058,"language":3524},[3522],"Student.h \u002F Student.cpp   — namespace Records\nJournal.h \u002F Journal.cpp   — namespace Records\nReport.h  \u002F Report.cpp    — namespace Output\nConfig.h                  — лише constexpr-константи\nmain.cpp\n",[3425,9060,9058],{"__ignoreMap":3527},[3418,9062,9063,9068],{},[3436,9064,9065],{},[3425,9066,9067],{},"namespace Records"," (обидва модулі в одному просторі):",[3418,9070,4706,9071,4892,9074,4673],{},[3425,9072,9073],{},"Student.h",[3425,9075,9076],{},"Student.cpp",[3792,9078,9079,9085,9090],{},[3795,9080,9081,9082],{},"Структура ",[3425,9083,9084],{},"Student { std::string name; int age; double gpa; }",[3795,9086,9087],{},[3425,9088,9089],{},"Student createStudent(const std::string& name, int age, double gpa)",[3795,9091,9092,9095,9096,9098],{},[3425,9093,9094],{},"void printStudent(const Student& s)"," (використовує анонімний namespace у ",[3425,9097,3460],{}," для форматування)",[3418,9100,4706,9101,4892,9104,4673],{},[3425,9102,9103],{},"Journal.h",[3425,9105,9106],{},"Journal.cpp",[3792,9108,9109,9117,9122,9131,9136],{},[3795,9110,9111,9114,9115],{},[3425,9112,9113],{},"constexpr int MAX_STUDENTS = 30"," — у ",[3425,9116,8895],{},[3795,9118,9119],{},[3425,9120,9121],{},"struct Journal { Student students[30]; int count; }",[3795,9123,9124,8876,9127,9130],{},[3425,9125,9126],{},"bool addStudent(Journal& j, const Student& s)",[3425,9128,9129],{},"false"," при переповненні",[3795,9132,9133],{},[3425,9134,9135],{},"const Student* findByName(const Journal& j, const std::string& name)",[3795,9137,9138,9141],{},[3425,9139,9140],{},"void sortByGpa(Journal& j)"," — сортування за спаданням GPA",[3418,9143,9144,4673],{},[3436,9145,9146],{},[3425,9147,9148],{},"namespace Output",[3418,9150,4706,9151,4892,9154,4673],{},[3425,9152,9153],{},"Report.h",[3425,9155,9156],{},"Report.cpp",[3792,9158,9159,9165,9171],{},[3795,9160,9161,9164],{},[3425,9162,9163],{},"void printHeader(const char* title)"," — виводить заголовок із роздільниками",[3795,9166,9167,9170],{},[3425,9168,9169],{},"void printJournal(const Records::Journal& j)"," — повний звіт",[3795,9172,9173,9176],{},[3425,9174,9175],{},"void printStats(const Records::Journal& j)"," — середній, мінімальний і максимальний GPA",[3418,9178,9179,9183,9184,9186,9187,9189],{},[3436,9180,9181],{},[3425,9182,8895],{}," (тільки ",[3425,9185,6811],{}," + ",[3425,9188,5500],{},"):",[3792,9191,9192,9206],{},[3795,9193,9194,3612,9197,3612,9200,3612,9203],{},[3425,9195,9196],{},"APP_NAME",[3425,9198,9199],{},"VERSION_MAJOR",[3425,9201,9202],{},"VERSION_MINOR",[3425,9204,9205],{},"MAX_STUDENTS",[3795,9207,9208,9209,5436,9212,9215,9216],{},"Умовна компіляція: ",[3425,9210,9211],{},"#ifdef DEBUG",[3425,9213,9214],{},"constexpr bool LOG_ENABLED = true"," інакше ",[3425,9217,9129],{},[3418,9219,9220,4673],{},[3436,9221,9222],{},[3425,9223,3504],{},[3792,9225,9226,9229,9232,9238,9244],{},[3795,9227,9228],{},"Підключає всі заголовки",[3795,9230,9231],{},"Створює журнал, додає 5–7 студентів",[3795,9233,9234,9235],{},"Виводить звіт через ",[3425,9236,9237],{},"Output::printJournal",[3795,9239,9240,9241],{},"Виводить статистику через ",[3425,9242,9243],{},"Output::printStats",[3795,9245,9246,9247,9249],{},"За наявності ",[3425,9248,8762],{}," — виводить версію та назву програми при запуску",[3418,9251,9252,9253,9255,9256,9258,9259,9261],{},"Усі ",[3425,9254,4869],{},"-файли захищені. Жодного ",[3425,9257,7823],{}," у заголовках. У кожному ",[3425,9260,3460],{}," допоміжні функції — в анонімному просторі імен.",[3449,9263],{},[3413,9265,9267],{"id":9266},"резюме","Резюме",[5481,9269,9270,9280,9288,9301,9323,9341],{},[5484,9271,9273,9274,9276,9277,9279],{"icon":943,"title":9272},"🏗️ Файли та лінкер","Кожен ",[3425,9275,3460],{}," — окрема одиниця трансляції. Компілятор обробляє їх незалежно. Лінкер збирає ",[3425,9278,3483],{},"-файли в єдиний виконуваний, вирішуючи всі міжфайлові посилання.",[5484,9281,9284,9285,9287],{"icon":9282,"title":9283},"i-lucide-file-text","📋 ODR і оголошення","Визначення функції — рівно одне. Оголошень — скільки завгодно. Попереднє оголошення дозволяє викликати функцію до її визначення. Заголовки містять оголошення, ",[3425,9286,3460],{}," — визначення.",[5484,9289,9292,9293,9295,9296,9298,9299,3465],{"icon":9290,"title":9291},"i-lucide-files","📄 Пара .h \u002F .cpp","Еталонний патерн організації: заголовок — інтерфейс (що), ",[3425,9294,3460],{}," — реалізація (як). Ім'я заголовка збігається з іменем реалізаційного файлу. ",[3425,9297,3460],{}," підключає власний ",[3425,9300,4869],{},[5484,9302,9305,9306,9308,9309,9311,9312,9314,9315,9317,9318,9320,9321,3465],{"icon":9303,"title":9304},"i-lucide-cog","⚙️ Препроцесор","Запускається до компілятора. ",[3425,9307,3471],{}," — буквальна текстова підстановка. ",[3425,9310,4933],{}," для констант — антипатерн, використовуйте ",[3425,9313,5500],{},". ",[3425,9316,4933],{}," без значення + ",[3425,9319,6169],{}," — умовна компіляція. Символи передаються через ",[3425,9322,6747],{},[5484,9324,9327,4892,9330,4892,9333,4818,9335,9337,9338,9340],{"icon":9325,"title":9326},"i-lucide-shield","🛡️ Header guards",[3425,9328,9329],{},"#ifndef ІМ'Я",[3425,9331,9332],{},"#define ІМ'Я",[3425,9334,6347],{},[3425,9336,6811],{}," — кожен заголовок зобов'язаний мати захист від подвійного підключення. Без нього ланцюгові ",[3425,9339,3471],{}," призводять до «redefinition».",[5484,9342,9345,9346,9314,9348,9350,9351,9353],{"icon":9343,"title":9344},"i-lucide-package","📦 namespace і ::","Ізолює ідентифікатори від конфліктів. Доступ через ",[3425,9347,7321],{},[3425,9349,7823],{}," у заголовках — абсолютно заборонено. Анонімний ",[3425,9352,7381],{}," приховує допоміжні функції файлу. Вкладені простори організують ієрархію великих проєктів.",[3445,9355,9356,9357,9360],{},"На цьому завершується модуль організації коду. Ми пройшли повний шлях: від проблеми одного великого файлу — через механізм компіляції і лінкування, заголовки, препроцесор і захист від дублювання — до ізоляції імен у великих проєктах. Наступний модуль — ",[3436,9358,9359],{},"об'єктно-орієнтоване програмування",": класи, конструктори, деструктори та інкапсуляція.",[9362,9363,9364],"style",{},"html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sa4r_, html code.shiki .sa4r_{--shiki-light:#E50000;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}",{"title":3527,"searchDepth":3584,"depth":3584,"links":9366},[9367,9368,9369,9370,9376,9381,9382,9393,9403,9410,9422,9427],{"id":3415,"depth":3584,"text":3416},{"id":3453,"depth":3584,"text":3454},{"id":3547,"depth":3584,"text":3548},{"id":3841,"depth":3584,"text":3842,"children":9371},[9372,9373,9374,9375],{"id":3852,"depth":3591,"text":3853},{"id":4309,"depth":3591,"text":4310},{"id":4340,"depth":3591,"text":4341},{"id":4436,"depth":3591,"text":4437},{"id":4457,"depth":3584,"text":4458,"children":9377},[9378,9379,9380],{"id":4461,"depth":3591,"text":4462},{"id":4659,"depth":3591,"text":4660},{"id":4702,"depth":3591,"text":4703},{"id":4767,"depth":3584,"text":4768},{"id":4832,"depth":3584,"text":4833,"children":9383},[9384,9385,9386,9388,9390,9392],{"id":4836,"depth":3591,"text":4837},{"id":4859,"depth":3591,"text":4860},{"id":4888,"depth":3591,"text":9387},"Пара .h \u002F .cpp — еталонний патерн",{"id":5350,"depth":3591,"text":9389},"\u003C> vs \"\" — де шукає препроцесор",{"id":5402,"depth":3591,"text":9391},"Чому iostream, а не iostream.h",{"id":5472,"depth":3591,"text":5473},{"id":5534,"depth":3584,"text":5535,"children":9394},[9395,9396,9398,9400,9401,9402],{"id":5538,"depth":3591,"text":5539},{"id":5584,"depth":3591,"text":9397},"Директива #include: текстова підстановка",{"id":5776,"depth":3591,"text":9399},"Директива #define: макроси",{"id":6104,"depth":3591,"text":6105},{"id":6654,"depth":3591,"text":6655},{"id":6737,"depth":3591,"text":6738},{"id":6807,"depth":3584,"text":9404,"children":9405},"Header guards і #pragma once",[9406,9407,9408,9409],{"id":6814,"depth":3591,"text":6815},{"id":7003,"depth":3591,"text":7004},{"id":7133,"depth":3591,"text":6811},{"id":7173,"depth":3591,"text":7174},{"id":7265,"depth":3584,"text":7266,"children":9411},[9412,9413,9415,9416,9418,9419,9420],{"id":7269,"depth":3591,"text":7270},{"id":7351,"depth":3591,"text":9414},"Синтаксис і оператор ::",{"id":7687,"depth":3591,"text":7688},{"id":7820,"depth":3591,"text":9417},"using namespace — зручність із наслідками",{"id":8056,"depth":3591,"text":8057},{"id":8307,"depth":3591,"text":8308},{"id":8606,"depth":3591,"text":9421},"Чому весь STL живе у std",{"id":8645,"depth":3584,"text":8646,"children":9423},[9424,9425,9426],{"id":8652,"depth":3591,"text":8653},{"id":8784,"depth":3591,"text":8785},{"id":9045,"depth":3591,"text":9046},{"id":9266,"depth":3584,"text":9267},"Одиниця трансляції та роль лінкера, попереднє оголошення і ODR, встановлення g++ на Windows\u002FmacOS\u002FLinux, заголовкові файли і пара .h\u002F.cpp, директиви препроцесора (#include, #define, умовна компіляція), header guards і #pragma once, простори імен namespace та оператор ::.","md",null,{},{"title":1897,"description":9428},"1eGVX5r0SP9i-v3JaQPSoSMu4TIntgsHNKehzhLTWtQ",[9435,9437],{"title":1893,"path":1894,"stem":1895,"description":9436,"children":-1},"Що таке union у C++, як він відрізняється від struct, чому всі члени поділяють один буфер пам'яті, де union застосовується на практиці (мережеві пакети, floating-point хаки, варіантні типи), що таке Undefined Behavior при зчитуванні не-активного члена, та чому std::variant є безпечною сучасною альтернативою.",{"title":1901,"path":1902,"stem":1903,"description":9438,"children":-1},"Класичний підхід до роботи з файлами в C\u002FC++ через бібліотеку stdio.h. Структура FILE, функції fopen\u002Ffclose, текстові та бінарні файли, форматований і посимвольний ввід\u002Fвивід, прямий доступ та функції позиціонування.",1784194420391]