Це питання реалізації та імплікації . Властивості були в OOP, перш ніж C ++ або Java потрапили на сцену (вони були там, з деякою шорсткістю по краях, в Simula, і вони є основними для Smalltalk). Суб'єкти з властивостями концептуально відрізняються від значень із доданим кодом. Префікси get & set у деяких мовних конвенціях служать лише для розмивання води; вони дають вам знати про різницю між полями та властивостями, припускаючи, що доступ до полів можна отримати безпосередньо без get / set таким чином, що є ідіоматичним для мови, і це проникно.
Вся суть ООП полягає в тому, щоб ставитися до речей так, ніби вони були сутністю в "реальному" світі, не так, як структури з деяким кодом, змішаним. Іншому програмісту потрібно знати дуже-дуже мало про те, як я реалізував речі, і взагалі не повинні стосуватися того, які з різних значень, які вони можуть отримати та / або встановити, є реальними, а які - віртуальними. Якщо ви переходите через мій вектор, вам не потрібно знати, чи я зберігаю кут і величину чи реальні та уявні компоненти, внутрішні для векторного об'єкта. Якщо я зміню представлення у V2.0 своєї бібліотеки, воно взагалі не повинно впливати на ваш код (хоча ви, можливо, захочете скористатись новими класними функціями). Так само є властивості, які може мати суб'єкт господарювання, які залежать від даних, що знаходяться зовні, але які є безперечно властивостями з лексичної точки зору. Ви запитуєте людей "скільки вам років", а не "будь ласка, виконайте розрахунок, який розкриє мені ваш вік", навіть якщо ви знаєте, що дані, доступні цьому "об'єкту", - це дата народження (приватний непорушний член) та сьогодні дата (загальнодоступна екологічна властивість, яка автоматично збільшується, залежно від часового поясу, літнього часу та Міжнародної лінійки дат). Вік - це властивість, а не метод, хоча для отримання туди потрібен певний розрахунок, і він не може (за винятком іграшкових комп'ютерних зображень речей із штучно обмеженим життям) зберігатись як поле. незважаючи на те, що ви знаєте, що доступними даними "об'єкта" є дата народження (приватний непорушний член) та сьогоднішня дата (публічна, приростаюча екологічна властивість, залежна від часового поясу, літнього часу та міжнародної лінійки дат ). Вік - це властивість, а не метод, хоча для отримання туди потрібен певний розрахунок, і він не може (за винятком іграшкових комп'ютерних зображень речей із штучно обмеженим життям) зберігатись як поле. незважаючи на те, що ви знаєте, що доступними даними "об'єкта" є дата народження (приватний непорушний член) та сьогоднішня дата (публічна, приростаюча екологічна властивість, залежна від часового поясу, літнього часу та міжнародної лінійки дат ). Вік - це властивість, а не метод, хоча для отримання туди потрібен певний розрахунок, і він не може (за винятком іграшкових комп'ютерних зображень речей із штучно обмеженим життям) зберігатись як поле.
Замість того, щоб думати про властивості як про підлітку дитини поля та методи, це набагато задовольняє річ методів як спеціалізований вид властивості - речі, які можуть робити ваші сутності, а не речі, якими вони є. Інакше ви концептуально не маєте справу з об'єктами / сутностями, ви маєте справу з колекціями даних, до яких, як правило, до них доданий код. У implementaions можуть бути ідентичними, але наслідки різні.
Однак не слід говорити, що ця абстракція виходить вартістю. Якщо програміст, який використовує клас, не може визначити, отримує він чи вона доступ до даних під час їх збереження або отримання / встановлення значень, які потрібно обчислити, тоді буде рівень, на якому мова також обов'язково не визначена (і тому може вимагають, щоб все вимагало проміжного коду між аксесуарами / селекторами та значеннями). Немає нічого концептуально неправильного в "структурах з кодом" - вони, безумовно, можуть бути набагато ефективнішими, - але вони просочуються впровадженням всюди, і це одна з речей, яку OOP повинен усунути.