<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ об’єктно-орієнтоване програмування - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/ukrainian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ об’єктно-орієнтоване програмування - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/ukrainian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 07 Jun 2026 04:51:22 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/ukrainian/news/tag/obiektno-oriientovanie-proghramuvannia/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Чотири опори об’єктно-орієнтованого програмування ]]>
                </title>
                <description>
                    <![CDATA[ JavaScript є мовою, що підтримує багато парадигм програмування. Парадигмою програмування називають набір правил, згідно з якими ви пишете код, щоб було легше вирішити певну проблему. Якраз цим є чотири опори — принципами програмного забезпечення, які допомагають писати чистий об’єктно-орієнтований код. Цими принципами є:  * Абстракція  * Інкапсуляція  ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/chotyry-opory-obyektno-oriyentovanoho-prohramuvannya/</link>
                <guid isPermaLink="false">64b90bc6c565f0067c726995</guid>
                
                    <category>
                        <![CDATA[ об’єктно-орієнтоване програмування ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Lysak ]]>
                </dc:creator>
                <pubDate>Mon, 24 Jul 2023 11:24:25 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/07/4-opory.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/four-pillars-of-object-oriented-programming/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Four Pillars of Object-Oriented Programming</a>
      </p><p>JavaScript є мовою, що підтримує багато парадигм програмування. Парадигмою програмування називають набір правил, згідно з якими ви пишете код, щоб було легше вирішити певну проблему.</p><p>Якраз цим є чотири опори — принципами програмного забезпечення, які допомагають писати чистий об’єктно-орієнтований код.</p><p>Цими принципами є:</p><ul><li>Абстракція</li><li>Інкапсуляція</li><li>Успадкування</li><li>Поліморфізм</li></ul><p>Давайте детальніше розглянемо кожен з них.</p><h1 id="-"><strong>Абстракція в об’єктно-орієнтованому програмуванні</strong></h1><p>Щось «абстрагувати» означає приховати деталі імплементації всередині певної обгортки — іноді прототипа, іноді функції. ­Як наслідок, при виклику функції вам не треба розуміти, як саме вона працює.</p><p>Якби ви мали досконало знати кожну функцію у великій базі коду, ви б взагалі не писали код. Вам довелося б потратити місяці на прочитання всього коду.</p><p>Ви можете створити придатну до багаторазового використання, гнучку та просту для розуміння базу коду, абстрагуючи певні деталі. Наприклад:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">function hitAPI(type){
	if (type instanceof InitialLoad) {
		// приклад імплементації
	} else if (type instanceof NavBar) {
		// приклад імплементації
	} else {
		// приклад імплементації
	}
}</code></pre><figcaption>Цей код зовсім не використовує принцип абстракції.</figcaption></figure><p>Помітили, як у цьому прикладі довелося імплементувати все те, що потрібно для кожного сценарію використання?</p><p>Для кожного API, до якого вам потрібно звернутися, необхідно створювати новий блок <code>if</code> зі своєю власною імплементацією. Такий код не є абстрагованим, оскільки вам необхідно турбуватися про імплементацію кожного нового типу, який ви будете додавати. Такий код непридатний до повторного використання і його дуже складно підтримувати.</p><p>А що стосується прикладу знизу?</p><pre><code class="language-javascript">hitApi('www.kealanparr.com', HTTPMethod.Get)</code></pre><p>Ви можете просто передати URL та метод HTTP як аргументи до цієї функції і все.</p><p>Вам не потрібно думати про те, як ця функція працює. Ця проблема давно вирішена. Це суттєво допомагає повторному використанню коду і полегшує його утримання.</p><p>В цьому і полягає суть <strong>абстракції</strong>:<strong> </strong>в пошуку схожих частин коду та їх обгортанні в загальну функцію або об’єкт для використання в багатьох місцях/вирішення багатьох проблем.</p><p>Ось хороший підсумовуючий приклад <strong>абстракції</strong>: уявіть, що ви створюєте машину, яка робить каву для ваших користувачів. Ви можете використати два підходи:</p><h2 id="--1"><strong>Як створити кавову машину з абстракцією</strong></h2><ul><li>Створіть кнопку з заголовком «Зробити каву»</li></ul><h2 id="--2"><strong>Як створити кавову машину без абстракції</strong></h2><ul><li>Створіть кнопку з заголовком «Закип’ятити воду»</li><li>Створіть кнопку з заголовком «Налити холодну воду в чайник»</li><li>Створіть кнопку з заголовком «Насипати одну ложку кави в кружку»</li><li>Створіть кнопку з заголовком «Помити брудні кружки»</li><li>І багато інших кнопок</li></ul><p>Це дуже простий приклад, але суть в тому, що перший підхід <em>абстрагує</em> всю логіку в обгортку у вигляді кавової машини. А другий приклад змушує користувача вміти робити каву і зробити напій самостійно.</p><p>Наступна опора об’єктно-орієнтованого програмування покаже нам один зі способів, завдяки якому ми можемо досягнути <strong>абстракції</strong>, а саме за допомогою <strong>інкапсуляції</strong>.</p><h1 id="--3"><strong>Інкапсуляція в об’єктно-орієнтованому програмуванні</strong></h1><p>Визначенням інкапсуляції є «обмеження чогось у певних рамках, ніби у капсулі». По суті, <strong>інкапсуляція</strong> — це відбирання доступу до певних частин коду та їх приватизація (інкапсуляцію також часто називають приховуванням інформації). </p><p>Інкапсуляція означає, що кожен об’єкт у коді повинен контролювати свій стан. Стан — це поточний вигляд об’єкта, до якого відносять ключі, методи об’єкта, булеві властивості і так далі. Коли ви змінюєте булеве значення або видаляєте ключ з об’єкта, ви змінюєте його стан.</p><p>Обмежуйте доступ до частин свого коду. Робіть їх менш відкритими, якщо в них немає першочергової необхідності.</p><p>Приватні властивості в JavaScript можливі завдяки замиканням. Ось приклад нижче:</p><pre><code class="language-javascript">var Dog = (function () {

	// приватна
	var play = function () {
		// імплементація play
	};
    
	// приватна
	var breed = "Dalmatian"
    
	// публічна
	var name = "Rex";

	// публічна
	var makeNoise = function () {
 		return 'Bark bark!';
	};

 	return {
		makeNoise: makeNoise,
		name: name
 	};
})();

</code></pre><p>Спочатку ми створили функцію, яка одразу викликається (її називають <strong>виразом негайно викликаної функції</strong>, скорочено IIFE). Це створило об’єкт, до якого будь-хто має доступ, але разом з тим приховали деякі деталі. Ви не зможете викликати метод <code>play</code> та властивість <code>breed</code>, оскільки ми не зробили їх публічними в об’єкті, який повертає функція.</p><p>Використана нами схема називається <strong>паттерном викриття модуля</strong>, але це лише приклад того, як ви можете досягти <strong>інкапcуляції</strong>.</p><p>Я хотів би зосередитись саме на ідеї <strong>інкапсуляції </strong>(що набагато важливіше, ніж вивчити один паттерн і вважати, що ми повністю розібрали <strong>інкапсуляцію</strong>).</p><p>Зробіть перерву, щоб подумати над тим, як ви можете приховати свою інформацію та код і розділити їх. Модуляризація та чіткий розподіл обов’язків є ключовими для <strong>об’єктної орієнтації.</strong></p><p>Чому варто надавати перевагу приватності? Чому не можна просто зробити все глобальним?</p><ul><li>Багато непов’язаних між собою за змістом частин стануть залежними/згрупованими через глобальну змінну.</li><li>Скоріше за все, ви зміните значення змінних, якщо їхні імена будуть використовуватися декілька разів, що може привести до багів або непередбачуваної поведінки.</li><li>Ймовірно, ви створите багато <strong>спагеті</strong> (коду, який тяжко зрозуміти та в якому тяжко побачити, що зчитує та переписує змінні й змінює стан).</li></ul><p>Інкапсуляція може бути застосована шляхом поділу довгих рядків коду на менші окремі функції. Розподіліть ці функції на модулі. Ми приховуємо інформацію в місцях, де ніщо не має до неї доступ, відкриваючи лише те, що є необхідним.</p><p>По суті це і є <strong>інкапсуляцією</strong>: прив’язка вашої інформації до чогось, незалежно від того чи це клас, об’єкт, модуль або функція та спроба зробити її настільки приватною, наскільки це можливо в розумних рамках.</p><h1 id="--4"><strong>Успадкування в об’єктно-орієнтованому програмуванні</strong></h1><p>Успадкування дозволяє одному об’єкту отримувати властивості та методи від іншого. У JavaScript це реалізовано у вигляді <strong>прототипного успадкування</strong>.</p><p>Багаторазове використання є основною перевагою такого рішення. Іноді багато частин коду мають робити те саме, і в процесі вони мають виконувати однаково усе, окрім одної маленької деталі. Успадкування може вирішити таку проблему.</p><p>Коли б нами не використовувалось успадкування, ми намагаємося зробити все так, щоб батьківський об’єкт та об’єкт-нащадок мали <strong>високу згуртованість</strong>. Згуртованість — це змістовий зв’язок у коді. Наприклад, чи походить тип <code>Bird</code> від <code>DieselEngine</code>?</p><p>Намагайтеся робити успадкування у своєму коді легким для розуміння та передбачуваним. Не наслідуйте з абсолютно непов’язаних об’єктів лише через те, що вони мають один метод чи властивість, які вам потрібні. Успадкування не вирішує конкретно цю проблему.</p><p>При успадкуванні вам знадобиться більша частина наслідуваного функціоналу (вам не потрібно завжди наслідувати все).</p><p>Серед розробників відомий <strong>принцип підстановки Лісков</strong>. Цей принцип стверджує, що якщо ви можете використати батьківський клас (наприклад, <code>ParentType</code>) будь-де, де ви б використали спадкоємця (наприклад, <code>ChildType</code>) і <code>ChildType</code> успадковує від <code>ParentType</code> — тоді ви пройдете тест.</p><p>Головною причиною, з якої ви можете не пройти тест, є видалення об’єктом <code>ChildType</code> методів, які він успадкував від батьківського об’єкта. Це призвело б до <code>TypeError</code>, де методи чи властивості не визначені або є не тим, що ви очікували.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/image-146.png" class="kg-image" alt="image-146" width="600" height="400" loading="lazy"><figcaption>Виглядає так, ніби стрілки вказують у хибному напрямку. Але «Animal» є основою, тобто батьківським об’єктом.</figcaption></figure><p>Ланцюг успадкування — це термін, який використовується для описання потоку успадкування від прототипу об’єкта-основи (того, від якого успадковують всі інші об’єкти) до «кінця» ланцюга успадкування (останній об’єкт, що наслідує; в нашому випадку «Dog»).</p><p>Намагайтеся тримати свої ланцюги успадкування чистими та змістовними. Можна дуже легко почати писати антипаттерни під час <strong>успадкування </strong>(наприклад, <strong>антипаттерн крихкої основи</strong>). Таке стається, коли ваші прототипи-основи вважаються «крихкими», тому що ви робите «безпечну» зміну до об’єкта-основи, через яку ламаються всі спадкоємці.</p><h1 id="--5"><strong>Поліморфізм в об’єктно-орієнтованому програмуванні</strong></h1><p>Поліморфізм — це «можливість відбуватися в декількох різних формах». Саме за це і відповідає четверта опора об’єктно-орієнтованого програмування: за типи в межах окремих ланцюгів успадкування, які можуть робити різні речі.</p><p>Якщо ви правильно реалізували успадкування, ви можете використовувати батьківські об’єкти так само, як і їхніх нащадків. Коли два типи мають спільний ланцюг успадкування, їх можна використовувати почергово без помилок чи тверджень у своєму коді.</p><p>Згідно останнього малюнку, у нас може бути базовий прототип під назвою <code>Animal</code>, який визначає метод <code>makeNoise</code>. Кожен тип, що наслідує від цього прототипу, може переписати <code>makeNoise</code> таким чином, щоб він виконував власну функцію. Наприклад:</p><pre><code class="language-javascript">// Cтворимо приклади Dog та Animal
function Animal(){}
function Dog(){}

Animal.prototype.makeNoise = function(){
	console.log("Base noise");
};

// Більшість наших Animal мають 4. При потребі це можна змінити
Animal.prototype.legs = 4;

Dog.prototype = new Animal();

Dog.prototype.makeNoise = function(){
	console.log("Woof woof");  
};

var animal = new Animal();
var dog = new Dog();

animal.makeNoise(); // Base noise
dog.makeNoise();    // Woof woof — наслідок переписування
dog.legs;           // 4! — це було успадковано</code></pre><p><code>Dog</code> походить від <code>Animal</code> і може використовувати властивість <code>legs</code> за замовчуванням. Також він може мати власну імплементацію методу, визначеного в <code>Animal</code>, щоб мати власний звук.</p><p>Справжня сила поліморфізму полягає у спільності поведінки та можливості її зміни при потребі.</p><h1 id="--6"><strong>Висновки</strong></h1><p>Сподіваюсь, я зміг пояснити в чому полягають чотири опори об’єктно-орієнтованого програмування і те, як вони допомагають писати чистіший та практичніший код.</p><p>Якщо вам сподобалася ця стаття, можете підписатися на <a href="https://twitter.com/kealanparr">твіттер </a>автора, де він ділиться власними думками та новими статтями.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
