• Thứ Tư, 17/12/2003 09:57 (GMT+7)

    Khảo sát Visual Basic.NET


    Tên thì gần gũi với Visual Basic 6.0 (VB6.0), nhưng Visual Basic.NET (VB.NET) lại  là phiên bản có nhiều thiết kế mới về kiểu dữ liệu, phương thức truy cập dữ liệu, tính hướng đối tượng…

    Tại sao lại phải thay đổi thiết kế của ngôn ngữ Visual Basic – một trong những ngôn ngữ được sử dụng rộng rãi nhất hiện nay? VB 6.0 được hàng triệu thảo chương viên trên khắp thế giới sử dụng nhờ cú pháp dễ hiểu và khả năng phát triển nhanh. VB 6.0 và các công cụ khác của Microsoft tích hợp trong phiên bản đầu tiên của bộ Visual Studio đã được thiết kế không tính đến Web. Do chậm chân trong lĩnh vực công nghệ Internet và ứng dụng phân tán, Microsoft đã phải bổ sung “chắp vá” cho bộ công cụ Visual Studio  để hỗ trợ môi trường phát triển mới. Khả năng phát triển ứng dụng Web của các công cụ Visual Studio rất hạn chế, phải dùng nhiều kỹ thuật khác nhau để tạo ứng dụng phân tán, không tối ưu cho môi trường Web.

       

    VB.NET giải quyết tất cả các vấn đề trên. Bộ công cụ này đã được thiết kế lại từ đầu để hỗ trợ phát triển dễ dàng ứng dụng Web và client/server trong môi trường phân tán và không kết nối. Hiệu suất và kỹ thuật mới đáng để bạn bỏ thời gian và công sức học công cụ mới này.

    Khác biệt giữa VB 6.0 và VB.NET có thể phân thành hai nhóm như bảng 1:

    • Thay đổi về kỹ thuật cải thiện hiệu suất ứng dụng.

    • Thay đổi trong cú pháp và cách thức lập trình.

     

    Thay đổi về kỹ thuật
    trong VB.NET là yếu tố dẫn đến thay đổi về cú pháp và cách thức lập trình; xuất phát từ mục tiêu kỹ thuật mà Microsoft hướng đến trong phiên bản mới của VB.
    Để VB thống nhất về mặt kỹ thuật với C++ và C#, Microsoft đã phát triển Common Language Runtime (CLR) thành nền tảng chung. VB không còn là công cụ sinh mã giả nữa, CLR làm cho nó trở thành ngôn ngữ hướng đối tượng thực sự và đặt nó ngang cấp với C++ và C#. Về mặt kỹ thuật, một ứng dụng được tạo bởi VB.NET không có gì khác biệt so với ứng dụng tạo bằng C++ hay C#.

     

    Thay đổi cú pháp

    Tuy những thay đổi về kỹ thuật trong VB.NET cực kỳ quan trọng (và rất được hoan nghênh) nhưng lại không dễ nhận biết như những thay đổi trong cú pháp và cách thức lập trình. Chúng ảnh hưởng nhiều đến khả năng  chuyển đổi ứng dụng VB 6.0 sang VB.NET.
    Trong bộ công cụ Studio.Net, Microsoft có cung cấp tiện ích Upgrade Wizard để chuyển đổi ứng dụng VB 6.0 sang VB.NET.

     

    Thay đổi kiểu dữ liệu
    VB.NET đã nói lời chia tay với các kiểu dữ liệu Variant, Short và Long. VB.NET kết hợp  kiểu dữ liệu Object và Variant thành kiểu dữ liệu Object duy nhất. Variant là kiểu dữ liệu mặc định của VB 6.0 được gán cho tất cả các biến không được khai báo kiểu cụ thể. Kiểu Variant còn được gán cho các biến ngoài biến đầu tiên trên cùng một dòng khai báo. Ví dụ dòng khai báo sau:
    Dim ipCount, ipNumber as Integer
    Khai báo biến ipCount là Integer và ipNumber là Variant.
    Kiểu dữ liệu Integer giờ đây là Short (16-bit) và kiểu dữ liệu Long là Integer (32-bit). Kiểu Long giờ đây là số 64-bit. Tiện ích Upgrade Wizard thực hiện rất tốt việc thay các kiểu dữ liệu này.

     

    Tầm ảnh hưởng của biến
    VB 6.0 cho phép tất cả các biến khai báo trong một thủ tục có tầm ảnh hưởng trong toàn thủ tục, nghĩa là một khi biến được khai báo thì nó có thể được dùng ở bất kỳ đâu trong thủ tục. Trong VB.NET, tầm ảnh hưởng của biến bị giới hạn trong khối mà nó được khai báo.
    Ví dụ, trong VB.NET, ví dụ 1 sẽ sinh ra lỗi do biến đi ra ngoài tầm ảnh hưởng khi khối kết thúc (khối được xác định bắt đầu bằng các phát biểu Do, For hay If và kết thúc bằng các phát biểu Loop, Next hay End If). Khi khối For… Next kết thúc với phát biểu Next, biến J vượt khỏi tầm ảnh hưởng vì nó được khai báo bên trong khối này. Bạn có thể tránh điều này bằng cách khai báo tất cả các biến ở đầu thủ tục bất kể chúng được dùng ở đâu trong thủ tục.
    Upgrade Wizard sẽ lập báo cáo bất kỳ khai báo nào mà tầm ảnh hưởng có khả năng bị vi phạm nhưng không tự động sửa.

     

    Truy Cập Dữ Liệu

    Visual Basic 6.0 hỗ trợ ADO, RDO và DAO cho mục đích truy cập dữ liệu. VB.NET đưa ra một phiên bản ADO cải tiến là ADO.NET, nó cải tiến các không gian tên (namespace) để làm việc hiệu quả hơn với các tập dữ liệu không kết nối.
    VB.NET hỗ trợ ADO, DAO và RDO (có một số sửa đổi nhỏ), nhưng có một khác biệt quan trọng – VB.NET không hỗ trợ việc liên kết dữ liệu DAO và RDO tới các điều khiển, điều khiển dữ liệu hay RDO User Connection.

    Nếu bạn có dùng DAO hay RDO cùng với các điều khiển liên kết dữ liệu trong các ứng dụng VB 6.0 thì không nên nâng cấp lên VB.NET, nếu không bạn sẽ phải mất rất nhiều thời gian để viết lại các mã lệnh liên kết dữ liệu tới các điều khiển. Upgrade Wizard gần như không thể dịch mã lệnh truy xuất dữ liệu cũ và chuyển nó sang ADO.NET hay mã lệnh có thể chấp nhận trên VB.NET. Bạn phải chuyển thủ công các mã lệnh không được hỗ trợ.

     

    Liên Kết
    Liên kết trước (early binding) là cách thức khai báo một biến và gán nó cho một thể hiện của một lớp, khởi tạo đối tượng và nạp vào bộ nhớ ngay khi ứng dụng chạy. Ví dụ 2(a) dùng cách thức liên kết trước khai báo biến rdRecordset như là một ADODB.Recordset.


    Liên kết sau (late binding) thì ngược lại, khai báo biến như là một đối tượng và gán nó cho một thể hiện của một lớp lúc thực thi. Liên kết sau thích hợp cho mô đun ít dùng đến và chỉ nạp thể hiện của lớp vào bộ nhớ khi cần. Ví dụ 2(b) dùng cách thức liên kết sau khai báo một biến và liên kết nó với một thể hiện của lớp ADODB khi cần dùng đến.

    Trình Upgrade Wizard có thể chuyển đổi các thuộc tính và phương thức (method) của các biến có kiểu mạnh nên hỗ trợ chuyển đổi dễ dàng các đối tượng liên kết trước nhưng không thể chuyển đổi các đối tượng liên kết sau.

     

    Tham Số Byval Và Byref

    Mặc định trong VB 6.0, các biến được truyền đến một hàm hay thủ tục mà không xác định cụ thể là ByRef hay ByVal thì được gán tự động dựa trên kiểu tham số của chúng. Tất cả kiểu dữ liệu cơ bản như Integer, String, Boolean và Variant đều được gán là ByRef. Các kiểu dữ liệu tham chiếu đối tượng và do người dùng định nghĩa được ấn định là ByVal.
    VB.NET mặc định gán tất cả các tham số là ByVal trừ khi chúng được khai báo rõ ràng là ByRef. Điều này có thể gây nên các vấn đề nghiêm trọng trong ứng dụng.

    Ví dụ, trong VB 6.0, ví dụ 3(a) thay đổi giá trị của chuỗi được gửi đến do tham số shString được truyền tự động là ByRef. Trong VB.NET, ví dụ 3(a) giữ nguyên chuỗi không thay đổi vì tham số được truyền mặc định là ByVal. Để thay đổi chuỗi này, tham số shString phải được khai báo tường minh là ByRef như trong ví dụ 3(b).

     

    Các thuộc tính mặc định

    Trước đây, người lập trình Visual Basic thường dùng các thuộc tính mặc định như là cú pháp viết tắt. Ví dụ, thuộc tính mặc định của đối tượng Textbox là Text, hai câu lệnh trong ví dụ 4(a) có cùng chức năng (Text1 là tên của đối tượng Textbox).
    VB.NET không còn hỗ trợ các thuộc tính mặc định cho các đối tượng không có tham số, nhưng vẫn hỗ trợ đối với các đối tượng có tham số. Ví dụ, không dùng thuộc tính mặc định, ví dụ 4(b) được viết lại như ví dụ 4(c).

    Ví dụ 4(b) có hai thuộc tính mặc định: Fields và Value. Thuộc tính Fields yêu cầu tham số tên field (tên một cột trong bảng dữ liệu). Thuộc tính Value không yêu cầu tham số; vì vậy trong VB.NET, nó phải được khai báo rõ ràng. Ví dụ 4(d) sẽ được dịch đúng trong VB.NET.

    Trình Upgrade Wizard có thể xác định thuộc tính mặc định cho hầu hết các đối tượng, nhưng không phải tất cả. Nói chung, việc dùng các phát biểu và tên thuộc tính tường minh làm cho mã lệnh rõ ràng, dễ đọc và là thói quen lập trình tốt.

     

    Kiểu dữ liệu double
    Trong VB 6.0, thảo chương viên hay dùng kiểu dữ liệu Double để lưu dữ liệu ngày (date). Ở cấp độ bên dưới, VB 6.0 chuyển đổi và lưu ngày theo kiểu Double. VB.NET thì khác, nó dùng kiểu dữ liệu Date để lưu dữ liệu ngày.
    Trình Upgrade Wizard có khó khăn khi xác định nội dung của một biến Double. Xét đoạn mã sau:

    Dim dpDate as Double

    DpDate = opRecordset (“CancellationDate”)


    Upgrade Wizard không thể xác định field CancellationDate thật sự là kiểu dữ liệu Date và đổi mã thích hợp. Thay vì vậy, trình Wizard ghi nhận các trường hợp dùng kiểu Double và khuyến cáo nếu bạn dùng để lưu dữ liệu ngày thì phải đổi kiểu dữ liệu thành Date.


    Mảng
    Một trong những điểm thân thiện của VB 6.0 và các phiên bản trước đó là khả năng tạo mảng với cận trên và cận dưới. Tính năng này đã bị loại bỏ nhằm đảm bảo khả năng tương tác với các ngôn ngữ khác trong nền .NET.

    VB.NET có cơ chế kiểm soát các mảng không bắt đầu từ 0 (zero), tuy nhiên chậm và phức tạp. Do vậy bạn nên khai báo lại cho các mảng bắt đầu từ 0 (zero) để dùng lớp mảng cơ bản nhanh hơn nhiều. Đoạn mã VB 6.0 trong ví dụ 5(a) tạo một mảng 10 phần tử Integer bắt đầu từ 3, và ví dụ 5(b) tính tổng các phần tử thứ nhất, thứ hai và thứ ba của mảng. Ví dụ 5(c) thực hiện trong VB.NET với mảng bắt đầu từ 0 (zero), và đoạn mã tính tổng ba phần tử đầu tiên của mảng được thể hiện ở ví dụ 5(d). 
    ReDim là lệnh thông dụng trong VB 6.0 dùng để gán lại một biến Variant như là một mảng. VB.NET chỉ cho phép ReDim một biến đã được khai báo như là một đối tượng, bạn không thể ReDim một biến chưa được khai báo như trong VB 6.0.
    Trình Upgrade Wizard sẽ ghi nhận những đoạn mã có dùng mảng không bắt đầu từ 0 (zero) nhưng không thể chuyển đổi tự động.

     

    True, False và các giá trị hằng
    VB 6.0 ấn định -1 cho giá trị luận lý True (đúng), không tuân theo quy ước của các ngôn ngữ khác. VB.NET sửa lại điều bất thường này và ấn định 1 cho giá trị luận lý True. Điều này có thể sinh ra một số vấn đề trong mã lệnh nâng cấp nếu bạn thực hiện kiểm tra với giá trị cụ thể thay vì True hay False trong các phát biểu If. Ví dụ 6(a) làm việc nếu bạn kiểm tra giá trị luận lý bpCheck là True trong VB 6.0. Đoạn mã viết lại cho VB.NET được thể hiện trong ví dụ 6(b). Bạn có thể loại bỏ sự không nhất quán này bằng cách dùng từ khoá True thay cho thể hiện số của True; xem ví dụ 6(c).

    Tương tự, nên dùng biến hằng thay cho thể hiện số của tham số. Ví dụ, đối tượng ADODB có nhiều phương thức yêu cầu bạn phải truyền tham số hằng. Ví dụ 6(d) và 6(e) thực hiện giống hệt nhau, nhưng cái đầu dùng biến hằng còn cái sau dùng thể hiện số của biến hằng. Dùng biến hằng thay cho thể hiện số sẽ đảm bảo ứng dụng của bạn tương thích với các phiên bản mới của đối tượng.

    Trình Upgrade Wizard không thể phát hiện ý nghĩa của mã lệnh không dùng các từ khoá True và False khi so sánh các giá trị luận lý. Tuy nhiên, nó sẽ ghi nhận đoạn mã trong báo cáo kết quả chuyển đổi để cho bạn biết có thể có vấn đề và nên xem lại.

     

    Cú pháp cũ bị loại bỏ


     Bảng 2: Các từ khoá VB 6.0 không còn được

    hỗ trợ trong VB.NET.

    Để đảm bảo tính tương thích ngược, các phiên bản Visual Basic trước đây có chứa cú pháp cũ thể hiện các kỹ thuật lập trình xa xưa. Các từ khoá trong bảng 2 đã bị loại bỏ khỏi VB.NET.

     

    Tóm Lại

    VB.NET là một ngôn ngữ lập trình mới, nó kết hợp được các tính năng phát triển nhanh của VB 6.0 với năng lực của C++. Microsoft hy vọng những nhà lập trình Visual Basic sẽ chấp nhận ngôn ngữ này; một phần bắt nguồn từ sự cùng tên. Tuy cần có thời gian để nắm vững những thay đổi về cú pháp và cách thức lập trình, nhưng những ưu điểm của VB.NET tỏ ra xứng đáng với thời gian bỏ ra.

    Thanh Phong
    DDJ 03/2002

     

     

    ID: A0303_70