الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Goto's Statement, حاول الإستغناء عن استخدام هذا التصريح .

بدأه Bashar Rabat في 19 يناير 2009 · 0 رد · 399 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1

مرحباً أخواني الكرام .

في الحقيقة, هذا الموضوع هو موضوعي الأول في اللغة العربية , لذلك اعذروني إن كنت نسيت أن أذكر جهة من جهات موضوعنا التالي.

في هذا الموضوع سنتكلم عن التصريح ( 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 .

__________________________________

بالتوفيق .

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 19 يناير 2009 في 03:13

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

مواضيع مشابهة