Префикс "Is" в имени метода для методов проверки

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

migrationSuccessful = CopyData();
if (VerifyCopyData())
   migrationSuccessful = CleanupData();

versus:

migrationSuccessful = CopyData();
if (IsDataCopied())
   migrationSuccessful = CleanupData();

обратите внимание на разницу между VerifyCopyData и IsDataCopied. Мне IsDataCopied более значимое и делает поток кода в более описательном шаблоне.

Спасибо за ваши мысли!

EDIT: основываясь на некоторых комментариях, я подумал, что проясню, что делает метод IsDataCopied. Он проходит через несколько каталогов и файлов и удостоверяется, что исходный и конечный каталог/файлы совпадают.

11 ответов


Я согласен с Мэтью Джонсом, что предпочтительнее назвать метод IsDataCopied. Я хотел бы добавить, что при именовании элементов кода, связанных с другими элементами кода, я обычно считаю, что лучше поставить Is внутри имени, а не спереди, потому что он будет ближе в Intellisense к элементу, с которым он связан (и, следовательно, легче найти). Например, в Winforms форма имеет Handle и IsHandleCreated собственность. Если IsHandleCreated назвали HandleIsCreated, Это было бы близко к Handle свойство и легче найти (не похоронен в Intellisense).


Я согласен с вами. Для меня IsDataCopied гораздо более удобочитаем.

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


Я нахожу "есть", чтобы быть более ясным. Функция с именем "VerifyCopyData ()" может вызвать исключение, если данные не были скопированы или имеют побочные эффекты. Возможно, нет, но если я прочитаю его, то не буду знать, чего ожидать. Функция с префиксом Is понятна: эта функция не будет иметь побочных эффектов и просто вернет логический ответ на вопрос.

наличие глагола действия (verify) подразумевает, что функция действительно что-то делает. Использование " Is " не имеет глагол действия, поэтому он подразумевает, что функция просто проверяет состояние и не делает ничего другого.


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

опять же, делайте то, что имеет смысл.


IsDataCopied менее читаем в том, что намерение метода неизвестно. Если он просто возвращает логическое значение и больше ничего не делает, тогда все в порядке. Но, если он выполняет проверку,тогда может быть много кода, скрытого за невинно выглядящим условным оператором.

мои советы:

bool isDataProperlyCopied = VerifyCopiedData();
if ( isDataProperlyCopied ) {
   ...
}

это определенно субъективно, и в разное время (работа с разными библиотеками и даже разными языками) я всегда использовал такие префиксы и никогда не использовал их-смешивание этого соглашения с не использованием его часто было бы ошибкой. Решите, что является наиболее ясным на основе контекста, включая то, что уже делается в этом проекте/библиотеке/и т. д.

например, obj.DataIsCopied() течет лучше с носителем английского языка, но тогда у вас есть !obj.DataIsCopied() (или not). У вас есть чтобы понять, что вы пишете код и нуждаетесь в соглашениях, и эти соглашения добавляют смысл (в описательном смысле) субъективно.

кроме того, я ожидал бы любой метод с именем Verify чтобы сделать некоторую "реальную" работу для проверки, в то время как Is должно либо возвращать предварительно вычисленное / уже доступное значение, либо вычислять его тривиально. В языках, где у вас есть свойства, это намного проще выразить, так как вы можете отделить вещи, которые являются "действиями", от тех, которые не являются. Е. Г. используя if (obj.data_copied), является ли это членом данных или тривиальной функцией, такой как IsDataCopied, инкапсулируется.


данные.isCopied ()

потому что английский-это не VSO, а SVO.


приятно, если ваши методы могут содержать глагол, который помогает описать, что делает метод. VerifyCopyData звучит так, как будто он проверяет данные, тогда как isDataCopied похоже, что он проверяет существование некоторого факта. Это тонкое различие. Nitpick: я бы назвал первый метод VerifyCopiedData.


если бы это было любое другое имя, я бы подумал, но VerifyCopyData определенно менее читаем, чем isDataCopied .


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

префикс Verify не так понятен, так как он может быть функцией void или подпрограммой, которая ничего не возвращает. Например, проверка может означать, что он проверяет несколько вещей и выдает исключение, если что-то не так. Где как наличие префикса Is означает, что вы задавая вопрос, он получал ответ.


предпочитаю Is когда дело доходит до переменных и свойств

if(o.IsDataCopied)
{
}

но в этом случае с вызовом метода, я бы выбрал что-то вроде

if(DataIsCopied())
{
}