27 Локальные переменные

      Комментарии к записи 27 Локальные переменные отключены

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 4 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3605

    Еще один признак хорошего кода, это малое количество локальных переменных в функциях. Чем меньше — тем лучше. Хорошая функция, помимо всего прочего, это одна-две, максимум — три локальные переменные.

    Логика рассуждений здесь очень проста. Локальные переменные это контекст. Контекст, образованный локальными переменными, всегда одноразовый. Много локальных переменных — сложный контекст. Сложный контекст не должен быть одноразовый. Сложный одноразовый контекст — прямой путь к code-driven development. Сложный контекст лучше всего посадить в класс: с одной стороны это придаст дополнительную строгость, с другой — дополнительную гибкость, с третьей — этот класс может пригодиться кому-то еще, а это значит, что контекст будет спасен от одноразовости.

    Большое количество локальных переменных также может представлять собой помесь нескольких контекстов. Это означает, что функция пытается решать сразу несколько задач. В этом, очевидно, тоже нет ничего хорошего.

    На практике большое количество локальных переменных обычно встречается в очень больших функциях. Если функция имеет пятнадцать локальных переменных, то, скорее всего, она состоит минимум из ста пятидесяти строк.

    Если в вашей функции много локальных переменных, то это означает одно из двух: либо вы не завершили декомпозицию (ваша функция решает сразу несколько задач), и вашу функцию нужно разбить на несколько функций с небольшим количеством локальных переменных, либо контекст вашей функции достаточно сложен и заслуживает того, чтобы его выделили в самостоятельную языковую сущность.

    Вот примеры локальных переменных хорошей функции: переменная цикла (итератор, лямбда-параметр); возвращаемое значение, требующее предварительной проверки; объект, собранный из переданных функции параметров; объект-контекст. Если в ваших локальных переменных начинает просматриваться какое-то родство, какая-то «сюжетная линия», то это означает что вы сошли с верного пути — пора остановиться и провести работу над ошибками.

    Что значит «выделить контекст в отдельную языковую сущность»? Это ни в коем случае не означает «запихнуть все локальные переменные в новый класс». Действовать, естественно, нужно с умом. Часть локальных переменных может уйти в данные-члены уже существующих классов, часть, в действительности, может и вообще не понадобиться. Оставшиеся переменные, если они претендуют на образование новой языковой сущности, должны образовывать некую осмысленную и законченную сущность. Это ни в коем случае не должна быть пестрая свалка разрозненных элементов.

    Вообще говоря, назначение практически любой функции состоит (должно состоять) в том, чтобы обеспечить взаимодействие некоторых языковых сущностей (например, объектов каких-то классов). Если для обеспечения такого взаимодействия вам требуется десять дополнительных переменных, то, скорее всего это говорит о том, что взаимодействующие сущности не достаточно полны и не достаточно самостоятельны и независимы. Скорее всего часть этих локальных переменных в таком случае это как раз то, чего не хватает вашим классам для того, чтобы стать полными (законченными), самостоятельными и независимыми. Опять же, это совершенно не означает то, что нужно взять и тупо перенести часть переменных в какие-то классы. Действовать, как я уже сказал, нужно с умом.

Для ответа в этой теме необходимо авторизоваться.