Chodzi o skutki uboczne.
Pytanie o var1
to, czy jest częścią państwa, nie ma sensu tego pytania. Jasne, jeśli var1
musi się utrzymywać, musi to być instancja. Można zastosować dowolne podejście, niezależnie od tego, czy konieczne jest wytrwałość.
Podejście niepożądane
Niektóre zmienne instancji są używane tylko do komunikacji między prywatnymi metodami od wywołania do wywołania. Tego rodzaju zmienną instancji można zrefaktoryzować, ale nie musi tak być. Czasami rzeczy są z nimi wyraźniejsze. Ale nie jest to pozbawione ryzyka.
Wypuszczasz zmienną z jej zakresu, ponieważ jest ona używana w dwóch różnych zakresach prywatnych. Nie dlatego, że jest potrzebny w zakresie, w którym go umieszczasz. To może być mylące. „Globale są złe!” poziom dezorientacji. To może działać, ale po prostu nie będzie dobrze skalować. Działa tylko w małych. Żadnych dużych przedmiotów. Bez długich łańcuchów spadkowych. Nie powoduj efektu jo-jo .
Podejście funkcjonalne
Teraz, nawet jeśli var1
musi się utrzymywać, nic nie mówi, że musisz użyć, jeśli dla każdej przejściowej wartości, którą może przyjąć, zanim osiągnie stan, który chcesz zachować między połączeniami publicznymi. Oznacza to, że nadal możesz ustawić var1
instancję, używając jedynie funkcjonalnych metod.
Więc część stanu, czy nie, nadal możesz zastosować jedno z dwóch podejść.
W tych przykładach „var1” jest tak enkapsulowane, że oprócz tego, że debugger wie, że istnieje. Zgaduję, że zrobiłeś to celowo, ponieważ nie chcesz nas uprzedzić. Na szczęście nie obchodzi mnie które.
Ryzyko skutków ubocznych
To powiedziawszy, wiem skąd pochodzi twoje pytanie. Pracowałam pod nędznym yo yo „ing dziedziczenie że mutuje zmiennej instancji na wielu poziomach w różnych metod i znika squirrelly próbując go śledzić. To jest ryzyko.
To ból popycha mnie do bardziej funkcjonalnego podejścia. Metoda może udokumentować swoje zależności i dane wyjściowe w sygnaturze. To potężne, jasne podejście. Pozwala także zmienić to, co przekazujesz prywatną metodą, dzięki czemu jest łatwiejsza do wykorzystania w klasie.
Pozytywne skutki uboczne
To także ogranicza. Czyste funkcje nie mają skutków ubocznych. To może być dobra rzecz, ale nie jest zorientowana obiektowo. Dużą częścią orientacji obiektowej jest możliwość odniesienia się do kontekstu poza metodą. Robienie tego bez przeciekania globali tutaj i po nich jest siłą OOP. Mam elastyczność globalną, ale jest ładnie zawarta w klasie. Mogę wywołać jedną metodę i mutować każdą zmienną instancji na raz, jeśli chcę. Jeśli to zrobię, jestem zobowiązany przynajmniej podać nazwę metody, która wyjaśnia, co się dzieje, aby ludzie nie byli zaskoczeni, gdy to się stanie. Komentarze również mogą pomóc. Czasami te komentarze są sformalizowane jako „warunki postowe”.
Minusem funkcjonalnych metod prywatnych
Podejście funkcjonalne wyjaśnia niektóre zależności. Chyba że jesteś w czysto funkcjonalnym języku, nie może wykluczyć ukrytych zależności. Nie wiesz, patrząc tylko na sygnaturę metod, że nie ukrywa to przed tobą efektu ubocznego w pozostałej części kodu. Po prostu nie.
Post warunkowe
Jeśli ty i wszyscy inni w zespole niezawodnie udokumentuje skutki uboczne (warunki przed / po) w komentarzach, zysk z podejścia funkcjonalnego jest znacznie mniejszy. Tak, wiem, śnij dalej.
Wniosek
Osobiście wolę funkcjonalne metody prywatne w obu przypadkach, jeśli mogę, ale szczerze mówiąc jest to głównie dlatego, że te komentarze warunkowe przed / po warunkowe efekty uboczne nie powodują błędów kompilatora, gdy są przestarzałe lub gdy metody są wywoływane w niewłaściwym porządku. Chyba że naprawdę potrzebuję elastyczności efektów ubocznych, wolałbym tylko wiedzieć, że coś działa.