Зачем?

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

  1. Префиксы is, has, can, should:

    • Улучшают читаемость кода: Ясно указывают на то, что переменная содержит логическое (булево) значение.

    • Упрощают написание условных конструкций: Программист может легко написать условия, основываясь на этих префиксах, например, if (canSave) {...}.

  2. Префиксы min, max:

    • Четко определяют ограничения: Помогают установить и соблюдать границы значений для переменных, что важно во многих алгоритмах и бизнес-логиках.

  3. Префиксы prev, next:

    • Полезны в алгоритмах и структурах данных: Особенно актуальны при работе с списками, деревьями и другими структурами, где необходимо отслеживать элементы до или после текущего.

  4. Префиксы total, count, num:

    • Описывают количественные характеристики: Идеально подходят для переменных, которые хранят количество элементов, общие суммы и т.д., делая код интуитивно понятным при работе с числами.

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

Переменные

Префикс is

Префикс is обычно используется для булевых переменных, которые представляют состояние или качество. Этот префикс говорит о том, что переменная содержит ответ на вопрос "Это...?" или "Это в состоянии...?". Примеры:

  • isActive — активен ли?

  • isCompleted — завершен ли?

  • isVisible — видим ли?

  • isStart — это начало?

Префикс has

Префикс has используется, когда переменная указывает на наличие чего-либо. Это может быть свойство, элемент или некоторая возможность. Примеры:

  • hasChildren — имеются ли дети (подразумеваются дочерние элементы в дереве компонентов, например)?

  • hasHeader — имеется ли заголовок?

  • hasStarted — началось ли что-то?

Примеры выбора

В зависимости от контекста:

  • Если хотите указать, что процесс или действие началось, правильнее будет использовать hasStarted.

  • Если переменная должна указывать на то, что какой-то объект или сущность является "стартом" или начальной точкой, лучше подойдет isStart.

Если ваша переменная должна указывать на то, что сейчас идет начало чего-то (например, начало процесса), можно использовать hasStarted или isStarting. Если же переменная относится к начальной точке или объекту, который является начальным в каком-либо контексте (например, стартовая позиция), тогда isStart может быть более подходящим выбором.

Префикс can

Префикс can используется для переменных, которые указывают на возможность выполнения действия. Это подразумевает разрешение или способность что-то сделать. Например:

  • canEdit — может ли пользователь редактировать содержимое.

  • canSave — может ли пользователь сохранить изменения.

  • canDelete — может ли пользователь удалить элемент.

Префикс should

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

  • shouldUpdate — должно ли обновиться состояние или компонент.

  • shouldRender — должен ли компонент рендериться.

  • shouldFetchData — должны ли загружаться данные.

Префикс count или num

Для переменных, хранящих числовые значения, особенно если они относятся к количеству чего-либо, можно использовать префикс count или num. Например:

  • countItems — количество предметов.

  • numPages — количество страниц.

  • countErrors — количество ошибок.

Префикс min и max

Префиксы min и max используются для обозначения минимального и максимального значений соответственно. Это может быть полезно в настройках и конфигурациях. Например:

  • minLength — минимальная длина.

  • maxHeight — максимальная высота.

  • minPrice — минимальная цена.

Префикс prev и next

Эти префиксы используются для отслеживания предыдущего или следующего состояний в реактивных фреймворках или когда нужно сохранять историю изменений. Например:

  • prevValue — предыдущее значение переменной.

  • nextItem — следующий элемент в списке.

Префикс total

Для общих сумм или итоговых значений используется префикс total. Это помогает в расчетах и подведении итогов. Например:

  • totalPrice — общая цена.

  • totalScore — общий счет.

Префикс to

Для обозначения переменных, которые содержат объекты или коллекции объектов, над которыми нужно произвести определенное действие.

  • toDelete — список объектов или индексов, которые нужно удалить.

  • toKeep — список объектов или индексов, которые нужно оставить.

  • toUpdate — элементы, которые нужно обновить.

Эти переменные помогают быстро понять, какое действие будет выполнено над данными. Например, переменная toDelete сразу подсказывает, что она содержит объекты, которые будут удалены.

Выбор правильного префикса помогает улучшить понимание кода и упрощает поддержку и расширение программных решений.

Функции

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

Префикс get

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

  • getTotal

  • getUsername

  • getFormattedDate

Префикс set

Применяется в функциях, которые устанавливают или изменяют значение:

  • setUsername

  • setItemCount

  • setPreferences

Префикс calc или calculate

Означает, что функция выполняет некоторые вычисления и возвращает результат:

  • calculateInterest

  • calcTotalPrice

  • calculateAge

Префикс create

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

  • createUser

  • createReport

  • createConnection

Префикс check

