В этой статье я пишу о передовой стратегии именования для функций, с которыми мне очень нравится работать. Он инкапсулирует обязанности между различными видами функций и устанавливает рекомендации, которые сэкономят вам много времени на отладку в будущем.
Стратегия именования подходит для любого языка программирования, но я сосредоточусь на 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)
Заключение
В этой статье я обсудил наилучшую стратегию именования для инкапсуляции нескольких типов функций. Используя эту стратегию именования, разработчики могут значительно улучшить ремонтопригодность и понятность своего кода.
Если у вас есть какие-либо мысли или знания о применении этого префикса (например, в линтере), оставьте комментарий и дайте мне знать ниже!