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

       

К чему все эти сложности?


Равноправие не окупается. Давайте еще раз зададимся вопросом: зачем было выдумывать все эти глобальные, модульные и локальные переменные, области видимости, эффект затенения и прочее? Не проще ли было все переменные и другие элементы сделать равноправными, тогда, глядишь, и никаких областей, эффектов и прочих сложностей не понадобилось бы? Давайте попробуем так и сделать. Для простоты будем рассуждать только о переменных.

Итак, сделаем все переменные равноправными. И пусть безо всяких сложностей все переменные будут видны во всем п?оек?е, ?руг?ми ?лов?ми,?по ?аше? те?мин?лог?и, ?уст? вс? он? бу?ут ?лоб?льн?ми.?Тог?а б?льш?е п?оек?ы, ?озд?вае?ые ?ома?дой про?рам?ист?в, ?уде? кр?йне?тяж?ло ?тла?ива?ь, ?ак ?ак ?рид?тся?сле?ить?за ?ем,?что?ы н?где?не ?стр?тил?сь ?дин?ков?х и?ен ?что?и очень неудобно, кстати). Кроме этого, при отладке любой процедуры придется следить за тем, как бы случайно не испортить значение той или иной глобальной переменной, от которой зависит работа других процедур. Во многом потеряют смысл процедуры с параметрами, так как вся их прелесть в том как раз и состоит, чтобы «развязать» создателя процедуры и проект, чтобы сделать из процедуры «вещь в себе», надежно защищенную от «помех» со стороны проекта.

Итак, сделать все переменные глобальными нельзя. Тогда, может быть, сделать их все локальными? Тоже не получится, так как это крайне затруднит обмен информацией между процедурами и модулями. А без этого обмена проект рассыплется на отдельные процедуры, как карточный домик. Вот и получается, что переменные нужны разные – ? гл?бал?ные?и л?кал?ные? и ?ику?а от эт?го не д?неш?ся.?

Пр?дет?я р?зре?ать?и о?нои?енные п?ременные. А?раз так? то?нуж?ы и обл?сти?вид?мос?и и?эффект ?ате?ени?.

Чем л?кал?нее? те? лу?ше. Вст?ет вопр?с: ?аку? об?аст? видимо?ти ?ам выби?ать?для?каж?ой конкретной переменной?  Объявлять ли ее глобальной, модульной или локальной? Здесь совет один – любую переменную делайте как можно более локальной, пусть ее область видимости будет как можно меньше. Если ее значение нужно только в одной процедуре и больше нигде, делайте ее локальной. Если ее значение нужно в нескольких процедурах одного модуля, а в других модулях нет, то делайте ее модульной. И только если значение переменной нужно в нескольких модулях, делайте ее глобальной. Такой подход обеспечит вашему проекту максимальную надежность и удобство в отладке.


Процедуры с параметрами – путь к свободе. Второй совет – вместо процедур без параметров используйте процедуры с параметрами. Покажу на простом примере, что я имею в виду.

Задача:  Переменная равна 3. Нужно увеличить ее на 2 и результат напечатать.

Дадим переменной имя A. Вот простейшая программа для решения задачи:

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

        Dim A As Integer = 3

        A = A + 2

        Debug.WriteLine(A)



End Sub

Однако простейшая программа нас не устраивает. Нам нужно показать всю прелесть параметров. Для этого мы будем действовать так же, как действовал Том Сойер в книге «Приключения Гекльберри Финна». Ему нужно было освободить негра Джима из ветхого сарайчика, где того держали взаперти. Вместо того, чтобы просто отпереть дверь имевшимся у него ключом, Том придумал для освобождения массу ненужных вещей вроде веревочной лестницы, отпиленной ножки кровати и т.п. И все для того, чтобы побег из заточения был обставлен «как положено».

Вот и мы сейчас усложним проект, чтобы все было «как положено». Прежде всего, посчитав, что наша процедура слишком длинная, разобьем ее на две процедуры П1 и П2, первая из которых увеличивает переменную на 2, а вторая распечатывает результат.

Dim A As Integer = 3

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

        Увеличиваем_на_2()

        Печатаем()

End Sub

Private Sub Увеличиваем_на_2()

        A = A + 2

End Sub

Private Sub Печатаем()

        Debug.WriteLine(A)

End Sub

Программа работает. Но нам этого мало. Будем усложнять дальше. Добавим к нашим процедурам параметры:

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

        Dim A As Integer = 3

        Увеличиваем_на_2(A)

        Печатаем(A)

End Sub

Private Sub Увеличиваем_на_2(ByRef A1)      'А1 - переменная, которую увеличиваем

        A1 = A1 + 2



End Sub

Private Sub Печатаем(ByVal A2)                      'А2 - переменная, которую распечатываем

        Debug.WriteLine(A2)

End Sub

В чем смысл всех этих ужасных усложнений, этого превращения мухи в слона? Конечно, в нашем простейшем случае в них нет никакого смысла. Но когда дело дойдет до сложных проектов и процедур, здесь смысл прямой. Поэтому разберемся.

Зачем делить проект на мелкие процедуры, я уже раньше рассказывал. А вот зачем понадобились параметры?

Если ваша процедура сложная и делает что-нибудь полезное, то вы вполне можете захотеть, чтобы она использовалась и в других проектах. Но в другом проекте переменные скорее всего имеют другие имена, например, вместо A там используется B. В этом случае вам придется переписывать текст процедуры (в нашем конкретном случае везде заменить A на B). А переписывать не хочется. В общем, процедура теряет свою универсальность. Чтобы и не переписывать, и универсальность не потерять, надо применить параметры.

Параметру вы придумываете то имя, которое вам заблагорассудится (A1, A2), а не то, что вы видите в программе (A). И обратите внимание, что нашим процедурам с параметрами абсолютно все равно, что переменная имеет имя A. Нигде внутри процедуры это имя не встречается, поэтому процедура уверенно делает свое дело, каково бы оно ни было. Да и программисту как-то понятней, чем занимается процедура, если он видит в ее заголовке список параметров с удобными именами, да еще и с подробными комментариями. Это лучше, чем глядеть в тексте процедуры на чужую переменную A и вспоминать, что это, черт возьми, за переменная и в чем ее смысл.

В общем, совет такой – с глобальными и модульными переменными работайте по возможности через параметры. Что значит «по возможности»? А то, что некоторые такие переменные буквально пронизывают все процедуры проекта и организовывать для них в каждой процедуре параметры – та овчинка, которая не стоит выделки. Обычно таких переменных бывает немного и их легко запомнить.


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