Это вопрос реализации, а не последствий . Свойства были в ООП до того, как C ++ или Java появились на сцене (они были там, с некоторой шероховатостью по краям, в Simula, и они являются фундаментальными для Smalltalk). Объекты со свойствами концептуально отличаются от значений с прикрепленным кодом. Префиксы get & set в некоторых языковых соглашениях служат только для мутной воды; они сообщают вам о разнице между полями и свойствами, предполагая, что к полям можно обращаться напрямую без получения / установки таким образом, который идиоматичен для языка, и это утечка.
Весь смысл ООП состоит в том, чтобы относиться к вещам как к сущностям в «реальном» мире, а не просто как к структурам со смешанным кодом. Другой программист должен знать очень, очень мало о том, как я реализовал вещи, и не должно быть никакого отношения к тому, какие из различных значений, которые им разрешено получать и / или устанавливать, являются реальными, а какие - виртуальными. Если вы столкнетесь с моим вектором, вам не нужно будет знать, храню ли я угол и величину или реальные и мнимые компоненты, внутренние для векторного объекта. Если я изменю представление в V2.0 моей библиотеки, это вообще не должно повлиять на ваш код (хотя вы можете воспользоваться новыми замечательными функциями). Точно так же существуют свойства, которые объект может иметь, которые зависят от данных, внешних по отношению к объекту, но которые, несомненно, являются свойствами с лексической точки зрения. Вы спрашиваете людей «сколько вам лет», а не «пожалуйста, выполните расчеты, которые покажут мне ваш возраст», даже если вы знаете, что для этого «объекта» доступны данные о дате рождения (частный неизменный член) и сегодняшнем дне. дата (общедоступное, автоматически увеличивающееся свойство среды, зависящее от часового пояса, летнего времени и международной линии дат). Возраст - это свойство, а не метод, даже если для его достижения требуются некоторые вычисления, и он не может (кроме игрушечных компьютерных представлений вещей с искусственно ограниченным временем жизни) сохраняться в виде поля. даже если вы знаете, что для этого «объекта» доступны данные о дате рождения (частный неизменяемый элемент) и сегодняшней дате (общедоступное, автоматически увеличивающееся свойство среды, зависящее от часового пояса, летнего времени и международной строки даты ). Возраст - это свойство, а не метод, даже если для его достижения требуются некоторые вычисления, и он не может (кроме игрушечных компьютерных представлений вещей с искусственно ограниченным временем жизни) сохраняться в виде поля. даже если вы знаете, что для этого «объекта» доступны данные о дате рождения (частный неизменяемый элемент) и сегодняшней дате (общедоступное, автоматически увеличивающееся свойство среды, зависящее от часового пояса, летнего времени и международной строки даты ). Возраст - это свойство, а не метод, даже если для его достижения требуются некоторые вычисления, и он не может (кроме игрушечных компьютерных представлений вещей с искусственно ограниченным временем жизни) сохраняться в виде поля.
Вместо того, чтобы думать о свойствах как о внебрачных дочерних элементах полей и методов, гораздо приятнее воспринимать методы как специализированный вид собственности - вещи, которые могут делать ваши сущности, а не вещи, которыми они являются. В противном случае вы концептуально не имеете дело с объектами / сущностями, вы имеете дело с коллекциями данных, к которым прикреплен код. В implementaions могут быть идентичными, но последствия разные.
Однако не стоит говорить, что эта абстракция обходится дорого. Если программист, использующий класс, не может определить, обращается ли он или она к данным, когда они хранятся, или получает / устанавливает значения, которые необходимо вычислить, тогда будет уровень, на котором язык также обязательно будет неопределенным (и, следовательно, может требует, чтобы все требовало кода для промежуточного соединения между аксессорами / селекторами и значениями). Нет ничего концептуально неправильного в «структурах с кодом» - они, безусловно, могут быть гораздо более эффективными - но они повсеместно пропускают реализацию, и это одна из вещей, которую ООП должен устранить.