مرحباً أخواني الكرام .
في الحقيقة, هذا الموضوع هو موضوعي الأول في اللغة العربية , لذلك اعذروني إن كنت نسيت أن أذكر جهة من جهات موضوعنا التالي.
في هذا الموضوع سنتكلم عن التصريح ( Goto ) .
ستتسأل وتقول نعرف أنه يمكننا استخدام هذا التصريح لتجاهل سطر أو عملية معينة ومن ثم القفز لسطر يسبقه أو يليه, أو يمكننا استخدامه لإكتمال شرط معين تحت تكرار حلقة تكرارية, فمالذي تريد إخبارنا إياه .
ماأريد إخبارك إياه أو أنصحك به هو ( عدم استخدام هذا التصريح بتاتاً !! ), بالتالي سيتوجب عليك إجاد طريقة أخرى تساعدك لعمل المضمون من استخدام الـ Goto.
لكن ( لماذا ؟ ) - الكثير ينصحون بالإستغناء عن استخدام هذا التصريح, وهنالك الكثير أيضاً يقولون ( إن كنت تريد استخدام Goto فإستخدمه, لكن لا تطلب مني تصحيح أخطاء مشروعك !! ) .
إن البرمجة بإستخدام ( OOP ) تعطيك الكثير من الخيارات بما فيها هذا التصريح, لكن لسبب ما تم الإتفاق على أن الـ Goto يجب أن تنقرض !!
وإذا كنت تريد الإجابة الشافية لعدم استخدام هذا التصربح ( فإنه يعد من التصاريح التي تخرج الـ Code عن البرمجة المنطقية ) .
هنا سأقوم بإعطاء مثال على أشكال استخدام الـ Goto وطريقة مماثلة بدون الـ Goto
مثال 1-1 مع الجمل الشرطية " If <> Then, ElseIf <> Then, Else, End If " :
Module Module1
[color= #000000; font-weight: bold;]Private UserName [color= #b1b100;]As String [color= #339933;]= [color= #0000ff;]"BVS"
Sub Main[color= #009900;]([color= #009900;])
Start[color= #339933;]: Console[color= #339933;].Clear[color= #009900;]([color= #009900;])
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Please type your name ."[color= #009900;])
[color= #b1b100;]If Console[color= #339933;].ReadLine[color= #339933;].ToUpper [color= #339933;]= UserName Then
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Welcome {0}"[color= #339933;], UserName[color= #009900;])
[color= #b1b100;]Else
GoTo Start
[color= #990000;]End [color= #b1b100;]If
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #0000ff;]' Your code for another process
[color= #0000ff;] End Sub
[color= #0000ff;]
[color= #0000ff;]End Module
[color= #0000ff;]
[color= #0000ff;]مقابل لهذا الـ Code :
Module Module1
Private UserName [color= #b1b100;]As String [color= #339933;]= [color= #0000ff;]"BVS"
Sub Main[color= #009900;]([color= #009900;])
Dim Signed [color= #b1b100;]As Boolean [color= #339933;]= [color= #000000; font-weight: bold;]False
[color= #b1b100;]Do Until Signed
Console[color= #339933;].Clear[color= #009900;]([color= #009900;])
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Please type your name ."[color= #009900;])
[color= #b1b100;]If Console[color= #339933;].ReadLine[color= #339933;].ToUpper [color= #339933;]= UserName Then
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Welcome {0}"[color= #339933;], UserName[color= #009900;])
Signed [color= #339933;]= [color= #000000; font-weight: bold;]True
[color= #990000;]End [color= #b1b100;]If
Loop
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #0000ff;]' Your code for another process
[color= #0000ff;] End Sub
[color= #0000ff;]
[color= #0000ff;]End Module
[color= #0000ff;]
[color= #0000ff;]مثال 1-2 مع تصريح إختيار حالة " Select Case, Case, End Select " :
Module Module1
Sub Main([color= #009900;])
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Please type a number ."[color= #009900;])
Dim Value [color= #b1b100;]As Object [color= #339933;]= Nothing
Value [color= #339933;]= Console[color= #339933;].ReadLine
[color= #b1b100;]If IsNumeric[color= #009900;](Value[color= #009900;]) Then
Select [color= #b1b100;]Case Value
[color= #b1b100;]Case [color= #cc66cc;]1 To [color= #cc66cc;]100
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Greater than 1 and less than or equals 100"[color= #009900;])
[color= #b1b100;]Case [color= #cc66cc;]101 To [color= #cc66cc;]1000
Big[color= #339933;]: Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Too Big !!"[color= #009900;])
[color= #b1b100;]Case [color= #cc66cc;]1001 To [color= #cc66cc;]10000
GoTo Big
[color= #990000;]End Select
[color= #990000;]End [color= #b1b100;]If
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #990000;]End Sub
[color= #990000;]End Moduleالمقابل لهذا الـ Code :
Module Module1
Sub Main[color= #009900;]([color= #009900;])
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Please type a number ."[color= #009900;])
Dim Value [color= #b1b100;]As Object [color= #339933;]= Nothing
Value [color= #339933;]= Console[color= #339933;].ReadLine
[color= #b1b100;]If IsNumeric[color= #009900;](Value[color= #009900;]) Then
Select [color= #b1b100;]Case Value
[color= #b1b100;]Case [color= #cc66cc;]1 To [color= #cc66cc;]100
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Greater than 1 and less than or equals 100"[color= #009900;])
[color= #b1b100;]Case [color= #cc66cc;]101 To [color= #cc66cc;]1000
Call TellToBig[color= #009900;]([color= #009900;])
[color= #b1b100;]Case [color= #cc66cc;]1001 To [color= #cc66cc;]10000
Call TellToBig[color= #009900;]([color= #009900;])
[color= #990000;]End Select
[color= #990000;]End [color= #b1b100;]If
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #990000;]End Sub
[color= #000000; font-weight: bold;]Private Sub TellToBig[color= #009900;]([color= #009900;])
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Too Big !!"[color= #009900;])
[color= #990000;]End Sub
[color= #990000;]End Moduleمثال 1-3 مع حلقات تكرارية " For 'Declare' As 'Type = 'StartAt' To 'EndAt' Step 'JumpBy' " :
Module Module1
[color= #000000; font-weight: bold;]Private FoundIndices [color= #b1b100;]As [color= #000000; font-weight: bold;]New [color= #990000;]List[color= #009900;](Of String[color= #009900;])
Sub Main[color= #009900;]([color= #009900;])
Dim XYZ[color= #009900;]([color= #cc66cc;]5[color= #339933;], [color= #cc66cc;]5[color= #339933;], [color= #cc66cc;]5[color= #009900;]) [color= #b1b100;]As Integer
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Please type a number that you would like to know its indices by X's
dimension ."[color= #009900;])
Dim Value [color= #b1b100;]As Object [color= #339933;]= Nothing
Value [color= #339933;]= Console[color= #339933;].ReadLine
[color= #b1b100;]If IsNumeric[color= #009900;](Value[color= #009900;]) Then
FoundIndices[color= #339933;].Clear[color= #009900;]([color= #009900;])
[color= #b1b100;]For X [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0 To [color= #cc66cc;]5
[color= #b1b100;]For Y [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0 To [color= #cc66cc;]5
[color= #b1b100;]For Z [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0 To [color= #cc66cc;]5
[color= #b1b100;]If XYZ[color= #009900;](X[color= #339933;], Y[color= #339933;], Z[color= #009900;]) [color= #339933;]= Value Then
FoundIndices[color= #339933;].Add[color= #009900;](String[color= #339933;].Format[color= #009900;]([color= #0000ff;]"X = {0}, Y = {1}, Z = {2}"[color= #339933;], X[color= #339933;], Y[color= #339933;], Z
[color= #009900;])[color= #009900;])
GoTo GetNextX
[color= #990000;]End [color= #b1b100;]If
[color= #990000;]Next
[color= #990000;]Next
GetNextX[color= #339933;]:
[color= #990000;]Next
GoTo ReadData
[color= #b1b100;]Else
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"The given value wasn't in a correct format"[color= #009900;])
[color= #990000;]End [color= #b1b100;]If
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #990000;]Exit Sub
ReadData[color= #339933;]:
[color= #b1b100;]For [color= #990000;]Each It [color= #b1b100;]As String In FoundIndices
Console[color= #339933;].WriteLine[color= #009900;](It[color= #009900;])
[color= #990000;]Next
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #990000;]End Sub
[color= #990000;]End Moduleالمقابل لهذا الـ Code :
Module Module1
[color= #000000; font-weight: bold;]Private FoundIndices [color= #b1b100;]As [color= #000000; font-weight: bold;]New [color= #990000;]List[color= #009900;](Of String[color= #009900;])
Sub Main[color= #009900;]([color= #009900;])
Dim XYZ[color= #009900;]([color= #cc66cc;]5[color= #339933;], [color= #cc66cc;]5[color= #339933;], [color= #cc66cc;]5[color= #009900;]) [color= #b1b100;]As Integer
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"Please type a number that you would like to know its indices by X's
dimension ."[color= #009900;])
Dim Value [color= #b1b100;]As Object [color= #339933;]= Nothing
Value [color= #339933;]= Console[color= #339933;].ReadLine
[color= #b1b100;]If IsNumeric[color= #009900;](Value[color= #009900;]) Then
FoundIndices[color= #339933;].Clear[color= #009900;]([color= #009900;])
Dim X[color= #339933;], Y[color= #339933;], Z [color= #b1b100;]As Integer
X [color= #339933;]= [color= #cc66cc;]0 [color= #339933;]: Y [color= #339933;]= [color= #cc66cc;]0 [color= #339933;]: Z [color= #339933;]= [color= #cc66cc;]0
[color= #b1b100;]Do [color= #b1b100;]While X [color= #339933;]<= [color= #cc66cc;]5
[color= #b1b100;]Do [color= #b1b100;]While Y [color= #339933;]<= [color= #cc66cc;]5
[color= #b1b100;]Do [color= #b1b100;]While Z [color= #339933;]<= [color= #cc66cc;]5
[color= #b1b100;]If XYZ[color= #009900;](X[color= #339933;], Y[color= #339933;], Z[color= #009900;]) [color= #339933;]= Value Then
FoundIndices[color= #339933;].Add[color= #009900;](String[color= #339933;].Format[color= #009900;]([color= #0000ff;]"X = {0}, Y = {1}, Z = {2}"[color= #339933;], X[color= #339933;], Y[color= #339933;], Z
[color= #009900;])[color= #009900;])
Y [color= #339933;]= [color= #cc66cc;]5 [color= #339933;]: Z [color= #339933;]= [color= #cc66cc;]5
[color= #990000;]End [color= #b1b100;]If
Z [color= #339933;]+= [color= #cc66cc;]1
Loop
Z [color= #339933;]= [color= #cc66cc;]0
Y [color= #339933;]+= [color= #cc66cc;]1
Loop
Y [color= #339933;]= [color= #cc66cc;]0
X [color= #339933;]+= [color= #cc66cc;]1
Loop
Call ReadData[color= #009900;]([color= #009900;])
[color= #b1b100;]Else
Console[color= #339933;].WriteLine[color= #009900;]([color= #0000ff;]"The given value wasn't in a correct format"[color= #009900;])
[color= #990000;]End [color= #b1b100;]If
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #990000;]End Sub
[color= #000000; font-weight: bold;]Private Sub ReadData[color= #009900;]([color= #009900;])
[color= #b1b100;]For [color= #990000;]Each It [color= #b1b100;]As String In FoundIndices
Console[color= #339933;].WriteLine[color= #009900;](It[color= #009900;])
[color= #990000;]Next
Console[color= #339933;].ReadLine[color= #009900;]([color= #009900;])
[color= #990000;]End Sub
[color= #990000;]End Module__________________________________
أوّد أن أشكر أستاذنا القدير : السيد ( محمد سامر أبو سلو ) الذي جعلني أصل للإجابة الشافية التي تكلمت عنها ( المنطق في البرمجة ) .
__________________________________
إذا كان لأي منكم Code يحوي هذا التصريح ( Goto ) ويريد التخلص من الـ ( Goto(s) ), أرجو إدراج ( العملية التي تعتمد استخدامه ) و أنا بدوري سأساعدكم على التخلص منه :D .
__________________________________
بالتوفيق .