Назад

 

1326

10 Советов по переходу на новую версию VB

 

Все уже знают, что Микрософт готовит нам подарок в виде новой версии Visual Studio , которая должна выйти в следующем году. Эта версия имеет название .NET , именно так, с точкой впереди, которую произносят как "дот". Я уже писал с полгода назад о новшествах, которые поджидают нас внутри нового бэйсика. Новая информация продолжает поступать с каждым днем. Сегодня я получил первую бэтта версию .Net . Расчитываю "потрогать" и рассказать вам о ней побольше. А сейчас , информация опубликованная в Visual Basic Programmer Jourmal . Как уже сейчас начать готовится к переходу на новую версию .

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

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

1 Прекращаем использовать свойства и методы по умолчанию

VB6 и более ранние версии позволяют вам писать код использующий свойства и методы, работающие по умолчанию. lblTitle - это Label control:

lblTitle = "Десять советов"

Сейчас это работает, так как свойство Caption является свойством этого контрола по умолчанию. В реальности должно быть написано так :

lblTitle.Caption = "Десять советов"

VB.NET не приемлит такого обращения. Так что это первое, что не будет там работать. Так что, уже прямо сегодня начинаем указывать все свойства, к которым обращаемся

Множество программистов пользуются сокрашениями при использовании обьектов доступа к данным:

rsTitles("DatePublished") = sDate


Знакомая форма записи, не так ли? В самом деле это должно выглядить
так:

rsTitles.Fields("DatePublished") = _

   sDate

Коллекция Fields работает по умолчанию для обьекта Recordset. Базируясь на последней информации - такого типа сокращения будут таки работать и в VB.NET.

2 Контролируйте индексы массивов

Сегодня, обьявляя аррей в VB6 вы получаете один, как бы лишний, элемент . Т.е. строка
Dim sSubjects(5) As String

создаст вам массив из шести элементов начиная с 0
Боюсь, что для VB.NET вам придется переписывать свой код . Там подобное обьявление создаст вам массив из ПЯТИ элементов с индексами от 0 до 4

Потеря последнего элемента в коде легко может привести к неработоспособности программ. Конвертация старого кода в новый стандарт принесет много головной боли. Предлагаю прекратить использовать последний элемент массивов уже теперь. Это не поможет решить проблему со старым кодом, но написанный сегодня вы сможете не править.

3 Не использовать прямых ссылок на контролы

С первой версии Бэйсика контролы на формах имеют статус Public . Нередко в модулях(.bas) находятся строки такого типа:

sTitle = frmArticleEntry.txtTitle.Text

Скажите до свидания. Это больше не работает в VB.NET. Вы можете заставить этот код работать, только если пропишете контрол txtTitle на форме frmArticleEntry как Public Shared. Но это не лучшее решение.

Начиная с четвертой версии профессионалы рекомендуют использовать для доступа к контролам на форме отдельные процедуры - свойства. Код извне формы работает (читает и пишет) в эти контролы через стандартные процедуры

Предположим, на форме frmOptions вы имеете 5 option buttons, названных optFormat(0) - optFormat(4), позволяющих пользователю задать тип репорта . И вам необходимо прочитать эти значения снаружи формы - например из BAS модуля. По старому, это бы выглядело так:

For nIndex = 0 To 4

   If frmOptions.optFormat(nIndex) Then

      nFormatNumber = nIndex

      Exit For

   End If

Next nIndex 

        

Позже , возмождно, вы захотите изменить имена контролов или номера option buttons. Или даже вы вовсе захотите убрать их и поставить комбобокс со списком значений форматов репорта. В этом случае вам прийдется менять такой код не только на самой форме, но и в модуле.

Вместо этого, возможно использование специально созданного свойства формы . Достаточно разместить на форме такой код:

Public Property Get FormatType() As _

   Long

   For nIndex = 0 To 4

      If frmOptions.optFormat(nIndex) _

         Then

         FormatType = nIndex

         Exit For

      End If

   Next nIndex

End Property

Теперь вызов снаружи приобретет понятный и простой вид :

nFormatNumber = frmOptions.FormatType

Если вы соберетесь менять что либо на форме, касательно Format Type, достаточно исправить процедуру свойство . К примеру, как использовать combo box?:

Public Property Get FormatType() As _

   Long

   FormatType = cboFormat.ListIndex

End Property

А код вызова , расположенный снаружи не нуждается в изменениях. В идеале процедура - свойство должна содержить еще и и обработку ошибок. Таким же образом создается и процедура Let, для присвоения значений извне формы. Эта дополнительная работа может принести вам пользу при использовании уже сейчас. Не так ли?

 
4 Точно обьявляйте все параметры ByRef или ByVal

