Moim skromnym zdaniem, generalnie jest to coś, czego należy unikać głównie w przypadku kodu produkcyjnego, ponieważ generalnie nie kusi cię to, z wyjątkiem sporadycznych funkcji wykonujących różne zadania. Zwykle robię to w kodzie złomu używanym do testowania rzeczy, ale nie znajduję pokusy, aby to zrobić w kodzie produkcyjnym, w którym wcześniej zastanawiałem się, co powinna zrobić każda funkcja, ponieważ wtedy funkcja będzie naturalnie mieć bardzo ograniczony zakres w odniesieniu do jego stanu lokalnego.
Nigdy tak naprawdę nie widziałem przykładów użycia anonimowych bloków w ten sposób (nie obejmujących warunkowych, try
bloku dla transakcji itp.) W celu znacznego ograniczenia zakresu w funkcji, która nie nasuwa pytania, dlaczego nie może podzielić dalej na prostsze funkcje o zmniejszonych zakresach, jeśli faktycznie skorzystało ono praktycznie z prawdziwego punktu widzenia SE z anonimowych bloków. Zwykle jest to eklektyczny kod, który robi wiele luźno powiązanych lub bardzo niezwiązanych ze sobą rzeczy, w których najbardziej kusi nas, aby po to sięgnąć.
Na przykład, jeśli próbujesz to zrobić, aby ponownie użyć zmiennej o nazwie count
, sugeruje to, że liczysz dwie różne rzeczy. Jeśli nazwa zmiennej ma być tak krótka jak count
, to sensowne jest dla mnie powiązanie jej z kontekstem funkcji, która potencjalnie może po prostu liczyć jeden rodzaj rzeczy. Następnie możesz natychmiast spojrzeć na nazwę funkcji i / lub dokumentację, zobaczyć count
i od razu wiedzieć, co to znaczy w kontekście tego, co robi funkcja, bez analizowania całego kodu. Często nie znajduję dobrego argumentu dla funkcji liczącej dwie różne rzeczy, które ponownie wykorzystują tę samą nazwę zmiennej w sposób, który sprawia, że anonimowe zakresy / bloki są tak atrakcyjne w porównaniu z alternatywami. To nie tak sugeruje, że wszystkie funkcje muszą liczyć tylko jedną rzecz. JA'korzyści inżynieryjne dla funkcji wykorzystującej tę samą nazwę zmiennej do zliczenia dwóch lub więcej rzeczy i używania anonimowych bloków w celu ograniczenia zakresu każdej pojedynczej liczby. Jeśli funkcja jest prosta i przejrzysta, to nie koniec świata, aby mieć dwie różnie nazwane zmienne zliczające, przy czym pierwsza może mieć kilka linii widoczności więcej, niż jest to wymagane. Takie funkcje zasadniczo nie są źródłem błędów pozbawionych takich anonimowych bloków, aby jeszcze bardziej ograniczyć minimalny zakres zmiennych lokalnych.
Nie jest to sugestia dla zbytecznych metod
Nie ma to sugerować, że wymusisz tworzenie metod w celu zmniejszenia zasięgu. Jest to zapewne tak samo złe lub złe, i to, co sugeruję, nie powinno wymagać bardziej niezręcznych prywatnych metod „pomocnika” niż anonimowych zakresów. To za dużo myśli o obecnym kodzie i jak zmniejszyć zakres zmiennych, niż o koncepcyjnym rozwiązaniu problemu na poziomie interfejsu w sposób zapewniający naturalnie czystą, krótką widoczność lokalnych stanów funkcji bez głębokiego zagnieżdżania bloków i ponad 6 poziomów wcięcia. Zgadzam się z Bruno, że możesz utrudnić czytelność kodu, mocno wciskając 3 wiersze kodu do funkcji, ale zaczyna się to od założenia, że rozwijasz funkcje, które tworzysz w oparciu o istniejącą implementację, zamiast projektować funkcje bez angażowania się w implementacje. Jeśli robisz to w ten drugi sposób, nie ma potrzeby anonimowych bloków, które nie służą żadnemu celowi poza ograniczeniem zakresu zmiennej w ramach danej metody, chyba że próbujesz gorliwie zmniejszyć zakres zmiennej tylko o kilka mniej linii nieszkodliwego kodu gdzie egzotyczne wprowadzenie tych anonimowych bloków prawdopodobnie wnosi tyle samo intelektualnego obciążenia, ile usuwają.
Próbując jeszcze bardziej zmniejszyć minimalne zakresy
Jeśli warto było ograniczyć zakresy zmiennych lokalnych do absolutnego minimum, wówczas powinna istnieć szeroka akceptacja takiego kodu:
ImageIO.write(new Robot("borg").createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())), "png", new File(Db.getUserId(User.handle()).toString()));
... ponieważ powoduje to minimalną widoczność stanu, nawet nie tworząc zmiennych odnoszących się do nich w pierwszej kolejności. Nie chcę być tak dogmatyczny, ale tak naprawdę uważam, że pragmatycznym rozwiązaniem jest unikanie anonimowych bloków, gdy jest to możliwe, tak jak unikanie monstrualnej linii kodu powyżej i jeśli wydają się one absolutnie konieczne w kontekście produkcyjnym z perspektywa poprawności i utrzymywania niezmienników w obrębie funkcji, to zdecydowanie uważam, że sposób organizacji kodu w funkcje i projektowania interfejsów jest warty ponownego zbadania. Oczywiście, jeśli twoja metoda ma 400 linii długości i zasięg zmiennej jest widoczny dla 300 linii kodu więcej niż jest to potrzebne, może to być prawdziwy problem inżynieryjny, ale niekoniecznie jest to problem do rozwiązania za pomocą anonimowych bloków.
Jeśli nic więcej, korzystanie z anonimowych bloków w całym miejscu jest egzotyczne, a nie idiomatyczne, a egzotyczny kod niesie ryzyko, że zostanie znienawidzony przez innych, jeśli nie przez ciebie, lata później.
Praktyczna przydatność ograniczenia zakresu
Ostateczną użytecznością ograniczenia zakresu zmiennych jest umożliwienie poprawnego zarządzania stanem i utrzymania go w prawidłowy sposób oraz umożliwienia łatwego uzasadnienia tego, co robi dana część bazy kodu - w celu utrzymania niezmienników koncepcyjnych. Jeśli lokalne zarządzanie stanem jednej funkcji jest tak złożone, że musisz siłą zmniejszyć zakres za pomocą anonimowego bloku kodu, który nie ma być sfinalizowany i dobry, to znowu jest to dla mnie znak, że sama funkcja musi zostać ponownie zbadana . Jeśli masz trudności z rozumowaniem zarządzania stanem zmiennych w lokalnym zakresie funkcji, wyobraź sobie trudność z rozumowaniem zmiennych prywatnych dostępnych dla każdej metody całej klasy. Nie możemy używać anonimowych bloków, aby zmniejszyć ich widoczność. Dla mnie pomaga zacząć od akceptacji, że zmienne będą miały nieco szerszy zakres, niż powinny mieć w wielu językach, pod warunkiem, że nie wymknie się to z sytuacji, w której będziesz miał trudności z utrzymaniem niezmienników. To nie jest coś do rozwiązania z anonimowymi blokami, ponieważ uważam to za akceptowalne z pragmatycznego punktu widzenia.