Es geht um Implementierung und Implikation . Die Eigenschaften befanden sich in OOP, bevor C ++ oder Java die Szene betraten (sie befanden sich in Simula mit einer gewissen Rauheit an den Rändern und sind für Smalltalk von grundlegender Bedeutung). Entitäten mit Eigenschaften unterscheiden sich konzeptionell von Werten mit angehängtem Code. Die get & set-Präfixe in einigen Sprachkonventionen dienen nur dazu, das Wasser zu trüben. Sie machen Sie auf den Unterschied zwischen Feldern und Eigenschaften aufmerksam, vorausgesetzt, dass auf Felder direkt zugegriffen werden kann, ohne dass get / set auf eine für die Sprache idiomatische und undichte Weise erfolgt.
Der springende Punkt bei OOP ist, Dinge so zu behandeln, als wären sie Entitäten in der "realen" Welt, nicht nur als Strukturen mit eingemischtem Code. Ein anderer Programmierer sollte sehr, sehr wenig über die Art und Weise wissen müssen, wie ich Dinge implementiert habe, und sollte sich überhaupt nicht darum kümmern, welche der verschiedenen Werte, die sie erhalten und / oder setzen dürfen, real und welche virtuell sind. Wenn Sie auf einen meiner Vektoren stoßen, sollten Sie nicht wissen müssen, ob ich Winkel und Größe oder reale und imaginäre Komponenten innerhalb des Vektorobjekts speichere. Wenn ich die Darstellung in V2.0 meiner Bibliothek ändere, sollte dies keinen Einfluss auf Ihren Code haben (obwohl Sie möglicherweise die coolen neuen Funktionen nutzen möchten). Ebenso gibt es Eigenschaften, die eine Entität haben kann und die von Daten außerhalb der Entität abhängen. aber die sind zweifellos Eigenschaften aus lexikalischer Sicht. Sie fragen die Leute "wie alt sind Sie", nicht "bitte führen Sie die Berechnung durch, die mir Ihr Alter offenbart", obwohl Sie wissen, dass die für dieses "Objekt" verfügbaren Daten das Geburtsdatum (ein privates unveränderliches Mitglied) und das heutige sind Datum (eine öffentliche, automatisch inkrementierende Umwelteigenschaft, abhängig von der Zeitzone, der Sommerzeit und der internationalen Datumsgrenze). Alter ist eine Eigenschaft, keine Methode, obwohl es einige Berechnungen erfordert, um dorthin zu gelangen, und nicht (außer in Spielzeugcomputer-Darstellungen von Dingen mit künstlich begrenzten Lebensdauern) als Feld gespeichert werden kann. obwohl Sie wissen, dass die für dieses "Objekt" verfügbaren Daten das Geburtsdatum (ein privates unveränderliches Mitglied) und das heutige Datum (eine öffentliche, automatisch inkrementierende Umwelteigenschaft, abhängig von der Zeitzone, der Sommerzeit und der internationalen Datumsgrenze) sind ). Alter ist eine Eigenschaft, keine Methode, obwohl es einige Berechnungen erfordert, um dorthin zu gelangen, und nicht (außer in Spielzeugcomputer-Darstellungen von Dingen mit künstlich begrenzten Lebensdauern) als Feld gespeichert werden kann. obwohl Sie wissen, dass die für dieses "Objekt" verfügbaren Daten das Geburtsdatum (ein privates unveränderliches Mitglied) und das heutige Datum (eine öffentliche, automatisch inkrementierende Umwelteigenschaft, abhängig von der Zeitzone, der Sommerzeit und der internationalen Datumsgrenze) sind ). Alter ist eine Eigenschaft, keine Methode, obwohl es einige Berechnungen erfordert, um dorthin zu gelangen, und nicht (außer in Spielzeugcomputer-Darstellungen von Dingen mit künstlich begrenzten Lebensdauern) als Feld gespeichert werden kann.
Anstatt Eigenschaften als das Bastardkind von Feldern und Methoden zu betrachten, ist es weitaus befriedigender, Methoden als eine spezielle Art von Eigenschaft zu betrachten - Dinge, die Ihre Entitäten tun können, anstatt Dinge, die sie sind. Andernfalls handelt es sich nicht konzeptionell um Objekte / Entitäten, sondern um Datensammlungen, an die zufällig Code angehängt ist. Die Implementierungen mögen identisch sein, aber die Implikationen sind unterschiedlich.
Es ist jedoch unnötig zu erwähnen, dass diese Abstraktion mit Kosten verbunden ist. Wenn ein Programmierer, der eine Klasse verwendet, nicht feststellen kann, ob er auf gespeicherte Daten zugreift oder Werte abruft / einstellt, die berechnet werden müssen, gibt es eine Ebene, auf der die Sprache ebenfalls notwendigerweise unsicher ist (und daher möglicherweise unsicher ist) erfordern, dass alles Code erfordert, um zwischen Accessoren / Selektoren und Werten zu wechseln). Es ist konzeptionell nichts Falsches an "Strukturen mit Code" - sie können sicherlich viel effizienter sein -, aber sie lecken überall die Implementierung, und das ist eines der Dinge, die OOP beseitigen soll.