ПОНЯТНО О Visual Basic NET (том 2)

Пример процедуры пользователя


Я пояснил применение процедуры пользователя на бессмысленном примере. А теперь – пример программы, имеющей реальный смысл. Если вы хорошо поймете его по тексту, то проверять на компьютере не обязательно.

Мы с вами уже написали процедуры, которые рисуют человечка, паровозик, звездное небо, ковер и т.п. Пусть теперь мы хотим создать проект – альбом рисунков, создаваемых нашими процедурами. В нем столько кнопок, сколько рисунков. По нажатии на каждую кнопку что-нибудь рисуется. Пусть для краткости в нашем проекте при нажатии на первую кнопку рисуется пушка (кружочек-колесо и палочка-ствол), а при нажатии на вторую – Буратино (кружочек-голова и палочка-нос). Добавим еще одну кнопку – для стирания. Назовем ее «Стираем». Вообще-то, для стирания достаточно процедуры из одного оператора:

Private Sub Стираем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles Стираем.Click

        Граф.Clear(Color.White)

End Sub

но нам бы хотелось, чтобы это было не просто стирание, а что-нибудь более экстравагантное, причем с музыкальным сопровождением. Посмотрите, что у нас получилось:

1 вариант программы:

'Процедура стирания:

Private Sub Стираем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles Стираем.Click

        Beep()                                                                      'Короткий звуковой сигнал

        'Постепенно стираем рисунок, не спеша заполняя форму белыми эллипсами:



        For i = 1 To 10000

            Граф.FillEllipse(Brushes.White, Me.Width * Rnd(), Me.Height * Rnd(), 10, 50)

        Next

        Граф.Clear(Color.White)                                          'Окончательное стирание, так как эллипсов не хватает

        Плеер.FileName = "D:\WINNT\Media\tada.wav"      'Играем мелодию

End Sub

'Рисуем пушку:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Граф.DrawEllipse(Pens.Black, 100, 100, 200, 200)      'Колесо


        Граф.DrawLine(Pens.Black, 20, 300, 350, 20)              'Ствол
End Sub
'Рисуем Буратино:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Граф.DrawEllipse(Pens.Black, 100, 100, 200, 200)      'Голова
        Граф.DrawLine(Pens.Black, 300, 200, 400, 200)          'Нос
End Sub
2 вариант программы. Все хорошо. Мы обошлись без процедур пользователя. Но теперь мы хотим улучшить проект. Пусть нам лень каждый раз перед нажатием на кнопку рисунка нажимать на кнопку стирания. Давайте сэкономим одно нажатие и сделаем так, чтобы при нажатии на кнопку любого рисунка сначала происходило стирание, а уж потом рисование. Для этого достаточно было бы операторы процедуры стирания дописать наверх каждой процедуры рисования:
'Рисуем пушку:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer
        Beep()   
        For i = 1 To 10000
            Граф.FillEllipse(Brushes.White, Me.Width * Rnd(), Me.Height * Rnd(), 10, 50)
        Next
        Граф.Clear(Color.White)           
        Плеер.FileName = "D:\WINNT\Media\tada.wav"  
        Граф.DrawEllipse(Pens.Black, 100, 100, 200, 200)      'Колесо
        Граф.DrawLine(Pens.Black, 20, 300, 350, 20)              'Ствол
End Sub
'Рисуем Буратино:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i As Integer
        Beep()
        For i = 1 To 10000
            Граф.FillEllipse(Brushes.White, Me.Width * Rnd(), Me.Height * Rnd(), 10, 50)
        Next
        Граф.Clear(Color.White)            
        Плеер.FileName = "D:\WINNT\Media\tada.wav"  
        Граф.DrawEllipse(Pens.Black, 100, 100, 200, 200)      'Голова
        Граф.DrawLine(Pens.Black, 300, 200, 400, 200)          'Нос
End Sub
3 вариант программы. Результат достигнут. Но за счет удлинения программы. Как бы убить двух зайцев: и программу не удлинять и лишних кнопок не нажимать? Очень просто – так же, как мы это делали в бессмысленной программе, применив процедуру пользователя:


'Процедура пользователя для стирания рисунка:
Sub Стирание_старого_рисунка()
        Dim i As Integer
        Beep()   
        For i = 1 To 10000
            Граф.FillEllipse(Brushes.White, Me.Width * Rnd(), Me.Height * Rnd(), 10, 50)
        Next
        Граф.Clear(Color.White)        
        Плеер.FileName = "D:\WINNT\Media\tada.wav" 
End Sub
'Рисуем пушку:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Стирание_ старого_рисунка()
        Граф.DrawEllipse(Pens.Black, 100, 100, 200, 200)      'Колесо
        Граф.DrawLine(Pens.Black, 20, 300, 350, 20)              'Ствол
End Sub
'Рисуем Буратино:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Стирание_ старого_рисунка()
        Граф.DrawEllipse(Pens.Black, 100, 100, 200, 200)      'Голова
        Граф.DrawLine(Pens.Black, 300, 200, 400, 200)          'Нос
End Sub
Как видите, здесь в каждой из двух процедур рисования мы заменили длинный фрагмент стирания оператором Стирание_старого_рисунка(), который обращается к одноименной процедуре пользователя.
Процедуры пользователя улучшают читабельность. Итак, процедуры пользователя укорачивают программы. Но не только это. Они еще делают их более «читабельными», то есть более понятными при чтении, когда нужно быстро схватить общий смысл процедуры. Вообразите, что эта программа чужая и вы ее читаете впервые. Сравните в этом аспекте текст процедуры рисования пушки из 2 и 3 вариантов программы. Очевидно, что вы быстрее разберетесь, что делает эта процедура, именно в 3 варианте. Но этого не произойдет, если вы неудачно назовете процедуру пользователя. Если вы вместо имени Стирание_старого_рисунка употребите имя Крутая_процедурка, то не о какой понятности и читабельности не может быть и речи.
Call. Есть еще один способ обратиться к процедуре. Вместо оператора 
Стирание_старого_рисунка()
можно написать оператор
Call  Стирание_старого_рисунка()
Смысл этих двух операторов совершенно одинаков. Вторым способом часто пользовались раньше. С английского слово «Call» переводится «Вызов».

Содержание раздела