1

Тема: Питання про принцип відкритості-закритості

Добрий день.

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

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

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

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

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

Подякували: Firefox is dead1

2

Re: Питання про принцип відкритості-закритості

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

Свої конкретні класи ви реєструєте в DI-контейнері і споживачі знають лише про інтерфейси, які залишаються незмінними.

3

Re: Питання про принцип відкритості-закритості

Yola написав:

А я розумію це ось так...

Зроз, але суть питання не в тому була.

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

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

4 Востаннє редагувалося wander (08.04.2023 22:41:45)

Re: Питання про принцип відкритості-закритості

FakiNyan написав:

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

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

Тобто все вірно

FakiNyan написав:

Класи мають бути закритими для змін, але відкритими для розширення.

Закриті для змін - тобто наявний код слід змінювати лише для виправлення помилок.
Відкритими для розширення - тобто нові сутності можуть додавати та/чи повторно використовувати наявний функціонал.

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

FakiNyan написав:

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

А, ось це більше виглядає як: "опишіть у двох словах, що таке OCP". З однієї сторони це так, але в реальності ви ніколи не можете знати, що може статися. І іноді вам все ж доведеться змінювати ваші сутності.

Подякували: FakiNyan1

5

Re: Питання про принцип відкритості-закритості

Зроз.