Поместите логическую функцию в выражение if - PullRequest
3 голосов
/ 08 июля 2010

Я поддерживаю приложение VB6.Для логических функций оригинальные авторы сохраняют возвращаемое значение в логической переменной перед проверкой результата в операторе If.Я предпочитаю размещать функцию непосредственно в операторе If.Это вопрос предпочтения или я упускаю потенциальную ловушку в своем стиле?

Оригинальный стиль автора

bReturn = IsThisFun(maintainingVb6)
If bReturn = True Then
    'You haven't used .NET
Else
    'blah
End If

Мой стиль

If IsThisFun(maintainingVb6) Then
    'You haven't used .NET
Else
    'blah
End If

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

Спасибо

Ответы [ 7 ]

7 голосов
/ 08 июля 2010

Делайте все, что читается и обслуживается.На мой взгляд, ваш стиль соответствует этим критериям в 98% случаев.

5 голосов
/ 09 июля 2010

Я считаю, что оригинальный автор создал переменную, чтобы иметь возможность отлаживать приложение.Он установит точку останова в строке 2 и увидит значение bReturn при наведении на нее курсора.Но так как вы также можете навести курсор на одинаковый символ или поставить две точки останова внутри оператора If / EndIf, нет необходимости создавать переменную только для этого.

Кстати, я частично согласен с DOK.Нет необходимости создавать ненужные переменные.Это совсем не пустая трата ресурсов, потому что компилятор достаточно умен, чтобы удалить эту переменную, но создает такую ​​переменную, которая не делает код более читабельным.

3 голосов
/ 08 июля 2010

Строго говоря, это вопрос стиля.

Эмпирическое правило таково: что более читабельно. Ваш, вероятно, предпочтительнее, потому что его код избыточен, и большинство людей предпочитают удалять избыточность. (Самое меньшее, что он мог сделать, это удалить = True, который полностью избыточен.)

Если бы логическое значение было результатом более длинного вызова функции, когда мешал If Then, я бы сделал результат отдельной переменной, чтобы было легче видеть вызов функции, но это только я.

2 голосов
/ 09 июля 2010

Есть одна возможная ловушка при использовании любого метода (w / или wo / variable). Вы должны быть уверены, что функция возвращает фактический булев VB (OLE VARIANTBOOL), а не C bool или любой другой тип. Если функция написана и представлена ​​в all-VB6, это не проблема, но ...

Нередки случаи, когда создаются декларации для внешних (обычно API) функций, которые прототипируются как возвращающие bool, используя As Boolean для возвращаемого типа. VB принимает это, но когда возвращается 'True' (из POV функции), он может находиться в аномальном состоянии: 16-разрядный логический элемент VB, который содержит значение 1 вместо нормального -1.

Это может иметь странные последующие эффекты, наиболее очевидным из которых является тест для If Not MyFunction(), который вычислит (Not 1) или -2 вместо (Not -1) или 0, как и ожидалось. Таким образом, вы получите странный результат Not(True) = True

Рекомендуется Declare внешние функции 'bool' As Long и CBool() результат.

1 голос
/ 08 июля 2010

Мне не нравится объявлять ненужные переменные. Это пустая трата ресурсов и не делает код более читабельным. Я предпочитаю твой стиль.

0 голосов
/ 10 июля 2010

На самом деле чаще всего это не вопрос предпочтений.Отдельная локальная переменная имеет значение, если код обернут в On Error Resume Next.

Если IsThisFun разорвется, тогда bReturn не будет назначен и обычно в конечном итоге будет ложным.поэтому условие не выполняется.Во втором фрагменте, если IsThisFun вызывает исключение, то выполнение попадает внутрь истинного блока If.

Для преодоления этого я видел множество «бессмысленных» фрагментов, подобных этому:

On Error Resume Next
...
If Not IsThisFun(maintainingVb6) Then
Else
    ...
End If
0 голосов
/ 08 июля 2010

Разве вы не можете просто создать метод, который вместо этого возвращает тип bool?

Пример:

public bool maintainingVB6()
{
  return true;
}
...