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

Стратегия именования подходит для любого языка программирования, но я сосредоточусь на JavaScript (с использованием ReactJS) и приведу пример реализации функций в Readily, расширении Chrome для чтения для читателей с дислексией.

После этого критериями наилучшего соглашения об именах будут:

  • Возможны самые короткие имена
  • Легко понять

Соглашения об именовании! = Стратегия именования

Во-первых, хотя я не буду слишком подробно вдаваться в условности падежей, но вот наиболее известные из них для полноты картины.

  • camelCase : все слова, кроме первого, начинаются с заглавной буквы (JavaScript)
  • PascalCase: все слова начинаются с заглавной буквы (C#)
  • змея_case : все строчные буквы, слова разделены символами подчеркивания (python)

Общий обзор

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

Обратите внимание, что в этой статье необсуждается стратегия именования переменных. Это будет в статье в другой раз.

Префиксы, почему?

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

Этот метод используется в сетевом модуле игрового движка Unity, для которого требуется, чтобы функции, запускаемые на сервере, начинались с Cmd, а функции, которые можно вызывать только на клиентах, начинаются с Rpc (сокращение от удаленного вызова процедуры. Подробнее об этом здесь.

Типы префиксов, которые вы будете использовать, могут зависеть от вашего варианта использования. В приведенном ниже примере я буду обсуждать общие функции, связанные с использованием шаблона проектирования Command и Memento.

Шаблон COMMAND применяется к элементу SentenceMenuItem, который представляет собой строку, отображаемую в примере изображения, содержащую заголовок «Предложение» и тумблер.

Следуя шаблону MEMENTO для ReactJS, все STATE должны находиться в объекте средства визуализации верхнего уровня (SentenceMenuItem). В MEMENTO функции должны обновлять состояние, а изменения состояния необходимо анализировать, чтобы отражать визуальные обновления. Это делается с помощью виртуального componentDidUpdate(prevProps,prevState,snapshot) в классе React.Component, где в функции можно вызвать this.state для получения текущего состояния.

В примере есть несколько состояний, которые необходимо сохранить для каждой посещаемой веб-страницы:

  • текущий (целое число), указывает номер предложения, на котором находится пользователь
  • выделяет (карта), указывает, какие предложения следует выделить
  • команды (подобные массиву), хранит историю команд

Перед функциями стоят следующие ключи:

[1] The commands object most closely resembles a stack. A command is pushed to the object to be at the top. However, when undoing, the top command is just popped and discarded. The undone commands are kept until a redo is executed or the user applied a new command to overwrite the popped commands. The popped commands could be stored in another stack.

Дополнительные примечания о префиксах

  • сделать

Может содержать логику фильтрации. Здесь не следует вызывать функции выполнения, так как это вызовет несколько обновлений состояния.

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

  • пользователь

Перед запуском командных функций проверяется включенное и активное состояние компонента. Выполнить функции можно вызывать напрямую, если функция отмены не предназначена.

  • рассчитать и получить

Все переменные должны быть объявлены в параметрах функции (при этом не должны читаться какие-либо переменные состояния). Константы могут быть объявлены вне функции.

Дополнительные функции

Для ReactJS также используется следующая функция:

  • componentDidUpdate: сравнить предыдущее состояние и новое состояние, затем применить функции do

Пример потока

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

/**
* The following chain will increment the this.state.current 
* value to indicate that the next sentence should be
* highlighted.
*/
userMoveNextSentence() // Calls the command function to 
                       // record the action
  - commandMoveNext() // Calls the execute to apply state change
    = executeMove(commandProps) // Causes the re-render
      - (state-change re-render)
        - componentDidUpdate() // Calls the do functions to 
                               // remove the previous
                               // highlight and add the next one
          - doRemoveHighlight(prevN), doAddHighlight(nextN)

Заключение

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

Если у вас есть какие-либо мысли или знания о применении этого префикса (например, в линтере), оставьте комментарий и дайте мне знать ниже!