Uma coisa a notar é que o código é lido com freqüência, em diferentes "profundidades". Este código:
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();
é fácil "roçar". São 3 afirmações. Primeiro, criamos um PowerManager
. Então criamos um WakeLock
. Então nós acquire
o wakeLock
. Eu posso ver isso com muita facilidade apenas olhando para o início de cada linha; atribuições de variáveis simples são realmente fáceis de reconhecer parcialmente como "Digite varName = ..." e apenas deslize mentalmente sobre o "...". Da mesma forma, a última afirmação obviamente não é a forma da tarefa, mas envolve apenas dois nomes; portanto, a "essência principal" é imediatamente aparente. Muitas vezes, isso é tudo que eu precisaria saber se estivesse apenas tentando responder "o que esse código faz?" em um nível alto.
Se eu estou perseguindo um bug sutil que acho que está aqui, então obviamente precisarei revisar isso com muito mais detalhes e, na verdade, lembrarei dos "..." s. Mas a estrutura de declaração separada ainda me ajuda a fazer uma declaração de cada vez (especialmente útil se eu precisar aprofundar a implementação das coisas que são chamadas em cada declaração; quando eu voltar, eu entendi completamente "uma unidade" e pode passar para a próxima declaração).
((PowerManager)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
.acquire();
Agora é tudo uma afirmação. A estrutura de nível superior não é tão fácil de ler rapidamente; na versão original do OP, sem quebras de linha e recuo para comunicar visualmente qualquer estrutura, eu teria que contar parênteses para decodificá-la em uma sequência de três etapas. Se algumas das expressões de várias partes estiverem aninhadas uma à outra, em vez de organizadas como uma cadeia de chamadas de método, ainda assim poderá parecer semelhante a isso, por isso tenho que ter cuidado ao confiar nisso sem contar parênteses. E se eu confio no recuo e apenas deslizo para a última coisa como o ponto presumido de tudo isso, o que .acquire()
me diz por si só?
Às vezes, porém, isso pode ser o que você deseja. Se eu aplicar sua transformação no meio do caminho e escrever:
WakeLock wakeLock =
((PowerManeger)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();
Agora isso se comunica com um toque rápido "obtenha um WakeLock
, então acquire
ele". Ainda mais simples que a primeira versão. É imediatamente óbvio que o que é adquirido é um WakeLock
. Se a obtenção de um PowerManager
é apenas um sub-detalhe que é bastante insignificante ao ponto deste código, mas wakeLock
é importante, pode realmente ajudar a enterrar o PowerManager
material, de modo que é natural examiná-lo se você estiver apenas tentando obter rapidamente um idéia do que esse código faz. E, sem nomeá-lo, comunica que é usado apenas uma vez, e às vezes é o que é importante (se o restante do escopo for muito longo, eu teria que ler tudo isso para saber se é usado novamente; embora o uso de sub-escopos explícitos possa ser outra maneira de resolver isso, se o seu idioma os suportar).
O que traz à tona que tudo depende do contexto e do que você deseja se comunicar. Como na escrita em prosa em linguagem natural, sempre existem muitas maneiras de escrever um determinado trecho de código que é basicamente equivalente em termos de conteúdo de informações. Como na escrita em prosa em linguagem natural, como você escolhe entre eles geralmente não deve aplicar regras mecanicistas como "eliminar qualquer variável local que ocorra apenas uma vez". Pelo contrário, comovocê optar por escrever o seu código enfatizará certas coisas e enfatizará outras. Você deve se esforçar para fazer essas escolhas conscientemente (incluindo a opção de escrever código menos legível por razões técnicas às vezes), com base no que você realmente deseja enfatizar. Pense especialmente no que servirá aos leitores que precisam apenas "entender o essencial" do seu código (em vários níveis), pois isso acontecerá com muito mais frequência do que uma leitura muito próxima de expressão por expressão.