Сегодня , если вы опускаете описание типа передачи параметра ByRef или ByVal , то передача происходит в зависимости от того , что за параметр вы передаете. Внутренние типы (integer, long, Boolean, string, и так далее) передаются по умолчанию ByRef. В остальных случаях передача происходит по значению . Это позволяет, к примеру, передать параметр в процедуру, там его изменить и вернуть назад. Это весьма неряшливая практика, и VB.Net - хороший повод прекратить такое безобразие.

В VB.NET, все параметры передаются ByVal по умолчанию .Чтобы позволить процедуре изменить и вернуть измененный параметр вы должны прямо обьявлять его как ByRef . Это позволит избежать трудно находимых ошибок. Рекомендации на сегодня : точно указывайте как вы передаете параметры ByVal или ByRef. Это работает сейчас, будет работать и впредь.

5 Указывайте значения по умолчанию для всех Optional параметров

VB.NET больше не поддерживает ключевое слово IsMissing . Сейчас оно работоспособно только с Variant типом. Вы можете подставлять значения по умолчанию для параметров, которые указаны, как Optional

Function PhoneLookup(sName As String, _

   sAge As Integer, Optional _

   bVitalStatus As Boolean=True)

В основном IsMissing использовался в старом VB4 коде, который не принимал других опшинал параметров кроме Вариант.

 
6 LineОбьявляйте переменные на отдельных строках

В VB.NET изменились правила обьявления переменных.

Dim sFirstVariable As String, _

   sSecondVariable As Integer

Это работало до сих пор . Больше корректно работать не будет .

Dim nFirstNumber, nSecondNumber As _

   Long

В VB6 и ранее, переменная nFirstNumber принимала Varian тип. В VB.NET обе переменные станут Long. Наконец-то мы приближаемся к стандарту обьявлений переменных в других языках.

Так что обьявляйте переменные по одной на строке и никаких ошибок не будет случаться.

7 Вызовы API функциф придется "обертывать"

Использование АPI в VB и так было , прямо скажем, весьма запутанно . Теперь у вас появится еще один повод писать функции одевающие API вызовы в привычные VB одежды

Будут изменены некоторые типы данных. В данном случае, наиболее важны изменения Integer и Long :
VB6
VB.Net
Size
Integer Short 16 bit
Long Integer 32 bir
нету Long 64 bit

 

Изменения важны, так как API ожидает 32битные аргументы Сейчас это Long, но Long datatype в VB.NET будет иметь 64 bits, так что декларации придется менять.

Есть реальная надежда, что Микрософт вынесет процесс конвертации типов Short - Intehger - long в отдельный инструмент, и процесс этот будет вполне автоматизирован.

 
8 Прекращаем использовать Currency и Variant типы данных

VB.NET больше не поддреживает Currency datatype. Этот тип заменен на Decimal datatype (более предпочтительный в большинстве случаев )

64 bit Long пока недоступен для использования, однако ничто не мешает начать пользоваться Decimal . Вы не можете обьявить переменную как Decimal напрямую, но никто не помешает вам обьявлять Variant и превратить ее в Десимал с помощью функции cDec . VB.NET будет иметь стандартный встроенный тип Decimal.

Variant тоже прекращает существование. Будет специальный Object type для использования там, где сейчас используется Variant . Пытайтесь уже сейчас избегать Variant везде, где это возможно .

9 Возьмите SOAP Toolkit for Visual Studio 6

Концепция Web Services - это часть .NET . Использование протокола , названного Simple Object Access Protocol (SOAP) и базирующегося на XML позволит компонентам связываться через Web. По своей задумке SOAP использует HTTP и безразличен к стандартным firewall и т.д. К тому же, SOAP межплатформенный протокол, что позволяет связывать разные системы.

Сервисы , основынные на SOAP дожлны заменить собой существующие Remote Procedure Call (RPC) В том чисте и Distributed COM (DCOM) станет менее заметен для использования в сетях

Уже сейчас это можно пробовать и набираться опыта. Microsoft раздает свой SOAP тулкит для VS6 , есть там библиотека и для VB. Кстати , свежая версия выложена вчера.
Микрософт не рекомендует пока использовать эту технологию в коммерческих приложениях, так как она находится в стадии разрабтки. но никто же не мешает изучить ее?

 
10 Размещайте логику вне пользовательского интерфейса, используйте для этого классы и компоненты.

Из за изменений в WinForms и Web Forms, масса сегодняшних VB приложений плохие кандадаты на миграцию под .Net Это происходит из за того, что бизнес логика в этих приложениях сильно перемешана с логикой работы интрефейса пользователя.

Как мне видится, конвертация классов под Vb.Net будет куда более простым делом, чем конвертация форм. Так что долой всю бизнес логику из форм. Пишите для этого классы и компоненты.

Ну и в заключение - не так старшен черт, как его малюют. Будет новый весьма неплохой продукт, будем на нем работать!

 

20 ноября 2000 года.

 

 


 

Hosted by uCoz