Termin „ stan ” może być używany w różnych sensach, które mogą nie być nawet podatne na precyzyjną definicję. Dlatego też ważne jest, aby zawierać definicję w swoim artykule, aby całkiem jasne, jak ty używali terminu. Poniżej nie oferuję unikalnej definicji stanu obiektu, ale raczej próbuję naszkicować wiele sposobów myślenia o nim, które mogą być odpowiednie w różnych kontekstach.
Najpierw jednak musisz pomyśleć, co rozumiesz przez „ obiekt ”: czy myślisz o obiekcie konceptualnym, tj. O jakiejś jednostce, którą próbujesz wymodelować, czy o instancji klasy w określonym programie; być może chcesz też pomyśleć o stanie zmiennej, która w różnych momentach może odnosić się do różnych obiektów lub systemu, może być dostępna za pośrednictwem określonego interfejsu użytkownika.
Część trudności w zdefiniowaniu stanu obiektu w OOP polega na tym, że kiedy modelujemy byty w określonym języku, język ten często nie pozwala nam odróżniać atrybutów obiektu, które są koncepcyjnie częścią tego samego bytu od innych, które nie są. Na przykład, połączona lista Car
będzie składać się z wielu Link
-obiektów, które zawierają wskaźniki do następnego (i być może poprzedniego), Link
chociaż koncepcyjnie lista jest pojedynczym obiektem; linki mogą być również osadzone wCar
-obiekty lub zawierają do nich wskaźniki, ale w tym przypadku połączone obiekty są koncepcyjnie odrębne, a nie częścią listy; jednak na liście ostatnich zmian zmiany mogą występować tylko na liście i być uważane za jej część. W tych różnych przypadkach musimy zdecydować, czy uważamy, że stan jednego obiektu obejmuje stan połączonych obiektów. Ponadto, Car
może mieć link do Registering_Authority
- prawdopodobnie nie uważamy, aby stan samochodu zmienił się, gdy organ rejestrujący zmieni adres URL swojej strony internetowej. O ile język implementacji nie pozwoli nam rozróżnić różnych rodzajów linków, nie będzie możliwe stworzenie ogólnej definicji stanu obiektu w odniesieniu do samego języka.
W „ zewnętrzny ” lub „ funkcjonalny ” stan można określić jako „jak się zachowuje”, ee.g. jak reaguje na wywołania metod lub interfejs użytkownika. W przypadku obiektu jako instancji klasy ta definicja zależy od typu, do którego obiekt jest postrzegany jako należący: postrzegany jako Circle
, kolorColoured_Circle
nie jest widoczny, a zatem nie ma znaczenia dla jego stanu. Trudność polega na tym, że „jak reaguje” może wymagać zdefiniowania w kategoriach zwracanych wartości, a te „wartości” mogą być stanami innych obiektów. Jednym ze sposobów sformalizowania tego jest stwierdzenie, że dwa stany obiektu są takie same, jeśli wszystkie możliwe przyszłe wykonania jakiegoś systemu, w którym jest on osadzony, skutkują tym samym odwzorowaniem między wejściami do tego systemu a wyjściami z niego. Ten system zamykający może wymagać systemu niezależnego, zdolnego do wykonywania niezależnego od środowiska; z drugiej strony można by pozwolić, aby był tak mały jak sam przedmiot. W każdym razie podejście matematyczne polega na zdefiniowaniu stanu jako klasy równoważności
Określenia „ wewnętrzny ” stan może być określony jako stan, w reprezentacji. Pierwsza próba jest pozornie okrągła, ale być może pomocna: „Wewnętrznym stanem obiektu jest stan jego członków”. W tym przypadku musimy zadbać o to, aby odróżnić znaczące aspekty reprezentacji od nieistotnych: na najniższym poziomie reprezentacja obiektu może równie dobrze obejmować adresy innych obiektów, ale jest mało prawdopodobne, aby rozważyć zmianę takiego adresu jako zmiana stanu. Z drugiej strony, zmiana stanu pamięci podręcznej dla wyniku zapytania, chociaż nie ma znaczenia dla stanu funkcjonalnego (jak opisano powyżej), będzie ważna przy rozważaniu testów wydajności.