Стоит отметить, что код читается часто, на разных «глубинах». Этот код:
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();
легко "снять". Это 3 заявления. Сначала мы придумали PowerManager
. Тогда мы придумали WakeLock
. Тогда мы . Я могу легко это увидеть, просто посмотрев на начало каждой строки; простые присвоения переменных действительно легко частично распознаются как «Type varName = ...» и просто мысленно скользят по «...». Точно так же последнее утверждение, очевидно, не является формой присвоения, но оно включает только два имени, поэтому «основная суть» становится очевидной сразу. Часто это все, что мне нужно знать, если я просто пытаюсь ответить «что делает этот код?» на высоком уровне.acquire
wakeLock
Если я гоняюсь за тонкой ошибкой, которая, как мне кажется, здесь, то, очевидно, мне нужно будет рассмотреть это более подробно и на самом деле будет помнить "...". Но отдельная структура операторов все еще помогает мне делать это по одному утверждению за раз (особенно полезно, если мне нужно глубже погрузиться в реализацию вещей, вызываемых в каждом утверждении; когда я возвращаюсь, я полностью понимаю «одну единицу») и затем можно перейти к следующему утверждению).
((PowerManager)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
.acquire();
Теперь это все одно утверждение. Структура верхнего уровня не так проста для чтения; в исходной версии OP, без разрывов строк и отступов для визуальной передачи любой структуры, мне пришлось бы считать скобки, чтобы декодировать ее в последовательность из 3 шагов. Если некоторые выражения, состоящие из нескольких частей, вложены друг в друга, а не организованы как цепочка вызовов методов, то все равно это может выглядеть примерно так, поэтому я должен быть осторожен с этим, не считая скобок. И если я доверяю отступу и просто проскакиваю вперед до последней вещи как предполагаемой точки всего этого, что .acquire()
мне скажет само по себе?
Однако иногда это может быть тем, что вы хотите. Если я применю ваше преобразование на полпути и написал:
WakeLock wakeLock =
((PowerManeger)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();
Теперь это говорит о быстром снятии "получить WakeLock
, тогда acquire
это". Еще проще, чем в первой версии. Сразу видно, что приобретаемая вещь является WakeLock
. Если получение - PowerManager
это просто деталь, которая довольно незначительна с точки зрения этого кода, но wakeLock
важна, тогда это может фактически помочь похоронить PowerManager
материал, поэтому естественно просмотреть его, если вы просто пытаетесь быстро получить Идея того, что делает этот код. И не называя сообщается , что он будет использоваться только один раз, а иногда это что важно (если остальная часть области очень длинная, мне придется прочитать все это, чтобы узнать, будет ли она когда-либо использоваться снова; хотя использование явных вложенных областей может быть другим способом решения этой проблемы, если ваш язык их поддерживает).
Что наводит на мысль, что все зависит от контекста и того, что вы хотите общаться. Как и в случае написания прозы на естественном языке, всегда есть много способов написания данного фрагмента кода, которые в основном эквивалентны с точки зрения содержания информации. Как и в случае написания прозы на естественном языке, выбор между ними, как правило, не должен заключаться в применении механистических правил, таких как «исключить любую локальную переменную, которая встречается только один раз». Скорее каквы решите записать свой код, чтобы подчеркнуть некоторые вещи и уменьшить акцент на других. Вы должны стремиться делать этот выбор осознанно (в том числе время от времени писать менее читаемый код по техническим причинам), основываясь на том, что вы действительно хотите подчеркнуть. Особенно подумайте о том, что послужит читателям, которым просто нужно «понять суть» вашего кода (на разных уровнях), поскольку это будет происходить гораздо чаще, чем очень внимательное чтение выражения за выражением.