Należy zauważyć, że kod jest często odczytywany, z różnymi „głębokościami”. Ten kod:
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();
jest łatwy do „przeglądania”. To 3 wypowiedzi. Najpierw wymyślimy PowerManager
. Następnie wymyślamy WakeLock
. Potem . Widzę to naprawdę łatwo, patrząc na początek każdej linii; proste przypisania zmiennych są naprawdę łatwe do rozpoznania częściowo jako „Type varName = ...” i po prostu przeglądają w myślach „…”. Podobnie ostatnie stwierdzenie oczywiście nie jest formą przypisania, ale obejmuje tylko dwie nazwy, więc „główna istota” jest natychmiast widoczna. Często to wszystko, co musiałbym wiedzieć, gdybym tylko próbował odpowiedzieć „co robi ten kod?” na wysokim poziomie.acquire
wakeLock
Jeśli gonię za subtelnym błędem, który, jak sądzę, jest tutaj, to oczywiście będę musiał omówić to bardziej szczegółowo i faktycznie zapamiętam „...”. Ale oddzielna struktura instrukcji wciąż pomaga mi wykonywać tę jedną instrukcję na raz (szczególnie przydatna, jeśli muszę wskoczyć głębiej w implementację rzeczy wywoływanych w każdej instrukcji; kiedy wracam, w pełni rozumiem „jedną jednostkę” i może następnie przejść do następnej instrukcji).
((PowerManager)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
.acquire();
Teraz to wszystko jedno zdanie. Struktura najwyższego poziomu nie jest tak łatwa do odczytania; w oryginalnej wersji OP, bez łamania linii i wcięć w celu wizualnego komunikowania dowolnej struktury, musiałbym policzyć nawiasy, aby zdekodować ją w sekwencji 3 kroków. Jeśli niektóre wyrażenia wieloczęściowe są zagnieżdżone w sobie, a nie ułożone jako łańcuch wywołań metod, może wyglądać podobnie do tego, więc muszę być ostrożny, ufając temu bez liczenia nawiasów. A jeśli ufam wgłębieniu i przejdę do ostatniej rzeczy jako przypuszczalnego punktu tego wszystkiego, co .acquire()
powie mi to samo?
Czasami jednak może to być to, czego chcesz. Jeśli zastosuję twoją transformację w połowie i napisam:
WakeLock wakeLock =
((PowerManeger)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();
Teraz komunikuje się to z szybkim przeglądaniem „weź WakeLock
, a potem acquire
to”. Jeszcze prostszy niż pierwsza wersja. Od razu jest oczywiste, że rzecz, która została nabyta, to WakeLock
. Jeśli uzyskanie PowerManager
jest tylko szczegółem szczegółowym, który jest nieistotny z punktu widzenia tego kodu, ale wakeLock
jest to ważne, to może naprawdę pomóc w zakopaniu PowerManager
rzeczy, więc naturalne jest, aby przejrzeć je, jeśli po prostu próbujesz szybko uzyskać wyobrażenie o tym, co robi ten kod. A bez nazywania oznacza, że jest on używany tylko raz, a czasem to co jest ważne (jeśli reszta zakresu jest bardzo długa, musiałbym przeczytać wszystko, aby powiedzieć, czy kiedykolwiek zostanie ponownie użyty; chociaż użycie jawnych podzakresów może być innym sposobem rozwiązania tego, jeśli twój język je obsługuje).
Co powoduje, że wszystko zależy od kontekstu i tego, co chcesz komunikować. Podobnie jak w przypadku pisania prozy w języku naturalnym, zawsze istnieje wiele sposobów na napisanie danego fragmentu kodu, który jest zasadniczo równoważny pod względem zawartości informacyjnej. Podobnie jak w przypadku pisania prozy w języku naturalnym, jak wybrać pomiędzy nimi powinna generalnie nie będzie stosować zasady mechanistyczne jak „wyeliminować lokalną zmienną, która występuje tylko raz”. Raczej jakzdecydujesz się zapisać kod będzie podkreślał pewne rzeczy, a odznaczał inne. Powinieneś starać się dokonywać tych wyborów świadomie (w tym czasami pisać mniej czytelny kod z przyczyn technicznych), w oparciu o to, co naprawdę chcesz podkreślić. Pomyśl szczególnie o tym, co posłuży czytelnikom, którzy po prostu potrzebują „poznać istotę” twojego kodu (na różnych poziomach), ponieważ będzie to miało miejsce znacznie częściej niż bardzo ścisłe czytanie wyrażenie po wyrażeniu.