الحل البديل لقصر الدائرة المشروط VBScript
-
09-06-2019 - |
سؤال
لدي تطبيق ASP كلاسيكي كبير يجب علي صيانته، وأجد نفسي محبطًا بشكل متكرر بسبب الافتقار إلى القدرة على تقييم الدائرة القصيرة.على سبيل المثال، لن يسمح لك VBScript بالإفلات من العقاب:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
...لأنه إذا كانت قيمة Rs("myField") فارغة، فستحصل على خطأ في الشرط الثاني، مقارنة القيمة null بالصفر.لذلك عادةً ما سأنتهي من القيام بذلك بدلاً من ذلك:
dim myField
if isNull(Rs("myField")) then
myField = 0
else
myField = Rs("myField")
end if
if myField <> 0 then
...
من الواضح أن الإسهاب مروع للغاية.بالنظر إلى قاعدة الأكواد الكبيرة هذه، فإن أفضل حل بديل وجدته هو استخدام وظيفة كتبها المبرمج الأصلي، تسمى TernaryOp، والتي تعمل بشكل أساسي على تطعيم وظائف تشبه المشغل الثلاثي، لكنني ما زلت عالقًا في استخدام متغير مؤقت لن يفعل ذلك يكون ضروريًا بلغة أكثر اكتمالاً.هل هناك طريقة أفضل؟هل توجد طريقة فائقة السرية لوجود دائرة قصر في VBScript؟
المحلول
ربما ليست الطريقة الأفضل، لكنها بالتأكيد تعمل..وأيضًا، إذا كنت تستخدم الإصدار vb6 أو .net، فمن الممكن أن يكون لديك طرق مختلفة للتحويل إلى النوع المناسب أيضًا.
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
نصائح أخرى
IFs المتداخلة (أقل تفصيلاً قليلاً):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
لقد استخدمت دائمًا عبارات Select Case لمنطق الدائرة القصيرة في VB.شيء مثل..
Select Case True
Case isNull(Rs("myField"))
myField = 0
Case (Rs("myField") <> 0)
myField = Rs("myField")
Case Else
myField = -1
End Select
قد يكون بناء الجملة الخاص بي معطلاً، منذ فترة.إذا ظهرت الحالة الأولى، فسيتم تجاهل كل شيء آخر.
أو ربما حصلت على نهاية خاطئة للسؤال.هل تقصد شيئا مثل iIf()
في لغة البرمجة VB؟هذا يعمل بالنسبة لي:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
أين returnIf()
هي وظيفة مثل ذلك:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
إذا كتبته على شكل اثنين مضمنة IF
البيانات، يمكنك تحقيق ماس كهربائى:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...
ولكن لديك then
يجب أن يظهر الإجراء على نفس السطر أيضًا.إذا كنت بحاجة إلى بيانات متعددة بعد then
, ، يمكنك فصلهم مع :
أو انقل الرمز الخاص بك إلى روتين فرعي يمكنك الاتصال به.على سبيل المثال:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2
أو
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))
ليت ذلك كان موجودًا يا صديقي -- TernaryOp هو أملك الوحيد.
نعم، هذا ليس الحل الأفضل ولكن ما نستخدمه هو شيء من هذا القبيل
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
يتبادر إلى الذهن خياران:
1) الاستخدام len()
أو lenb()
لاكتشاف ما إذا كان هناك أي بيانات في المتغير:
if not lenb(rs("myField"))=0 then...
2) استخدم دالة تُرجع قيمة منطقية:
if not isNothing(rs("myField")) then...
أين isNothing()
هي وظيفة مثل ذلك:
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
قد تكون قادرا على استخدام فقط Else
للقبض على القيم الخالية، ""s، وما إلى ذلك.
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
لقد اختبرت هذا في الكود الخاص بي وهو يعمل حاليًا.قد لا يكون مناسبًا لحالة الجميع بالرغم من ذلك.