Префикс «есть» в имени метода для методов проверки - PullRequest
6 голосов
/ 17 ноября 2009

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

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

против

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

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

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

РЕДАКТИРОВАТЬ: Основываясь на некоторых комментариях, я решил уточнить, что делает метод IsDataCopied. Он просматривает несколько каталогов и файлов и проверяет соответствие исходного / целевого каталога / файлов.

Ответы [ 11 ]

8 голосов
/ 17 ноября 2009

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

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

5 голосов
/ 17 ноября 2009

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

2 голосов
/ 17 ноября 2009

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

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

1 голос
/ 14 октября 2011

data.isCopied ()

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

1 голос
/ 17 ноября 2009

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

Мой совет:

bool isDataProperlyCopied = VerifyCopiedData();
if ( isDataProperlyCopied ) {
   ...
}
1 голос
/ 17 ноября 2009

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

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

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

0 голосов
/ 30 ноября 2009

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

if(o.IsDataCopied)
{
}

Но в этом случае при вызове метода я бы выбрал что-то вроде

if(DataIsCopied())
{
}
0 голосов
/ 17 ноября 2009

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

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

0 голосов
/ 17 ноября 2009

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

0 голосов
/ 17 ноября 2009

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

...