Проходжу зараз туторіал по Rust, дійшов до розділу про інкапсуляцію.
Там як завжди: публічні поля у структур може змінювати будь-хто тому треба їх зробити приватними, а назовні вистромити гетери/аксесори.
Цю історію я чув ще з далекого 2004 коли починав програмувати на Java. Тоді про це не задумувався, ну дійсно, несолідно щоб ми писали user.name = "Vova"
, має бути user.setName("Vova")
. ООП ж!
Більшість бібліотек теж дотримувалися цієї конвенції та очікували що на об'єктах будуть гетери та сетери. Так воно і тягнулося.
Але зараз я уважно ще раз прочитав що мені каже туторіал і подумав — WTF? Чому я повинен загортати значення в якісь додаткові методи, в чому сенс? «Безпека»? Не смішіть, безпека чого? Якщо треба, то все міняється в рантаймі без проблем.
Щодо того що значення зможе міняти будь-хто й будь-коли. Ну поміняє хтось значення так то вже будуть його проблеми, хіба ні? Сам собі злий буратіна, як казали в бородаті часи. Чи повинна бібліотека містити в собі механізми захисту від дурня? Навряд. Бібліотека повинна назовні віддати зрозумілий та невеликий фасад, та й все.
Валідація інпуту? Ну таке, валідується все зазвичай на рівні вище, хоча якщо ви працюєте з бібліотекою що дає API типу @NotNull
та @Size(max = 64)
то ок.
Аргументів за тотальну інкапсуляцію у мене немає. Здається що це вірування яке лишилося з давніх часів, бо хтось так написав у книжці, зараз всі забули чому так треба, а накопичене легасі у бібліотеках не дає позбутися купи бойлерплейту, а на нових проєктах нові програмісти з ChatGPT генерують ще більше сміття ще швидшими темпами.
В чому сенс?
Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred