Інкапсуляція

Проходжу зараз туторіал по Rust, дійшов до розділу про інкапсуляцію.

Там як завжди: публічні поля у структур може змінювати будь-хто тому треба їх зробити приватними, а назовні вистромити гетери/аксесори.

Цю історію я чув ще з далекого 2004 коли починав програмувати на Java. Тоді про це не задумувався, ну дійсно, несолідно щоб ми писали user.name = "Vova", має бути user.setName("Vova"). ООП ж!

Більшість бібліотек теж дотримувалися цієї конвенції та очікували що на об'єктах будуть гетери та сетери. Так воно і тягнулося.

Але зараз я уважно ще раз прочитав що мені каже туторіал і подумав — WTF? Чому я повинен загортати значення в якісь додаткові методи, в чому сенс? «Безпека»? Не смішіть, безпека чого? Якщо треба, то все міняється в рантаймі без проблем.

Щодо того що значення зможе міняти будь-хто й будь-коли. Ну поміняє хтось значення так то вже будуть його проблеми, хіба ні? Сам собі злий буратіна, як казали в бородаті часи. Чи повинна бібліотека містити в собі механізми захисту від дурня? Навряд. Бібліотека повинна назовні віддати зрозумілий та невеликий фасад, та й все.

Валідація інпуту? Ну таке, валідується все зазвичай на рівні вище, хоча якщо ви працюєте з бібліотекою що дає API типу @NotNull та @Size(max = 64) то ок.

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

В чому сенс?


Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred