Jest to kwestia implementacji kontra implikacji . Właściwości były w OOP, zanim C ++ lub Java pojawiły się na scenie (były tam, z pewną szorstkością wokół krawędzi, w Simula i są fundamentalne dla Smalltalk). Elementy z właściwościami różnią się koncepcyjnie od wartości z dołączonym kodem. Prefiksy get & set w niektórych konwencjach językowych służą jedynie do mętnienia wód; uświadamiają ci różnicę między polami i właściwościami, zakładając, że do pól można uzyskać bezpośredni dostęp bez pobierania / ustawiania w sposób idiomatyczny dla języka i to jest nieszczelne.
Cały sens OOP polega na traktowaniu rzeczy tak, jakby były bytami w „prawdziwym” świecie, a nie tylko strukturami z pomieszanym kodem. Inny programista powinien wiedzieć bardzo, bardzo mało o tym, jak zaimplementowałem rzeczy, i nie powinny w ogóle martwić się, które z różnych wartości, które mogą otrzymać i / lub ustawić, są prawdziwe, a które wirtualne. Jeśli natkniesz się na mój wektor, nie powinieneś wiedzieć, czy przechowuję kąt i wielkość, czy rzeczywiste i urojone komponenty wewnątrz obiektu wektorowego. Jeśli zmienię reprezentację w wersji 2.0 mojej biblioteki, nie powinno to w ogóle wpływać na twój kod (choć możesz chcieć skorzystać z nowych, fajnych funkcji). Podobnie istnieją właściwości, które jednostka może mieć, które zależą od danych zewnętrznych w stosunku do jednostki, ale które są niewątpliwie właściwościami z leksykalnego punktu widzenia. Pytasz ludzi „ile masz lat”, a nie „proszę wykonać obliczenia, które ujawnią mi twój wiek”, nawet jeśli wiesz, że dane dostępne dla tego „obiektu” to data urodzenia (prywatny niezmienny członek) i dzisiejsza data (publiczna, automatycznie zwiększająca wartość własność środowiska, zależna od strefy czasowej, czasu letniego i Międzynarodowej Linii Danych). Wiek jest właściwością, a nie metodą, chociaż dotarcie do niego wymaga pewnych obliczeń i nie może (z wyjątkiem komputerowych zabawek przedstawień rzeczy o sztucznie ograniczonym czasie życia) być przechowywany jako pole. nawet jeśli wiesz, że dane dostępne dla tego „obiektu” to data urodzenia (prywatny niezmienny członek) i dzisiejsza data (publiczna, automatycznie zwiększająca się właściwość środowiskowa, zależna od strefy czasowej, czasu letniego i międzynarodowej linii dat) ). Wiek jest właściwością, a nie metodą, chociaż dotarcie do niego wymaga pewnych obliczeń i nie może (z wyjątkiem komputerowych zabawek przedstawień rzeczy o sztucznie ograniczonym czasie życia) być przechowywany jako pole. nawet jeśli wiesz, że dane dostępne dla tego „obiektu” to data urodzenia (prywatny niezmienny członek) i dzisiejsza data (publiczna, automatycznie zwiększająca się właściwość środowiskowa, zależna od strefy czasowej, czasu letniego i międzynarodowej linii dat ). Wiek jest właściwością, a nie metodą, chociaż dotarcie do niego wymaga pewnych obliczeń i nie może (z wyjątkiem komputerowych zabawek przedstawień rzeczy o sztucznie ograniczonym czasie życia) być przechowywany jako pole.
Zamiast myśleć o właściwościach jako draniu dzieci pól i metod, o wiele bardziej satysfakcjonuje to, że metody są wyspecjalizowanym rodzajem własności - rzeczy, które twoje istoty mogą zrobić, a nie rzeczy, którymi są. W przeciwnym razie nie zajmujesz się obiektami / obiektami koncepcyjnie, masz do czynienia z kolekcjami danych, do których dołączono kod. W implementaions mogą być identyczne, ale konsekwencje są różne.
Nie trzeba jednak mówić, że ta abstrakcja wiąże się z pewnymi kosztami. Jeśli programista korzystający z klasy nie jest w stanie stwierdzić, czy uzyskuje dostęp do danych w trakcie ich przechowywania, czy też pobiera / ustawia wartości, które należy obliczyć, wówczas poziom, na którym język jest koniecznie niepewny (i dlatego może wymagają, aby wszystko wymagało kodu pośredniczącego między akcesoriami / selektorami a wartościami). Nie ma nic koncepcyjnie złego w „strukturach z kodem” - z pewnością mogą być znacznie wydajniejsze - ale przeciekają implementację wszędzie, i to jest jedna z rzeczy, które OOP ma wyeliminować.