Việc kéo thả các đối tượng như textbox, checkbox... với cách lập trình trực quan (visual) đã làm tăng tốc độ lâp trình đáng kể. Sau khi kéo thả, các đoạn code được sinh ra tương ứng với mỗi control được kéo vào. Ví dụ:
trong VS2008...
'
'cmdDelete
'
Me.cmdDelete.Appearance.Font = New System.Drawing.Font("Consolas", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.cmdDelete.Appearance.Options.UseFont = True
Me.cmdDelete.Image = Global.tSFW.My.Resources.Resources.remove
Me.cmdDelete.Location = New System.Drawing.Point(673, 38)
Me.cmdDelete.Name = "cmdDelete"
Me.cmdDelete.Size = New System.Drawing.Size(195, 22)
Me.cmdDelete.StyleController = Me.LayoutControl1
Me.cmdDelete.TabIndex = 2
Me.cmdDelete.Text = "Xóa thông tin"
Việc gen code có nhiều khái niệm và cũng có nhiều cơ chế, mục đích khác nhau.
Ví dụ, một ngôn ngữ lập trình có trình biên dịch xử lý mã nguồn chương trình thành mã máy cũng gọi là gen code.
Bài viết này mục đích nói đến vấn đề gencode trong lập trình ứng dụng quản lý.
Các bạn có thể search với từ khóa: autocode, gencode... nhiều bài viết về nó, nhiều tools free ví dụ.
Ở đây, tôi xin đưa ra một số nguyên tắc gencode nhằm giúp các bạn tiếp cận dễ hơn với cách lâp trình nhanh gọn này.
1. Đầu tiên, các bạn phải xây dựng một vài lớp mẫu làm chuẩn. Thường chúng ta xây dựng theo mô hình 3 Tier/ 3Layer.
Nói chung, các kiểu này giúp chúng ta phân tách rõ ràng giữa việc truy cập dữ liệu với giao diện người dùng.
Có thể lấy làm mẫu sau:
a. Information|Value Object|...: là một lớp mapping (ánh xạ) từ table ở database qua.
Ví dụ:
#Region "Class Mapping of Table tblHang"
Public Class Class_tblHang_ValueObject
#Region "Vars"
Private MyVar_IdHang As Integer = 0
Private MyVar_TenHang As String = ""
Private MyVar_Serial As String = ""
Private MyVar_DonGia As Single = 0
Private MyVar_ThoiHanBaoHanh As String = ""
Private MyVar_TrangThai As String = CType("Chưa Bảo Hành", String)
Private MyVar_MoTa As String = ""
Private MyVar_IdNhaCungCap As Integer = 0
Private MyVar_ThoiHanBaoHanhNCC As String = ""
Private MyVar_IsActive As Boolean = True
#End Region
End Class
#End Region
Đó là một ví dụ cho 1 table tblHang với các column tương ứng.
Việc đảm bảo các thuộc tính cho các field ở table sẽ tùy theo thói quen của bạn mà xây dựng thêm để bổ sung.
b. Các bạn hãy xây dựng thêm một lớp nữa để xử lý các nghiệp vụ của table. Ở đây, tôi xin đưa 1 ví dụ nhỏ:
Imports System.Data.SqlClient
#Region "Class Mapping of Table tblHang"
Public Class Class_tblHang
#Region "Select All"
''' <summary>
''' Get All Rows in tblHang and return DalaTable
''' </summary>
Public Function Function_SelectAllRows() As DataTable
Dim _Query As String = String.Format("select * from [tblHang]")
Dim _SqlParameters As SqlParameter() = New SqlParameter() {}
Return MyVar_Connection.Function_ExecuteSelectQuery(_Query, _SqlParameters)
End Function
''' <summary>
''' Get All Rows in tblHang and return array Value Object
''' </summary>
Public Function Function_SelectAllValueObject() As Class_tblHang_ValueObject()
Dim _DataTable As DataTable
Dim _tblHang_ValueObject() As Class_tblHang_ValueObject
_DataTable = Me.Function_SelectAllRows
ReDim _tblHang_ValueObject(_DataTable.Rows.Count - 1)
If (_DataTable.Rows.Count > 0) Then
For _i As Integer = 0 To _DataTable.Rows.Count - 1
_tblHang_ValueObject(_i).ptyIdHang = CType(_DataTable.Rows(_i).Item("IdHang"), Integer)
_tblHang_ValueObject(_i).ptyTenHang = CType(_DataTable.Rows(_i).Item("TenHang"), String)
_tblHang_ValueObject(_i).ptySerial = CType(_DataTable.Rows(_i).Item("Serial"), String)
_tblHang_ValueObject(_i).ptyDonGia = CType(_DataTable.Rows(_i).Item("DonGia"), Single)
_tblHang_ValueObject(_i).ptyThoiHanBaoHanh = CType(_DataTable.Rows(_i).Item("ThoiHanBaoHanh"), String)
_tblHang_ValueObject(_i).ptyTrangThai = CType(_DataTable.Rows(_i).Item("TrangThai"), String)
_tblHang_ValueObject(_i).ptyMoTa = CType(_DataTable.Rows(_i).Item("MoTa"), String)
_tblHang_ValueObject(_i).ptyIdNhaCungCap = CType(_DataTable.Rows(_i).Item("IdNhaCungCap"), Integer)
_tblHang_ValueObject(_i).ptyThoiHanBaoHanhNCC = CType(_DataTable.Rows(_i).Item("ThoiHanBaoHanhNCC"), String)
_tblHang_ValueObject(_i).ptyIsActive = CType(_DataTable.Rows(_i).Item("IsActive"), Boolean)
Next
End If
Return (_tblHang_ValueObject)
End Function
#End Region
End Class
#End Region
Như các bạn thấy, ở đây có vài phương thức, giúp cho các bạn thực hiện thao tác truy vấn dữ liệu từ table.
c. Cuối cùng, ta xây dựng giao diện người dùng & code behind của nó...
Cái này, tùy vào mỗi bạn sẽ có thói quen khác nhau mà viết. Nhưng giống như mình đã nói ở đầu bài viết, việc tạo giao diện thế nào thì không nhắc đến, chỉ nói đến 1 điều là, bạn phải tuân thủ cú pháp giao diện của VS.NET. Code behind thì các bạn cố gắng xây dựng các mẫu thật tốt và đạt được khả năng đúng với nhiều trường hợp.
VD:
- đối với kiểu dữ liệu là char, nchar, varchar, nvarchar... thì bạn nên tạo ra control là textbox, textedit...
- đối với kiểu dữ liệu là numbers thì nên tạo control xử lý số: caledit, calbox...
- đối với kiểu dữ liệu là ngày tháng, bạn nên tạo control: dateedit, datecontrol....
...
Và cố gắng tùy chọn kích thước của control cho phù hợp với độ dài của dữ liệu.
Sắp xếp chúng, chọn fonts chữ cho hợp lý....
Ở đây, tôi có sẵn một module 3layer (đã bổ sung các điều kiện mới cho phù hợp) gồm 1 lớp mapping RO, 1 lớp bussiness, 2 form về quản lý & tạo mới đối tượng, các bạn có thể tải về để xem thử. Bên sau nó, có code xử lý được sinh tự động, theo một qui luật nhất định.
http://www.mediafire.com/?o9fnredlpepoeed
(Các bạn có thể view code của nó, nhưng để load giao diện, phải setup gói devexpress)
2. Từ các lớp mẫu đã có, các bạn xây dựng một qui luật cho việc tạo các lớp đó.
Cố gắng tạo càng bao quát càng tốt. Việc đó giúp cho bạn thoải mái trong việc lựa chọn kiểu dữ liệu của fields trong table, thoải mái trong việc xử dụng lại các lớp đã được sinh ra.
Như trong các file tôi đã up, có lớp Class_tblHang. Lớp đó gồm có rất nhiều hàm sẵn có, phục vụ được nhiều thao tác mà các bạn có thể cần để xử lý với table tblHang (các bạn xem lại các fields ở bên trên).
*Chú ý: các câu lệnh của tôi ít khi sử dụng thao tác với Store procedure. Nguyên nhân là vì nếu dùng SP tôi ít khi kiểm soát được code mình muốn viết.
Việc sử dụng sql query & SP là tùy vào bạn. Nhưng tôi thấy, kết hợp các công cụ, các kiểu lệnh lại là một lựa chọn phù hơn nhất.
"Đừng chú ý quá nhiều vào một điều gì đó, hãy nắm ý đừng nắm hình..."
1. Mục đích:
Trả lờiXóaHiện nay, việc xây dựng 1 ứng dụng quản lý với Window Form hoặc Web Form ngày càng phổ biến và thiết thực cho công tác quản lý của mọi tổ chức.
Quá trình xây dựng ứng dụng không thể nào tránh khỏi những thao tác lặp đi lặp lại, đó là:
Xây dựng các đoạn Code phục vụ cho việc thực hiện các thao tác Select, Add new, Update, Delete... đối với 1 Table trong Database (phần lớn, ta phải là là với các Table có chức năng làm danh mục. Ví dụ: trong ứng dụng Quản lý Nhân sự, ta có Table tblNhanVien. Việc xây dựng các Class theo mô hình 3 lớp gồm UI, Bussiness, Data Access, Mapping Object... để thao tác với Table đó sẽ làm mất nhiều thời gian cho việc lập trình.
Với mong muốn có thể xây dựng ứng dụng nhanh hơn, chúng tôi đã hướng tới một đề tài khả thi trong thực tế, đó là phải Xây dựng một ứng dụng có khả năng Tự động viết ra các đoạn Code thao tác với các Table có chức năng làm danh mục trong các chương trình quản lý.,
2. Nội dung:
Chương trình phải làm được các chức năng sau:
VD: Ta có 1 Database mang tên QUANLYBAOHANH, có
Table tblHang (IdHang, TenHang, Serial, DonGia, ThoiHanBaoHanh,TrangThai,MoTa,ThoiHanBaoHanhNCC,IdNhaCungCap,IsActive)
Ngôn ngữ lập trình được sử dụng là Visual Basic.NET
a. Tạo ra được một lớp Object Relational Mapping (ORM), ánh xạ các column trong Table của Database: lớp Value Object hoặc Infor...
Ứng dụng phải tạo được một Class Mapping với Table tblHang.
Việc mapping phải đảm bảo các yếu tố:
* Danh sách column
* Thuộc tính của mỗi column (Identify, Allow Nulls, Length, Data Type...)
* Danh sách các Keys, Constraints...
b. Tạo ra được một lớp có khả năng thực hiện các Nghiệp vụ xử lý: lớp Bussiness
Ứng dụng phải tạo ra một Class Bussiness có khả năng thưc hiện các lệnh nhằn thao tác với Table tblHang như: Insert, Update, Select, Delete...
Việc xây dựng cần bao quát nhiều trường hợp yêu cầu sử dụng lại đối với Class Bussiness này như:
* Insert, Update... với các column riêng biệt...
* Select, Insert, Update... với các kiểu dữ liệu có thể là cụ thể hoặc là đối tượng từ lớp Mapping
c. Tạo ra được các lớp UI & Code Behind cần thiết cho ứng dụng quản lý:
Ứng dụng phải tạo ra được các Forms & các Controls cho phép người sử dụng quản lý Nhập mới, Chỉnh sửa, Xóa & Tìm kiếm thông tin trong Table tblHang.
Việc xây dựng cần phải hợp lý về:
* Kích thước của Form
* Font chữ
* Bố cục của các Controls phải theo thứ tự của các column trong Table tblHang
* Độ cao, rộng của Controls phải theo như độ dài của mỗi column
* ...
Ngoài ra, các Class phải được đảm bảo tính đúng đắn, chặt chẽ, không xảy ra lỗi khi được sử dụng.
3. Tổng kết:
Việc xây dựng một ứng dụng GenCode sẽ giúp cho quá trình phát triển các Ứng dụng Quản lý sẽ tiết kiệm được nhiều thời gian & công sức vì phải xây dựng các đoạn Code thao tác với các Table một cách nhàm chán.