Access
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Access

Tạo phụ thuộc tùy chọn

Trong bài viết của tôi ngày hôm qua, tôi đã giới thiệu khái niệm "Chuyến tàu phụ thuộc". Đó là những gì sẽ xảy ra khi bạn nhập một hàm từ thư viện mã của mình, nhưng cuối cùng bạn phải nhập một số mô-đun bổ sung chỉ để đáp ứng tất cả các phụ thuộc. Bạn bị bỏ lại với toàn bộ "đoàn tàu" mô-đun mã khi tất cả những gì bạn cần là một "chỗ ngồi" (chức năng).

Bạn sẽ gặp phải tình huống này khi các mô-đun được kết hợp chặt chẽ với nhau. Vậy bạn có thể làm gì với nó? Có một số cách để xử lý tình huống này.

Vi phạm "đừng lặp lại chính mình"

Một cách để duy trì khớp nối lỏng lẻo - dẫn đến nhiều mô-đun "độc lập" hơn - là tạo các bản sao riêng của các chức năng từ mô-đun nguồn trong mô-đun gọi. Điều này giúp loại bỏ sự phụ thuộc giữa hai mô-đun, nhưng nó dẫn đến mã lặp lại.

Khái niệm này là đơn giản. Bạn sao chép hàm từ mô-đun mã chính của nó. Sau đó, bạn dán nó vào mô-đun gọi nhưng đánh dấu nó là riêng tư để tránh mơ hồ.

Điều này có ý nghĩa trong các trường hợp sau:

  • Các phương pháp đơn giản không có logic phức tạp.
  • Các thủ tục khó có thể thay đổi.
  • Khi quy trình là một phần của mô-đun lớn hơn nhiều và bạn không cần bất kỳ chức năng nào khác trong mô-đun. Việc sao chép một chức năng sẽ tránh bị cồng kềnh.

Phương pháp này có những nhược điểm sau:

  • Nếu có một lỗi trong chức năng đã sao chép, bạn sẽ phải sửa nó ở nhiều nơi.
  • Bạn có thể bị trùng lặp mã nếu bạn vẫn nhập mô-đun nguồn.

Chọn trận chiến của bạn

Tôi đã sử dụng rất nhiều thời gian để giữ tất cả các mô-đun thư viện mã tiêu chuẩn của mình hoàn toàn độc lập. Vấn đề là nó dẫn đến rất nhiều mã trùng lặp. Lý do là hầu hết các chức năng tôi đang sao chép sang các mô-đun khác để sử dụng riêng đều đến từ các mô-đun mà tôi đang nhập vào ứng dụng của mình.

Một ví dụ điển hình về điều này là StringFunctions của tôi mô-đun. Mô-đun đó có một số phương pháp đơn giản tồn tại phần lớn để làm cho mã của tôi dễ đọc hơn. Ví dụ:tôi có Conc() chức năng mà tôi đã đưa vào như một chức năng riêng tư trong hơn một nửa số mô-đun thư viện mã của mình.

Theo thời gian, tôi nhận ra rằng tôi đã bao gồm StringFunctions mô-đun trong tất cả các dự án của tôi. Tôi chưa bao giờ giới thiệu một phụ thuộc mới khi tôi gọi một hàm từ mô-đun đó. Tôi đã lãng phí thời gian và giới thiệu mã trùng lặp chẳng mang lại lợi ích gì.

Có một vài mô-đun mã mà tôi có thể cho rằng sẽ có trong mọi ứng dụng một cách an toàn. Đó là những mô-đun có chức năng mà tôi sử dụng thường xuyên nhất. Điều đó có nghĩa là về cơ bản có thể bỏ qua nhiều phần phụ thuộc này.

Bây giờ tôi duy trì một "Thư viện tiêu chuẩn" gồm các mô-đun mã mà tôi nhập vào mọi dự án mới ngay từ đầu. Giờ đây, tôi thoải mái gọi các hàm từ các mô-đun đó khi biết rằng tôi sẽ không giới thiệu các phần phụ thuộc mới.

Sử dụng mã nhận xét duy nhất

Một trong những mô-đun trong "Thư viện chuẩn" của tôi là mô-đun lớp ( clsApp ) bao gồm các thuộc tính và phương thức cấp ứng dụng, chẳng hạn như tên người dùng hiện tại và văn bản trên thanh tiêu đề. Tôi cũng hiển thị các mô-đun lớp khác từ bên trong clsApp , chẳng hạn như clsStatus clsRegistry , cung cấp quyền truy cập dễ đọc hơn vào thanh trạng thái Access và sổ đăng ký Windows, tương ứng.

Tuy nhiên, tôi không cần quyền truy cập vào thanh trạng thái hoặc sổ đăng ký Windows trong mọi dự án. Vì vậy, để tránh tạo ra sự phụ thuộc vào clsStatus hoặc clsRegistry các lớp, tôi sẽ nhận xét mã tham chiếu đến các lớp đó bằng cách sử dụng một "mã thông báo nhận xét" duy nhất.

