А ти готовий до Visual Basic.NET? – III

  Ми
завершуємо обговорення теми: що потрібно мати на увазі при перенесенні програм,
написаних на Visual Basic 6.0, в середу Visual Basic.NET. Нагадаємо, цей
перехід буде непростим: так, багато конструкцій Visual Basic 6.0 НЕ
будуть працювати в новій версії системи. Більш того, деякі з них
будуть виконуватися, але інакше, ніж в поточній версії.

Дискусія на цю
тему завершується з тієї простої причини, що час суперечок минув –
фінальна версія Visual Basic.NET з'явиться до кінця року, і якщо ви
вирішили працювати з нею (а куди діватися?), то потрібно вже зараз починати
писати програми в цьому середовищі. Крім того, в червні вийшла версія Visual
Studio.NET Beta 2 (див. врізку "Що нового в Visual Studio.NET Beta 2"),
і стало зрозуміло, що чекати від Microsoft радикальних поступок у відповідь на
критику щодо несумісності Visual Basic 6.0 і Visual Basic.NET і
проблем з перенесенням додатків не доводиться.

Так чи інакше, але у західній пресі дискусійні публікації з
приводу Visual Basic.NET змінилися статтями на традиційну тему: як
працювати з новою версією системи (що і ми збираємося зробити в
наступних номерах "BYTE / Росія").

Разом з тим хотілося б звернути увагу на статтю Рассела Джонса "VB.NET
проти класичного VB "(VB.NET Faces Off Against Classic VB,

http://www.vb-zone.com/free/articles/), в якій він наводить
10 прикладів, що демонструють переваги нової версії. Хотів би
висловити свою незгоду з пафосом цієї статті – представляється
абсолютно очевидним, що кожна нова версія інструменту повинна бути
краще попередньої. Безумовно, в Visual Basic.NET реалізовано багато
дуже цікаві і корисні функції. Але суть-то проблеми полягає в
тому, що більшість нововведень можна було реалізувати, забезпечуючи
сумісність версій. І приклади, наведені американським автором, на
Насправді саме це демонструють.

Зокрема, одним з достоїнств Visual Basic.NET Рассел Джонс
називає те, що тепер порядок обходу елементів управління на формі (він
задається властивістю TabIndex) можна буде задавати за допомогою вбудованої
команди Tab Order. Але ж така команда з'явилася вже давно – ще в
складі Office 97/Visual Basic for Applications. Що заважало включити її
і в Visual Basic?

Звичайно, дуже здорово, що нарешті буде реалізована можливість
динамічного підключення елементів управління до форми в процесі
виконання програми. Але ж і у момент створення Visual Basic 1.0 у
середовищі Windows 3.0 не було ніяких технічних проблем, які могли б
перешкодити реалізувати таку корисну функцію.

Безумовно, поява Visual Basic.NET – дуже важливий момент у
історії цього популярного засобу програмування. (Більш того, весь
пакет Visual Studio.NET знаменує собою якісно новий етап розвитку
засобів розробки на більш високому рівні інтеграції.) У зв'язку з цим
корисно нагадати, що в травні нинішнього року Visual Basic зазначив
десятирічний ювілей – його перша версія з'явилася в 1991 р. і вперше
була продемонстрована в СРСР на виставці Softool "91 (див. у цьому номері
статтю "Basic – етапи великого шляху").

Зміни синтаксису в Visual Basic.NET Beta 2

Перш ніж запропонувати читачеві завершальну частину "Рад", потрібно
розповісти про деякі зміни синтаксису Visual Basic.NET по
порівнянні з першою бета-версією.

Відзначимо, що з самого початку дискусій про Visual Basic.NET ніхто не
заперечував імовірність того, що Microsoft може піти на деякі поступки
критикам. Однак, знаючи стиль роботи корпорації, можна було впевнено
стверджувати, що поступки будуть мінімальними і, можливо, тимчасовими. За
Принаймні, вся десятирічна історія Visual Basic наочно
демонструє, що за зовнішньою уважністю до запитів розробників
ховається досить жорстка стратегічна лінія Microsoft, яка
веде співтовариство програмістів у потрібному корпорації напрямку.

Вихід бета-версії 2 показує, що скільки-небудь значного
числа "відкатів" з боку Microsoft чекати не доводиться. Ось список
деяких нововведень (частина з них треба врахувати при вивченні раніше
опублікованих нами "Рад").

1. Опис масивів, наприклад Dim a (10), буде працювати так само, як
і попередні 40 років існування мови Basic. Іншими словами, в даному
прикладі 10 – це верхня межа індексу масиву, а не кількість його
елементів, як це погрожували зробити в Visual Basic.NET (про це
говорилося в раді 18-м).

2. Операції And, Or, Not і XOR, як і раніше, будуть використовуватися і
для логічних, і для порозрядних операцій. У першій бета-версії Visual
Basic.NET ці операції виконувалися тільки з логічними змінними, а
для цілочисельних вводилися додаткові функції виду BitXXX (BitAnd і
т.д.), які тепер виключені (див. пораду 21-й).

3. У раді 22-му ми говорили про підвищення "інтелектуальності"
логічних операцій. Зокрема, у виразі

a = A1 And A2

операнд A2 не буде аналізуватися, якщо A1 = False. (Операнд A2
може являти собою функцію, яку в будь-якому випадку бажано
обчислити.) Тепер же подібний режим оптимізації потрібно задавати в явному
вигляді, використовуючи спеціальні оператори AndAlso і OrElse, наприклад так:

 

