Solução alternativa de curto-circuito condicional VBScript
-
09-06-2019 - |
Pergunta
Tenho um grande aplicativo ASP clássico que preciso manter e fico repetidamente frustrado pela falta de capacidade de avaliação de curto-circuito.Por exemplo, o VBScript não permitirá que você se livre de:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
... porque se Rs("myField") for nulo, você receberá um erro na segunda condição, comparando nulo com 0.Então, normalmente acabo fazendo isso:
dim myField
if isNull(Rs("myField")) then
myField = 0
else
myField = Rs("myField")
end if
if myField <> 0 then
...
Obviamente, a verbosidade é bastante terrível.Olhando em torno desta grande base de código, a melhor solução que encontrei é usar uma função que o programador original escreveu, chamada TernaryOp, que basicamente enxerta uma funcionalidade semelhante a um operador ternário, mas ainda estou preso usando uma variável temporária que não funcionaria. ser necessário em uma linguagem mais completa.Existe uma maneira melhor?Alguma maneira supersecreta de que o curto-circuito realmente exista no VBScript?
Solução
Talvez não seja a melhor maneira, mas certamente funciona...Além disso, se você estiver em vb6 ou .net, poderá ter métodos diferentes que também são convertidos para o tipo adequado.
if cint( getVal( rs("blah"), "" ) )<> 0 then
'do something
end if
function getVal( v, replacementVal )
if v is nothing then
getVal = replacementVal
else
getVal = v
end if
end function
Outras dicas
IFs aninhados (apenas um pouco menos detalhados):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
Eu sempre usei instruções Select Case para curto-circuitar a lógica em VB.Algo como..
Select Case True
Case isNull(Rs("myField"))
myField = 0
Case (Rs("myField") <> 0)
myField = Rs("myField")
Case Else
myField = -1
End Select
Minha sintaxe pode estar errada, já faz um tempo.Se o primeiro caso aparecer, todo o resto será ignorado.
Ou talvez eu tenha entendido errado a pergunta.Você quis dizer algo como iIf()
em VB?Isso funciona para mim:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
onde returnIf()
é uma função assim:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
Se você escrever como dois inline IF
declarações, você pode causar curto-circuito:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...
Mas o seu then
action também deve aparecer na mesma linha.Se você precisar de várias instruções depois then
, você pode separá-los com :
ou mova seu código para uma sub-rotina que você possa chamar.Por exemplo:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2
Ou
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))
Se houvesse, meu amigo - TernaryOp é sua única esperança.
Sim, não é a melhor solução, mas o que usamos é algo assim
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
Duas opções vêm à mente:
1) usar len()
ou lenb()
para descobrir se há algum dado na variável:
if not lenb(rs("myField"))=0 then...
2) use uma função que retorne um booleano:
if not isNothing(rs("myField")) then...
onde isNothing()
é uma função assim:
function isNothing(vInput)
isNothing = false : vInput = trim(vInput)
if vartype(vInput)=0 or isEmpty(vInput) or isNull(vInput) or lenb(vInput)=0 then isNothing = true : end if
end function
Você pode apenas usar Else
para capturar nulos, ""s, etc.
If UCase(Rs("myField")) = "THING" then
'Do Things
elseif UCase(Rs("myField")) = "STUFF" then
'Do Other Stuff
else
'Invalid data, such as a NULL, "", etc.
'Throw an error, do nothing, or default action
End If
Eu testei isso no meu código e atualmente está funcionando.Pode não ser adequado para a situação de todos.