我正在重構一個 VBA 應用程式以開始使用 Class 模塊。對于背景關系,它是一個用戶表單,可以為一系列特定的資料清理操作設定一些變數。我一直在研究將值從用戶表單物件傳輸到單獨模塊的子變數中。
在我的研究中,我遇到了這個處理用戶表單的答案。它突出了模型-視圖-演示者模式。答案的“模型”部分概述了一些在新類模塊中定義私有型別變陣列的代碼。
但是,我還閱讀了這篇文章,它聲稱“我們可以通過宣告 Type 陳述句來避免在 VBA 中使用 Class 模塊。它不需要任何字串模塊,因為我們可以將其嵌入到現有模塊中,從而節省空間。”
我覺得我應該知道何時在 Class 模塊中使用 Type 以及何時使用 Type 來避免創建 Class 模塊,但我以前沒有遇到過這種需要,所以我一直在為自己的應用程式做出決定. 任何人都可以通過解釋/示例為我區分這兩種方法嗎?
uj5u.com熱心網友回復:
UDT 對于與各種 Win32 API 庫和函式進行互動特別有用;它們定義了一個存盤許多相關值的記憶體空間,如果你讀/寫二進制檔案,它們也會讓你的生活變得更輕松。
避免創建類模塊的“需要”是人為的:這是您需要對應該驅動專案中的內容的資料執行的操作,而不是 VBIDE 組織具有許多模塊的專案有多糟糕(有一個免費和開源的添加-可以幫助解決這個問題)。
APublic Type只能在標準模塊中宣告,只能通過ByRef,當您需要陣列或集合中的“實體”時,這是一個問題。
除了將值分組在單個識別符號下之外,使用公共 UDT 來存盤模型屬性沒有任何優勢,例如,擁有一堆全域變數......這本身并不是錯誤的,只是不是一個物件-面向編程的方法。
在 OOP 中,我們從物件的角度來思考——我們使用類模塊來定義物件。我們要遵循的基本 OOP 原則是封裝和抽象……這是全域狀態/變數根本不做的兩件事。
通過使用專用類定義模型,您仍然可以自由地擁有一個全域實體,如果您愿意,任何人都可以從任何地方操作:
'Module1
Option Explicit
Public GlobalModel As New MyModelClass
...但是你也可以在本地自由地定義它(范圍越窄越好!),當物件超出范圍時,它的封裝資料也會被釋放:
'Module1
Option Explicit
Public Sub DoSomething()
Dim Model As MyModelClass
Set Model = New MyModelClass
With New SomeForm
Set .Model = Model
.Show
End With
'form manipulated model properties and is now closed
Debug.Print Model.SomeProperty
End Sub '<~ Model is no longer in scope, the data is gone
使用公共 UDT,資料將超出其預期范圍。
關于這一點的旁注:
[...] 概述了一些代碼,這些代碼在新的 Class 模塊中定義了一組 Private Type 變數。
私有 UDT 不是必需的,但有助于保持整潔;有關更多詳細資訊,請參閱此問答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532748.html
標籤:擅长vba哎呀
上一篇:重新格式化Excel資料庫
