É uma questão de implementação versus implicação . As propriedades estavam no OOP antes de C ++ ou Java entrarem em cena (elas estavam lá, com alguma rugosidade nas bordas, no Simula, e são fundamentais para o Smalltalk). Entidades com propriedades são conceitualmente diferentes dos valores com código anexado. Os prefixos get & set em algumas convenções de idiomas servem apenas para enlamear as águas; eles informam a diferença entre campos e propriedades, supondo que os campos possam ser acessados diretamente sem obter / definir de uma maneira idiomática para o idioma e com vazamento.
O objetivo principal do OOP é tratar as coisas como se fossem entidades no mundo "real", não apenas como estruturas com algum código misturado. Outro programador deve precisar saber muito, muito pouco, sobre como implementei as coisas, e não deve se preocupar com quais dos vários valores que eles têm permissão para obter e / ou definir são reais e virtuais. Se você encontrar um vetor meu, não precisará saber se estou armazenando ângulo e magnitude ou componentes reais e imaginários internos ao objeto vetorial. Se eu alterar a representação na V2.0 da minha biblioteca, isso não deve afetar o seu código (embora você possa aproveitar os novos recursos interessantes). Da mesma forma, existem propriedades que uma entidade pode ter que dependem de dados externos à entidade, mas que são indubitavelmente propriedades do ponto de vista lexical. Você pergunta às pessoas "quantos anos você tem", e não "faça o cálculo que me revelará sua idade", mesmo sabendo que os dados disponíveis para esse "objeto" são a data de nascimento (um membro imutável privado) e a data de hoje date (uma propriedade ambiental pública com incremento automático, dependente do fuso horário, horário de verão e Linha Internacional de Data). A idade é uma propriedade, não um método, mesmo que seja necessário algum cálculo para chegar lá e não possa (exceto em representações de brinquedos de coisas com vida útil limitada artificialmente) ser armazenada como um campo. mesmo que você saiba que os dados disponíveis para esse "objeto" são a data de nascimento (um membro imutável privado) e a data de hoje (uma propriedade ambiental pública com incremento automático, dependente do fuso horário, horário de verão e Linha Internacional de Data ) A idade é uma propriedade, não um método, mesmo que seja necessário algum cálculo para chegar lá e não possa (exceto em representações de brinquedos de coisas com vida útil limitada artificialmente) ser armazenada como um campo. mesmo que você saiba que os dados disponíveis para esse "objeto" são a data de nascimento (um membro imutável privado) e a data de hoje (uma propriedade ambiental pública com incremento automático, dependente do fuso horário, horário de verão e Linha Internacional de Data ) A idade é uma propriedade, não um método, mesmo que seja necessário algum cálculo para chegar lá e não possa (exceto em representações de brinquedos de coisas com vida útil limitada artificialmente) ser armazenada como um campo.
Em vez de pensar em propriedades como filho bastardo de campos e métodos, é muito mais gratificante considerar os métodos como um tipo especializado de propriedade - coisas que suas entidades podem fazer em vez de coisas que são. Caso contrário, você não está lidando conceitualmente com objetos / entidades, mas com coleções de dados que possuem código anexado a elas. As implementações podem ser idênticas, mas as implicações são diferentes.
Não é necessário dizer, no entanto, que essa abstração tem um custo. Se um programador que usa uma classe não pode dizer se está acessando dados como estão armazenados ou obtendo / configurando valores que precisam ser calculados, haverá um nível em que o idioma também é necessariamente incerto (e, portanto, pode requer que tudo exija código para intermediar entre acessadores / seletores e valores). Não há nada conceitualmente errado com "estruturas com código" - elas certamente podem ser muito mais eficientes - mas vazam a implementação por todo o lado, e essa é uma das coisas que o OOP deve eliminar.