È una questione di implementazione contro implicazioni . Le proprietà erano in OOP prima che C ++ o Java arrivassero sulla scena (erano lì, con alcune rugosità intorno ai bordi, in Simula, e sono fondamentali per Smalltalk). Le entità con proprietà sono concettualmente diverse dai valori con il codice allegato. I prefissi get & set in alcune convenzioni linguistiche servono solo a confondere le acque; ti rendono consapevole della differenza tra campi e proprietà, supponendo che sia possibile accedere direttamente ai campi senza ottenere / impostare in un modo idiomatico per la lingua, e che perde.
Il punto centrale di OOP è trattare le cose come se fossero entità nel mondo "reale", non solo come strutture con un po 'di codice mischiato. Un altro programmatore dovrebbe avere bisogno di sapere molto, molto poco sul modo in cui ho implementato le cose, e non dovrebbe preoccuparsi affatto di quale dei vari valori sono autorizzati a ottenere e / o impostare sono reali e quali sono virtuali. Se ti imbatti in un mio vettore, non dovresti sapere se sto memorizzando angolo e magnitudine o componenti reali e immaginari interni all'oggetto vettoriale. Se cambio la rappresentazione in V2.0 della mia libreria, ciò non dovrebbe influire affatto sul tuo codice (anche se potresti voler sfruttare le nuove fantastiche funzionalità). Allo stesso modo, ci sono proprietà che un'entità potrebbe avere che dipendono da dati esterni all'entità, ma che sono indubbiamente proprietà dal punto di vista lessicale. Chiedi alle persone "quanti anni hai", non "per favore esegui il calcolo che mi rivelerà la tua età", anche se sai che i dati disponibili per quell'oggetto sono la data di nascita (un membro immutabile privato) e oggi data (una proprietà ambientale pubblica, auto-incrementante, dipendente dal fuso orario, dall'ora legale e dalla linea di data internazionale). L'età è una proprietà, non un metodo, anche se ci vuole un po 'di calcolo per arrivarci e non può (tranne che nelle rappresentazioni al computer del giocattolo rappresentazioni di cose con tempi di vita artificialmente limitati) essere memorizzate come un campo. anche se sai che i dati disponibili per quell'oggetto sono la data di nascita (un membro immutabile privato) e la data odierna (una proprietà ambientale pubblica, auto-incrementante, dipendente dal fuso orario, dall'ora legale e dalla linea di data internazionale ). L'età è una proprietà, non un metodo, anche se ci vuole un po 'di calcolo per arrivarci e non può (tranne che nelle rappresentazioni al computer del giocattolo rappresentazioni di cose con tempi di vita artificialmente limitati) essere memorizzate come un campo. anche se sai che i dati disponibili per quell'oggetto sono la data di nascita (un membro immutabile privato) e la data odierna (una proprietà ambientale pubblica, auto-incrementante, dipendente dal fuso orario, dall'ora legale e dalla linea di data internazionale ). L'età è una proprietà, non un metodo, anche se ci vuole un po 'di calcolo per arrivarci e non può (tranne che nelle rappresentazioni al computer del giocattolo rappresentazioni di cose con tempi di vita artificialmente limitati) essere memorizzate come un campo.
Piuttosto che pensare alle proprietà come al figlio bastardo di campi e metodi, è molto più soddisfacente alla cosa dei metodi come a un tipo specializzato di proprietà - cose che le tue entità possono fare piuttosto che cose che sono. Altrimenti non hai a che fare concettualmente con oggetti / entità, hai a che fare con raccolte di dati a cui è capitato di avere del codice. Le implementazioni possono essere identiche, ma le implicazioni sono diverse.
Inutile dire, tuttavia, che questa astrazione ha un costo. Se un programmatore che utilizza una classe non è in grado di dire se sta accedendo ai dati man mano che vengono archiviati o ottenendo / impostando valori che devono essere calcolati, allora ci sarà un livello al quale anche la lingua è necessariamente incerta (e quindi potrebbe richiedono che tutto richieda un codice intermedio tra accessori / selettori e valori). Non c'è nulla di concettualmente sbagliato nelle "strutture con codice" - possono certamente essere molto più efficienti - ma perdono l'implementazione ovunque, e questa è una delle cose che OOP dovrebbe eliminare.