Z naciskiem na niezmienność w języku programowania jak Scala (unikanie "var"), oznacza to "metody modyfikujące stan" w moim obiekcie będą musiały zwrócić kopię instancji (z nowy stan)?Projektowanie z niezmiennością (w Scali)
Weźmy pod uwagę żółwia. Chciałbym przenieść żółwia tak:
val turtle = new Turtle(0, 0, "north")
val turtle2 = turtle.turnLeft().forward(5).turnRight().backward(2)
Tutaj turtle2 nie wskazują na tej samej instancji Turtle (są dwie oddzielne instancje). W rzeczywistości w tej sekwencji ruchów powstały 4 obiekty pośrednie. W ten sposób zaimplementowałem metodę turnLeft, na przykład:
def turnLeft {
self.copy(orientation = self.orientation match {
case "north" => "west"
case "east" => "north"
case "south" => "east"
case "west" => "south"
})
}
Czy to właściwe podejście do projektowania?
Jeśli tak, jak wydajne/nieefektywne jest to (tworzenie nowego obiektu przy każdym wywołaniu metody)? Jeśli nie, jaka byłaby właściwa? Co jest złego/brakuje mi w moim rozumieniu aspektu niezmienności (a może ogólnie programowania funkcjonalnego)?
Dzięki z góry, Raka
Myślę, że Twój kod wygląda poprawnie (z niezmiennego POV). Jeśli chodzi o efektywność, to myślę, że na pewno nie będzie tak szybki, jak pojedynczy zmienny wstępnie przydzielony obiekt. Ogólny wpływ będzie zależeć od tego, jak szybko i często chcesz przenieść żółwia. –
Dzięki, zauważę to. –