Es una cuestión de implementación versus implicación . Las propiedades estaban en OOP antes de que C ++ o Java llegaran a la escena (estaban allí, con cierta aspereza en los bordes, en Simula, y son fundamentales para Smalltalk). Las entidades con propiedades son conceptualmente diferentes de los valores con código adjunto. Los prefijos get & set en algunas convenciones de idiomas solo sirven para enturbiar las aguas; te hacen consciente de la diferencia entre campos y propiedades, suponiendo que se puede acceder a los campos directamente sin obtener / establecer de una manera que sea idiomática para el lenguaje, y eso es permeable.
El objetivo de OOP es tratar las cosas como si fueran entidades en el mundo "real", no solo como estructuras con algún código mezclado. Otro programador debería necesitar saber muy, muy poco sobre la forma en que he implementado las cosas, y no debería preocuparse en absoluto con cuál de los diversos valores que se les permite obtener y / o establecer son reales y cuáles son virtuales. Si se encuentra con un vector mío, no debería necesitar saber si estoy almacenando ángulos y magnitudes o componentes reales e imaginarios internos del objeto vectorial. Si cambio la representación en V2.0 de mi biblioteca, no debería afectar su código en absoluto (aunque es posible que desee aprovechar las nuevas características interesantes). Del mismo modo, hay propiedades que una entidad podría tener que dependen de datos externos a la entidad, pero que sin duda son propiedades desde un punto de vista léxico. Le preguntas a la gente "cuántos años tienes", no "realiza el cálculo que me revelará tu edad", aunque sabes que los datos disponibles para ese "objeto" son la fecha de nacimiento (un miembro privado inmutable) y el de hoy fecha (una propiedad ambiental pública, de incremento automático, que depende de la zona horaria, el horario de verano y la línea de fecha internacional). La edad es una propiedad, no un método, a pesar de que se necesitan algunos cálculos para llegar allí y no se puede almacenar (como en las representaciones de la computadora de juguete de cosas con vidas limitadas artificialmente) como un campo. a pesar de que sabe que los datos disponibles para ese "objeto" son la fecha de nacimiento (un miembro inmutable privado) y la fecha de hoy (una propiedad ambiental pública que se incrementa automáticamente, que depende de la zona horaria, el horario de verano y la línea de fecha internacional ) La edad es una propiedad, no un método, a pesar de que se necesitan algunos cálculos para llegar allí y no se puede almacenar (como en las representaciones de la computadora de juguete de cosas con vidas limitadas artificialmente) como un campo. a pesar de que sabe que los datos disponibles para ese "objeto" son la fecha de nacimiento (un miembro inmutable privado) y la fecha de hoy (una propiedad ambiental pública que se incrementa automáticamente, que depende de la zona horaria, el horario de verano y la línea de fecha internacional ) La edad es una propiedad, no un método, a pesar de que se necesitan algunos cálculos para llegar allí y no se puede almacenar (como en las representaciones de la computadora de juguete de cosas con vidas limitadas artificialmente) como un campo.
En lugar de pensar en las propiedades como el hijo bastardo de los campos y métodos, es mucho más satisfactorio considerar a los métodos como un tipo especializado de propiedad, cosas que sus entidades pueden hacer en lugar de cosas que son. De lo contrario, no se trata conceptualmente de objetos / entidades, se trata de colecciones de datos que tienen un código adjunto. Las implementaciones pueden ser idénticas, pero las implicaciones son diferentes.
Sin embargo, debería ser innecesario decir que esta abstracción tiene un costo. Si un programador que usa una clase no puede determinar si está accediendo a los datos tal como están almacenados o si está obteniendo / estableciendo valores que deben calcularse, entonces habrá un nivel en el que el lenguaje también es necesariamente incierto (y, por lo tanto, puede requieren que todo requiera código para intermediar entre accesores / selectores y valores). No hay nada conceptualmente incorrecto con las "estructuras con código", sin duda pueden ser mucho más eficientes, pero filtran la implementación por todas partes, y esa es una de las cosas que se supone que debe eliminar OOP.