Masz stan, kiedy kojarzysz wartości (liczby, ciągi, złożone struktury danych) z tożsamością i momentem.
Na przykład sama liczba 10 nie reprezentuje żadnego stanu: jest to tylko dobrze określona liczba i zawsze będzie sobą: liczba naturalna 10. Jako kolejny przykład ciąg „CZEŚĆ” jest ciągiem pięciu znaków, a jest to całkowicie opisane przez zawarte w nim znaki i kolejność ich pojawiania się. Za pięć milionów lat ciąg „CZEŚĆ” nadal będzie ciągiem „CZEŚĆ”: czysta wartość.
Aby mieć stan, musisz wziąć pod uwagę świat, w którym te czyste wartości są powiązane z jakimś rodzajem bytu, który posiada tożsamość . Tożsamość jest prymitywnym pomysłem: oznacza, że możesz rozróżnić dwie rzeczy, niezależnie od jakichkolwiek innych właściwości, jakie mogą mieć. Na przykład dwa samochody tego samego modelu, tego samego koloru ... to dwa różne samochody.
Biorąc pod uwagę te rzeczy z tożsamością, możesz do nich przypisać właściwości, opisane czystymi wartościami. Na przykład mój samochód ma właściwość niebieskiego. Możesz opisać ten fakt, łącząc parę
("colour", "blue")
do mojego samochodu. Para („kolor”, „niebieski”) to czysta wartość opisująca stan tego konkretnego samochodu.
Stan jest powiązany nie tylko z konkretnym bytem, ale także z określonym momentem w czasie. Można więc powiedzieć, że dzisiaj mój samochód ma stan
("colour", "blue")
Jutro przemaluję go na czarno i nowy stan będzie
("colour", "black")
Zauważ, że stan bytu może się zmienić, ale jego tożsamość nie zmienia się z definicji. Cóż, dopóki istota istnieje, oczywiście: samochód może zostać stworzony i zniszczony, ale zachowa swoją tożsamość przez całe życie. Mówienie o tożsamości czegoś, co jeszcze nie istnieje, nie ma sensu.
Jeśli wartości właściwości dołączonych do danej jednostki zmieniają się w czasie, mówisz, że stan tej jednostki jest zmienny . W przeciwnym razie mówisz, że państwo jest niezmienne .
Najczęstszą implementacją jest przechowywanie stanu bytu w pewnym rodzaju zmiennych (zmienne globalne, zmienne składowe obiektu), tj. Do przechowywania bieżącej migawki stanu. Zmienny stan jest następnie implementowany przy użyciu przypisania: każda operacja przypisania zastępuje poprzednią migawkę nową. To rozwiązanie zwykle używa lokalizacji pamięci do przechowywania bieżącej migawki. Zastąpienie lokalizacji pamięci jest destrukcyjną operacją, która zastępuje migawkę nową. ( Tutaj można znaleźć ciekawą rozmowę na temat tego podejścia do programowania zorientowanego na miejsce ).
Alternatywą jest przeglądanie kolejnych stanów (historii) bytu jako strumienia (być może nieskończonej sekwencji) wartości, patrz np. Rozdział 3 SICP . W takim przypadku każda migawka jest przechowywana w innym miejscu w pamięci, a program może jednocześnie badać różne migawki. Nieużywane migawki można zbierać, gdy nie są już potrzebne.
Zalety / wady obu podejść
- Podejście 1 zużywa mniej pamięci i pozwala na bardziej efektywne tworzenie nowej migawki, ponieważ nie wymaga kopiowania.
- Podejście 1 domyślnie wypycha nowy stan do wszystkich części programu zawierających odniesienie, podejście 2 potrzebowałoby jakiegoś mechanizmu do wypchnięcia migawki do swoich obserwatorów, np. W formie zdarzenia.
- Podejście 2 może pomóc w zapobieganiu niespójnym błędom stanu (np. Częściowym aktualizacjom stanu): definiując jawną funkcję, która tworzy nowy stan ze starego, łatwiej jest odróżnić migawki tworzone w różnych momentach.
- Podejście 2 jest bardziej modułowe, ponieważ umożliwia łatwe tworzenie widoków stanu, które są niezależne od samego stanu, np. Przy użyciu funkcji wyższego rzędu, takich jak
map
i filter
.