Используется в функциях, которые проверяют условие и обычно возвращают булево значение:

  • checkValidity

  • checkStatus

  • checkPermissions

Префикс is или has

Применяется для функций, возвращающих булево значение, указывающее на состояние или наличие чего-то:

  • isActive

  • hasChildren

  • isAvailable

Префикс update

Используется для функций, которые обновляют существующие данные или состояние:

  • updateProfile

  • updateRecord

  • updateSettings

Префикс handle

Часто используется для названия функций-обработчиков, которые реагируют на события:

  • handleClick

  • handleInputChange

  • handleSubmit

Префикс fetch

Применяется для функций, которые получают данные из внешних источников, например, через API:

  • fetchData

  • fetchUserDetails

  • fetchPosts

Префикс remove или delete

Используется в функциях, которые удаляют элементы:

  • removeItem

  • deleteUser

  • removeEventListener

Префикс show или hide

Используется для функций, которые контролируют видимость элементов:

  • showMenu

  • hideAlert

  • showMoreDetails

Префикс toggle

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

  • toggleCheckbox

  • toggleVisibility

  • toggleFullscreen

Префикс/cуффикс to

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

  • toReadableDate — преобразование даты в читаемый формат

  • toDictionary — преобразование массива объектов в словарь

Суфикс вносит ясности:

  • serializeToJSON — сериализация данных в формат JSON.

  • convertToXML — преобразование данных в формат XML.

  • exportToCSV — экспорт данных в формат CSV.

  • transformToHTML — преобразование данных в HTML.

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

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

