Pull to refresh

Comments 56

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

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

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

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

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

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

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

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

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

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

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

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

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

XMLfrom

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

Вы бы знали, сколько раз я людям на кодревью указывал, что булевые переменные надо называть с is*.

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

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

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

  • user.canDo...

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

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

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

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

myDocument.CanEdit

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

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

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

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 - такого быть не может это грамматическая ошибка.

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

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

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

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

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

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

Да, я согласен, что setBright() лучше, чем toBright()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

UFO just landed and posted this here

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

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

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

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

NewButton(onClick=handleClick)

onClick — это название поля содержащего обработчик события

handleClick — это сама функция-обработчик

На моей первой и второй работе функции и переменные назывались как придется, не было каких-то соглашений. А вот на новой, где я уже 3 года всё почти полностью, как в статье этой. Со всем согласен тут кроме check, с ним нередко не очевидно становится, какое именно состояние ожидается. Видел вариант checkIsAvailable, который содержал какую-то непростую логику проверки с запросом на сервер.

Спасибо за статью! Можно брать за основу для приведения наименований переменных/функций к единому стандарту при командной разработке. Да и в принципе проще будет названия переменных придумывать: на это уходит львиная доля времени работы программиста :)

Ещё вариант "ought":

bool oughtToBeEnough;

:)

Спасибо за статью. Тема казалось бы простая. Но даже опытные разработчики порой делают ошибки в именовании.

Как вам такое имя свойства - getSystemFonts() : bool и имя метода для этого свойства getgetSystemFonts(): bool

Сразу понятно для чего оно? 🙂

Префикс fetch, по-моему, сомнительный. Если его использовать в слое бизнес-логики, он ломает абстракцию, т.к. прямо указывает на сеть. А в самом адаптере/сервисе для работы с внешней системой он бессмысленный - и так понятно откуда будет происходить get или retrieve.

С точки зрения английского, правильнее must, а не should, т.к. should носит рекоммендательный характер. Или я не прав?

Sign up to leave a comment.

Articles