Điều này dễ dàng nhất để chứng minh bằng một ví dụ:

' Notes     
' - Find and replace '$$ with blank to enable Status property (requires clsStatus)
' - Find and replace '&& with blank to enable Reg property (requires clsRegistry)

'$$Private m_objStatus As clsStatus
'&&Private m_objReg As clsRegistry

'$$Public Property Get Status() As clsStatus
'$$    Set Status = m_objStatus
'$$End Property

'&&Public Property Get Reg() As clsRegistry
'&&    Set Reg = m_objReg
'&&End Property

Private Sub Class_Initialize()
    '$$    Set m_objStatus = New clsStatus
    '&&    Set m_objReg = New clsRegistry
End Sub

Nếu tôi muốn bật Status thuộc tính của lớp trên, tôi có thể thực hiện tìm và thay thế toàn cục trên '$$ .

Điều này hoạt động tốt trong một thời gian, nhưng nó luôn cảm thấy khó chịu với tôi. Có lẽ bởi vì nó đã được. Điều khác cần lưu ý là các mã nhận xét cần phải là duy nhất trên toàn cầu trong toàn bộ thư viện mã của tôi. Đây sẽ là một cơn ác mộng bảo trì nếu tôi mắc kẹt với phương pháp này trong một thời gian dài.

Sử dụng biên dịch có điều kiện

Một cách tiếp cận gọn gàng hơn nhiều là tận dụng lợi thế của việc biên dịch có điều kiện. Đó là những dòng trong VBA bắt đầu bằng dấu thăng / hashtag ("#"). Các dòng bắt đầu bằng ký tự đó phải được "xử lý trước".

Tiền xử lý là gì? Đó là bước mà các ngôn ngữ lập trình thực hiện trước khi biên dịch. Vì vậy, trước khi bất kỳ kiểm tra thời gian biên dịch nào xảy ra, các dòng tiền xử lý sẽ được đánh giá. Điều này cho phép chúng tôi đặt mã mà nếu không sẽ không biên dịch được vào các dự án của chúng tôi.

Làm thế nào chúng ta có thể tận dụng điều này với các thư viện mã của chúng ta? Một lần nữa, điều này là đơn giản nhất để chứng minh bằng một ví dụ:

' Notes 
' - Replace the '$$ and '&& kludges with conditional compilation

#Const EnableStatusProperty = True  'If True, requires import of clsStatus class
#Const EnableRegProperty = False  'If True, requires import of clsRegistry class

#If EnableStatusProperty Then
Private m_objStatus As clsStatus
#End If
#If EnableRegProperty Then
Private m_objReg As clsRegistry
#End If

#If EnableStatusProperty Then
Public Property Get Status() As clsStatus
    Set Status = m_objStatus
End Property
#End If

#If EnableRegProperty Then
Public Property Get Reg() As clsRegistry
    Set Reg = m_objReg
End Property
#End If

Private Sub Class_Initialize()
#If EnableStatusProperty Then
    Set m_objStatus = New clsStatus
#End If
#If EnableRegProperty Then
    Set m_objReg = New clsRegistry
#End If
End Sub

Điều tốt nhất của cả hai thế giới

Như bạn có thể thấy, đây là một cách rất tốt để tránh vấn đề "Chuyến tàu phụ thuộc".

Nó cho phép chúng tôi tạo phần phụ thuộc tùy chọn . Mọi đoạn mã dựa trên mô-đun thư viện mã khác được bao bọc bên trong câu lệnh biên dịch có điều kiện #If ... Then. (Các) hằng số biên dịch có điều kiện đều được liệt kê ở đầu mô-đun mã.

Bây giờ khi chúng tôi nhập lại phiên bản cập nhật của mô-đun thư viện mã của mình, chúng tôi chỉ cần thực hiện và đặt các cờ biên dịch có điều kiện thành nhiều so với trước đó. Nếu chúng tôi không nhớ cách đặt cờ, chúng tôi có thể tiếp tục biên dịch và điều chỉnh cờ cho đến khi dự án biên dịch đầy đủ.

Và nếu chúng tôi đang sử dụng kiểm soát phiên bản, chúng tôi không phải lo lắng về việc quên những gì đã có trước đó.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liên kết đến hoặc nhập dữ liệu từ Salesforce

  2. Cách mở cơ sở dữ liệu ở chế độ độc quyền trong Access 2016

  3. 5 lợi ích hàng đầu của việc di chuyển sang cơ sở dữ liệu Azure SQL

  4. Mẹo về Bảng Microsoft Access - Thủ thuật &Nguyên tắc Phần 4

  5. Cách thay đổi màu nền của tiêu đề biểu mẫu trong Access 2016