2010-07-08 2 views
3

Я поддерживаю приложение VB6. Для булевых функций исходные авторы сохраняют возвращаемое значение в логической переменной перед проверкой результата в выражении If. Я предпочитаю размещать функцию непосредственно в инструкции If. Является ли это вопросом предпочтения или мне не хватает потенциальной ловушки в моем стиле?Функция места boolean в выражении 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 

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

Thanks

+0

Спасибо всем за утверждая, что это вопрос предпочтений. Я ценю отзывы. – jimueller

+3

+1 для вашего кода развлекательного примера – derekerdmann

ответ

7

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

0

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

Пример:

public bool maintainingVB6() 
{ 
    return true; 
} 
+1

В своем примере IsThisFun возвращает логический тип (или так он появляется). –

1

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

+1

Я нахожу многочисленные bReturn, bRetVal, bReturnValue, bRVal, отвлекающие. – jimueller

3

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

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

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

+0

Не только ты - я тоже. – MarkJ

+0

Если вы думаете, что «= True» плохо, попробуйте «Если False = IsNull (blah) Затем« вместо использования «Not IsNull» или для выполнения функции IsNotNull() –

5

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

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

+0

Я думаю, что это, вероятно, объяснение. Если бы не об этом. Теперь я вижу, что некоторые строки прокомментировали, где они записывали значения в текстовый файл. – jimueller

2

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

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

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

Лучшая практика заключается в Declare внешних функций «BOOL» As Long и CBool() результат.

+0

Прохладный, спасибо за информацию, которая интересна. Некоторые вызовы функций API, написанные на языке C, могут объяснять выбор оригинального автора. – jimueller

0

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

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

Для преодоления этого я видел многочисленные «нонсенс» фрагменты, как это:

On Error Resume Next 
... 
If Not IsThisFun(maintainingVb6) Then 
Else 
    ... 
End If