Это клише, но остается верным, как никогда ... в программном обеспечении трудно давать названия объектам!

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

Как частый читатель кода (не так ли?), Я знаю, какой из них предпочитаю.

Недавний обмен в нашей команде оказался отличным примером этого. Давайте взглянем.

У нас есть сага, в которой выполняется действие, представляющее обновление записи, которое запускает обновление с несколькими местоположениями в Firebase. Мы храним запись в ее полной форме в корневом узле /articles, а также у нас есть другое место, представляющее эту запись на временной шкале, например. /timelines/articles.

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

У нас есть телефонный код…

return database.ref().update({
  [`articles/${key}`]: article,
  ...buildLocaleReferences({ 
    allLocales: locales, 
    articleLocales, 
    key 
  })
})

Не вдаваясь в подробности того, как реализована функция buildLocaleReferences, достаточно знать, что она возвращает объект, представляющий статью в каждой временной шкале локалей, предоставленных articleLocales.

Назначение этой функции не раскрывается частью имени localeReferences. Он достаточно общий, чтобы читатель погрузился в функцию, чтобы выяснить, какие ссылки она возвращает.

Давайте попробуем переименовать это, чтобы помочь читателю.

return database.ref().update({
  [`articles/${key}`]: article,
  ...timelineReferencesForLocales({ 
    allLocales: locales, 
    articleLocales, 
    key 
  })
})

Хорошо, это начинает выглядеть немного лучше. Тем не менее, мы все еще можем улучшить это.

Вызов функции обновления имеет логику, которую мы могли бы сделать более читаемой, назвав. Константа - хорошее место для начала.

const articleRootReference = { [`articles/${key}`]: article }
const timelineReferences = timelineReferencesForLocales({
  allLocales: locales,
  articleLocales,
  key
})
return database.ref().update({
  ...articleRootReference,
  ...timelineReferences
})

Сейчас это не так кратко, но, надеюсь, вы согласитесь с тем, что дополнительные строки способствуют тому, чтобы вы могли сразу увидеть, какие ссылки мы передаем в функцию обновления, не зная, что это за ссылки на самом деле.

В следующий раз, когда вы назовете что-то в своем коде, подумайте, как будущий читатель может это интерпретировать и будет ли это сообщать им достаточно для текущего контекста.