Комментарии (45)


  1. aragaer
    16.05.2024 12:44
    +1

    Иногда использую префикс to для указания того, что переменная содержит объект (или коллекцию объектов), над которыми нужно произвести определенное действие. Например -- пробежаться по коллекции, для каждого элемента определить, требуется ли ее удалять. Если да, то индекс положить в список toDelete. Альтернативно можно было бы собрать список toKeep и пересоздать новую коллекцию, в которой только эти индексы. Идея именования переменной та же самая. Другие примеры -- toEdit, toPrint, toSend, toUpdate и т.п.


    1. maximw
      16.05.2024 12:44
      +11

      А я to использую для функций преобразования типа toArray, toString


  1. tuxi
    16.05.2024 12:44
    +20

    Спасибо кэп!!!


    1. teplostanski Автор
      16.05.2024 12:44
      +4

      Всегда пожалуйста)))


      1. tuxi
        16.05.2024 12:44
        +2

        В функциях (методах обьекта) если есть возможность сериализации в какой то формат, то стоит именовать метод как toXML(); или toJSON(); , если же форматов много то лучше делать convertTo(formatType) или serializeTo(formatType)


        1. teplostanski Автор
          16.05.2024 12:44

          Мне добавить префикс to?


        1. manyakRus
          16.05.2024 12:44
          +2

          1) Min, Max, Total - должен быть суффикс в конце, а не префикс (CountMin, CountMax, CountTotal)
          2) toXML - должно быть XMLfrom() - сначала получаемый тип


          1. teplostanski Автор
            16.05.2024 12:44

            Где должен быть? Пожалуста укажите ссылку на источник, я впервые о таком слышу


          1. Gromilo
            16.05.2024 12:44
            +2

            А в нашем шарповом мире есть линку и там функции ToArray(), ToList() и т.д.
            А почему? потому что екстеншены и можно писать так:
            myArray.Select(x => x.Id).ToArray();

            А у вас какой мир?


            1. teplostanski Автор
              16.05.2024 12:44

              Пишите как вам угодно!


              1. Gromilo
                16.05.2024 12:44

                Спасибо, но это был вопрос к "должно быть XMLfrom".

                Мне было интересно где так пишут.


          1. tuxi
            16.05.2024 12:44
            +4

            MyObject.XMLfrom() ??? Это некрасиво, масло маслянное


            1. Iv38
              16.05.2024 12:44
              +3

              По мне так не просто некрасиво, а запутывает. Как будто метод должен получить что-то на вход - из чего он собирается сделать XML. А объект тогда, наверное, какой-то сериализатор. Методы с префиксом to, используемые для преобразования - вполне распространённая практика, даже в стандартных библиотеках языков. Если очень хочется придерживаться принципа, что метод должен содержать глагол, то convertToXML.


          1. HaJIuBauKa
            16.05.2024 12:44
            +4

            Что-то на "процедурном" :)


          1. gun_dose
            16.05.2024 12:44
            +1

            XMLfrom

            Мастер лишь такое придумать способен. Йода имя его.


  1. nronnie
    16.05.2024 12:44
    +3

    Как по мне, так префикс is совершенно не нужен. Например Active это уже само по себе прилагательное, которое указывает на определенную характеристику объекта, а именно "Объект Активен" - добавлять к нему еще is это, по-моему, откровенно избыточно. Can тоже очень спорно. Потому что сразу же вопрос "Кто что Can?" - это сам объект "can" что-то? Или кто-то другой "can" что-то? Почему просто не именовать так: canEdit -> Editable, canUpdate -> Updatable? Но это, впрочем, мелочи, потому что я когда-то видел такой шедевр имени свойства, как IsHasЧтоТоТам.


    1. Free_ze
      16.05.2024 12:44

      сразу же вопрос "Кто что Can?" - это сам объект "can" что-то?

      На этот вопрос обычно отвечает контекст, к примеру:

      • user.canDo...

      • validateUserPermissions() { bool canDo... = ...; }

      Почему просто не именовать так: canEdit -> Editable

      Сам по себе объект редактируемый или кем-то?
      Вы предлагаете префикс заменять на суффикс, те же профильные яйца)


      1. nronnie
        16.05.2024 12:44

        Нет, я предлагаю вместо myDocument.CanEdit писать myDocument.Editable, что более явно: "мойДокумент редактируемый (то что можно редактировать)". Второй вариант, к тому же, лучше ложится на шаблон: "объект - существительное", "метод - глагол", "свойство - существительное или прилагательное". Вы, конечно, правы в том, что если какой-то префикс хорошо ложится на контекст, то надо его и использовать, но, просто я постоянно наблюдаю как эти все is-has пихают на автопилоте куда ни попадя.


        1. Free_ze
          16.05.2024 12:44
          +8

          myDocument.CanEdit

          Выглядит абсурдно, если подразумевается редактируемость самого myDocument. Префикс тут если будет, то в виде isEditable. И тут речь про состояние myDocument, а не про пермишны редактирующего. А там уже будет user.canEdit..., разумеется.


      1. teplostanski Автор
        16.05.2024 12:44

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


    1. tuxi
      16.05.2024 12:44
      +4

      Булевы переменные удобно искать набирая is...


    1. kalombo
      16.05.2024 12:44
      +5

      Active и Editable как property вроде бы ок смотрятся, по крайней мере плохой пример придумать не смог, понятно, что это is editable. Но вот is_admin поменять на admin - уже большая разница, is_admin - точно булевое, admin - там может и имя быть и ссылка на другой класс и т.п. Да и функцию editable() и active() делать не стоит, гораздо больше неопределенности. В целом, префикс is прямо сообщает нам, что возвращаемое значение в поле/функции булево.

      Can тоже очень спорно. Потому что сразу же вопрос "Кто что Can?" - это сам объект "can" что-то? Или кто-то другой "can" что-то?

      Спорно, если не знаете английский :) Can - это сам объект can что-то, всегда. Может ли объект быть редактируемым - can be editable. Is editable - редактируемый ли в данный момент объект. Passive voice можно почитать на эту тему

      Но это, впрочем, мелочи, потому что я когда-то видел такой шедевр имени свойства, как IsHasЧтоТоТам

      Может поэтому вы и не поняли шедевр, там было написано всё нормально, но вы не смогли перевести? Is has - такого быть не может это грамматическая ошибка.


      1. ZirakZigil
        16.05.2024 12:44

        Is editable - редактируемый ли в данный момент объект

        Есть другое мнение: https://dictionary.cambridge.org/dictionary/english/editable


        1. kalombo
          16.05.2024 12:44

          Забавно, действительно, моё объяснение можно интерпретировать как "в данный момент документ редактируют", но нет, я не это имел в виду :) Я имел в виду, что на данный момент документ не readonly, его можно редактировать.


    1. evgenyk
      16.05.2024 12:44
      +4

      Есть слова, которые могут быть прилагательным или глаголом при одинаковом спеллинге, например: bright и to bright. Префикс is или to устраняет неопределенность. isBright или toBright, все ясно.


      1. gun_dose
        16.05.2024 12:44

        Вызов метода toBright заставит объект сиять или сконвертирует его в яркий объект?


        1. evgenyk
          16.05.2024 12:44

          Если объект может быть тусклым, а может быть ярким, то наверное сделает его ярким. Да мне кажется Вы, несмотря на вопрос, так и поняли. Не так ли?

          Хотя может выбор слова и не очень удачный.


          1. gun_dose
            16.05.2024 12:44

            Я это и спросил, чтобы показать неудачность вашего выбора. Префикс to может означать только конвертацию или приведение типа. А все вот эти глаголы, наречия и другие герундии не имеют никакого значения, потому что объект, это подлежащее, а метод - это сказуемое, а между подлежащим и сказуемым to не употребляется ни в каком времени. Как частица to применяется только рядом с инфинитивом, поэтому если мы где-то в ООП видим to, то это 100% не частица, а предлог.


          1. tuxi
            16.05.2024 12:44

            setBrighter() тогда уж, но есть есть уровни яркости, лучше явно их передавать, а еще лучше increase делать без аргумента или с аргументом на сколько шагов ярче делать, заодно внутри можно будет инкапсулировать проверку на границы диапазона яркости.


        1. aragaer
          16.05.2024 12:44

          Color.toBright() очевидно вернет яркую версию того же цвета (а если он уже яркий, то его же самого).


          1. gun_dose
            16.05.2024 12:44

            Да, это действительно очевидно. Единственное, что тут неочевидно - это к чему тут приплели прилагательные и глаголы.


    1. rg_software
      16.05.2024 12:44
      +1

      Префикс is однозначно намекает на булев тип. В противном случае не всегда понятно, что там внтури. Допустим, myObj.hyperlink -- это isHyperlink или свойство hyperlink, у которого ещё свои свойства есть?


      1. nronnie
        16.05.2024 12:44

        Это потому что "hyperlink" это существительное. Я говорил о прилагательных, которые по своей природе "bool-евские". Объект и так может быть только "Active / не Active", или "Enabled / не Enabled".


        1. rg_software
          16.05.2024 12:44

          Это, конечно, так, но тогда у вас половина слов будет с is, а половина без. И каждый раз надо будет соображать, о чём речь. Ну и всякие разночтения возможны, как в примере ниже с empty(). Короче говоря, иногда кривоватый, но однозначно читаемый английский лучше альтернатив, как мне кажется.


    1. fireSparrow
      16.05.2024 12:44

      >> Как по мне, так префикс is совершенно не нужен. Например Active это уже само по себе прилагательное,

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

      Но в английском языке полно слов, которые могут быть и прилагательным, и глаголом. И вот тут как раз начинаются проблемы.

      Некоторое время назад на хабре упоминалась история про багу, которая получилась, когда программист вызвал у контейнера метод .empty(), ожидая, что это очистит содержимое контейнера. Но на самом деле этот метод просто возвращал bool, который показывает - пуст контейнер или нет.

      Так что я всячески поддерживаю соглашение о том, что такие методы должны начинаться в "is".


  1. andy_p
    16.05.2024 12:44

    get/set не нужны. Эти функции определяются по наличию аргумента.


    1. Free_ze
      16.05.2024 12:44
      +3

      Принято начинать имя функции с глагола. Иначе получение указателя на функцию начинает странно смотреться.


  1. LaptevVV
    16.05.2024 12:44

    В STL есть функция to_array().
    Здесь префикс to_ означает: преобразовать в ...
    Аналогично to_string() и еще ряд других.


  1. svz
    16.05.2024 12:44
    +5

    Сложилось впечатление, что всю статью можно сократить до "руководствуйтесь правилами английского языка при нейминге методов, переменных и прочих объектов".


    1. xeleos
      16.05.2024 12:44
      +3

      Всё равно полезно, ведь английский учить дольше, чем читать эту статью.


  1. Fedorkov
    16.05.2024 12:44
    +9

    Для переменных, хранящих числовые значения, особенно если они относятся к количеству чего-либо, можно использовать префикс count или num. Например:

    • countItems — количество предметов.

    • numPages — количество страниц.

    • countErrors — количество ошибок.

    Тогда уж наоборот, ItemCount, PageCount, ErrorCount.

    «CountItems» — это «пересчитать элементы», т. е. глагол, который больше подойдёт для продолжительной или затратной функции.


  1. anonymous
    16.05.2024 12:44

    НЛО прилетело и опубликовало эту надпись здесь


    1. tuxi
      16.05.2024 12:44

      У ваших обьектов богатые родители)))


  1. Mirron11
    16.05.2024 12:44

    Считаю, что за префикс check нужно бить больно и беспощадно, особенно если методы с этим префиксом возвращают bool. Императив "сходи проверь" слишком многозначен. checkValidity может иметь поведение isValid (почему бы так не назвать), а может иметь поведение isNotValid (или это должно называться checkInvalidity?) или isValiditySpecified, isValidityConsisent. Единственное хотя бы немного оправданное поведение для функции/метода check -- бросать исключение, когда очевидно, что из-за значения Validity дальше все точно пойдет не так, но это тоже неочевидно, особенно что конкретно проверяла эта check-функция.

    ГОВОРИТЕ ОТКРЫТО И СМЕЛО ПРЯМО В ЛИЦО! is, а не check!


  1. unclegluk
    16.05.2024 12:44

    HandleClick? Странно, всегда был onClick, onChange, onSubmit и прочее.