If x > 0 AndAlso x < 10 Then ...
(Друга умова не буде перевірятися, якщо x <= 0)
If x > 0 OrElse x <-10 Then
(Друга умова не буде перевірятися, якщо x> 0)

 

Мені здається, що такий поділ логічних функцій штучно і
не так вже й потрібно, оскільки колізія з висловлюваннями легко дозволяється
послідовним їх обчисленням:

A1 = Function1() A2 = Function2() a = A1 And A2

4. Значення логічної змінної True як і раніше буде мати
цілочисельне значення -1, а не 1, як планувалося (рада 20-й). Мені
здається, це не дуже принципово, оскільки загальна рекомендація
полягає в тому, щоб взагалі не використовувати неявне перетворення типів
даних (у даному випадку цілочисельних і булевих). У цьому зв'язку зазначимо,
що все ж таки було б корисно розділити логічні операції з булевими і
беззнаковими цілими числами.

5. Для порівняння двох об'єктних змінних (при перевірці посилань на
один і той самий об'єкт) як і раніше буде використовуватися ключове слово Is
(Visual Basic 6), а не простий знак рівності = (Visual Basic.NET Beta
1).

6. Тепер всі класи успадковують метод ToString об'єкта System
(Батько всіх об'єктів будівництва. NET), який перетворює числове значення в
текстовий вигляд. Проте тут слід мати на увазі, що роздільник цілої і
дробової частини числа (крапка або кома) буде залежати від національних
установок Windows.

Такий метод дозволить часом істотно спростити код програми.
Наприклад, ось як виглядає функція отримання унікального глобального
коду в Visual Basic 6:

 

Private Declare Function CoCreateGuid Lib _
  "ole32.dll" (buffer As Byte) As Long
Private Declare Function StringFromGUID2 Lib _
  "ole32.dll" (buffer As Byte, ByVal lpsz As Long, _
   ByVal cbMax As Long) As Long

Private Function getGUID () As String
  Dim buffer(0 To 15) As Byte
  Dim s As String
  Dim ret As Long
  s = String$(128, 0)
"Отримує чисельний код
  ret = CoCreateGuid (buffer(0))
"Перетворимо його в текст,
"Використовуючи недокументовані функцію StrPtr
  ret = StringFromGUID2 (buffer(0), StrPtr(s), 128)
getGUID = Left $ (s, ret - 1) "відсікаємо" хвіст "
End Function

 

У Visual Basic.NET все це буде виглядати набагато компактніше:

 

Private Function getGUID () As String
getGUID = "{" & System.Guid.NewGUID.ToString & "}"
End Function

 

7. Для сумісності з функціями Visual Basic 6.0 використовується
простір імен Microsoft.VisualBasic.Compatibility.VB6. Щоб не
доводилося писати такі довгі назви, при роботі зі старими
функціями тепер можна застосовувати спеціальний оператор Import.

8. Раніше для позначення колекцій об'єктів Visual Basic
використовувалося множина імені об'єкта (Parameters, Properties
і т.д.) Тепер колекції будуть називатися довший, але більш зрозуміло:
ParameterCollection, PropertyCollertion.

9. У бета-версії 1 бібліотека ADO.NET мала два важливих простору
імен: System.Data.ADO для загальних провайдерів даних і System.Data.Sql для
провайдера SQL Server. Тепер ці імена замінені відповідно на
System.Data.OleDb і System.Data.SqlClient.

Це далеко не повний перелік усіх змін у синтаксисі Visual
Basic.NET. І можна припустити, що він не остаточний – у фінальній
версії нас можуть чекати нові сюрпризи.

Ще кілька порад по переходу в Visual Basic.NET

Рада 31. Увага при оголошенні змінних. Visual Basic 6
підтримує таку забавну конструкцію з оголошенням змінної всередині
виконуваного коду:

 

Do
  Dim nTotal As Long
  nTotal = nTotal + 1
Loop Until nTotal> 100 MsgBox "Результат =" & nTotal

 

У результаті його виконання видається повідомлення "Результат = 101". А в
Visual Basic.NET ви отримаєте системне повідомлення про помилку – "змінна
nTotal не оголошена ". Причина цього в тому, що в Visual Basic.NET
подібна мінлива працює тільки всередині операторних дужок, в яких
вона визначена (в даному випадку Do Loop). Так що конструкція,
виглядала в Visual Basic 6 досить безглуздої, одержує досить чітку
смислове забарвлення.

До речі, для збільшення змінної на якийсь крок тепер можна застосовувати
такий синтаксис:

nTotal += 1

Рада 32. Відмовтеся від використання Null. Чесно кажучи, я
ніколи не розумів глибокого сенсу парадигми Null, яка
використовувалася для позначення особливого, "нульового" значення змінної
типу Variant. Цілком природно, що зі зникненням Variant з Visual
Basic.NET вилучений і Null.

Рада 33. Готуйтеся до однозначності строкових функцій. Як
відомо, в Visual Basic було два варіанти функцій обробки рядка – з
суфіксом $ і без нього. Наприклад, Left $ повертала змінну типу
рядок, а Left – типу Variant. Тепер залишиться тільки Left – але
повертатися буде рядок.

Рада 34. Використовуйте Visual Basic.NET Update Tool. На думку
Microsoft, цей інструмент, включений до складу Visual Basic.NET,
забезпечить автоматичне перенесення 95% додатків, написаних за допомогою
Visual Basic 6.0, в середу Visual Basic.NET. Він зможе виконати
наступні перетворення синтаксису мови:

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*