2012-07-23 49 views
2

我有一個項目向其他項目提供服務,並且提供此服務的方法的返回值是String。在該項目中,我使用了一些指定的常量來表示特殊的帶外值,這些值是代替預期的或可恢復的錯誤而返回的,否則服務將返回一個XML字符串。我應該如何讓多個項目之間保持一致?

類似以下內容:

' modService.bas 
const SERVICE_BADARG as String = "Unsupported argument." 
const SERVICE_TOOMANY as String = "Too many Foos." 

' cServiceProvider.cls 
Private Function GetXMLString() as String 
' generate and return XML string holding all sorts of generic stuff 
End Function 

Public Function PerformService(argument as String) as String 
' do some stuff 
If (some_condition = true) Then 
    PerformService = SERVICE_BADARG 
Else If (some_other_condition = true) Then 
    PerformService = SERVICE_TOOMANY 
Else 
    PerformService = GetXMLString() 

我希望能夠從其他項目中,能夠獲得這些常量沒有冗餘定義它們。如果可能的話,我也想避免將它們放在課堂上(不必要地複製它們),並避免爲每個人製作財產。

他們都是常數,他們都沒有改變。

回答

1

不幸的是,VB並沒有給常量編譯時嵌入常量的機制。你將不得不退還物業,就像你說你不想做的那樣。

我肯定會使用BAS路由,除非有理由反對它。另一種方法是創建一個類型庫,並在其中定義字符串常量。爲此,您將不得不學習ODL,並使用VB6附帶的MkTypeLib.exe程序。或者,如果您以某種方式訪問​​Matt Curland的「高級Visual Basic 6.0」,則可以使用該工具創建類型庫。

+0

屬性可能是最好的方法。 – Wug 2012-08-06 21:08:35

2

爲什麼不直接在CONSTANTS.BAS模塊中定義常量,然後將其包含在每個項目中?那樣的話,對於VB來說,它看起來像是重複的定義,但從作爲開發人員和維護程序員的角度來看,定義將全部收集在一個地方?

另一種選擇是創建一個定義常量的DLL,但這會使得在所有代碼中使用這些常量的代價更加昂貴,因爲它不是直接編譯到目標代碼中,而必須是從對外部DLL的調用中檢索。對於一些真正不變的東西來說,這看起來過於誇張。

請注意,「常量」值不一定與「只讀」值相同。像pi這樣的常數值,永遠不會改變,所以通過複製這些值真的不會有太大的損失。你永遠不需要回去改變它們。只讀值(如錯誤消息字符串)可能會更改,所以它們不是真正的常量。將這些放入DLL中可能有意義。尤其是當你所要做的只是顯示一條錯誤信息時,性能並不是那麼重要。

+0

此時一切都是dll的一個巨大的大雜燴反正有這麼多的項目,它止跌不值得複製所有這些數據。該DLL解決方案或多或少是我的目標。我將如何實現它? – Wug 2012-07-24 03:22:09

+0

爲了記錄,這個特定的服務只會被大約6或7個項目使用。不過,我打算稍後嘗試集中配置。設置存儲在一種混亂的配置文件和註冊表項中,並且我已經計算了幾個不同的註冊表和文件編輯模塊,每個模塊都具有略微不同的功能,可見性和代碼異味。集中化可能會觸及許多許多項目並重復50次相同的常數,這會引起不滿。另外,我是實習生,我的代碼庫是叢林。大的架構變化是不可能的。 – Wug 2012-07-24 03:30:52

+0

@Wug創建ActiveX DLL的能力是內置的。要編譯其他類型的DLL,您需要做更多的工作。我會放入C++來做到這一點,但這可能不是大多數VB開發人員的選擇。我建議查看[vbAdvance](http://vb.mvps.org/tools/vbAdvance/)。但是,你的第二個評論確實有一個好的一點 - 是否真的值得接觸大量的文件,只是把所有的常量放在一個地方?許多人可能會告訴你不要浪費太多時間來重構VB 6代碼,而是把精力集中在遷移上。值得考慮。 – 2012-07-25 07:38:37

0

我知道這是舊的,但如果有些人還是不知道... 嘗試這種模式:

Public Function SERVICE_BADARG() As String: SERVICE_BADARG = "Unsupported argument.": End Function 
Public Function SERVICE_TOOMANY() As String: SERVICE_TOOMANY = "Too many Foos.": End Function 

Public Function SERVICE_BADARG() As String 
    SERVICE_BADARG = "Unsupported argument." 
End Function 
Public Function SERVICE_TOOMANY() As String 
    SERVICE_TOOMANY = "Too many Foos." 
End Function 
用冒號把東西放在同一行

或者更緊湊

你可以看到一個常量作爲一個沒有參數的函數。優點是函數可以是公共的,所以你不必創建一個DLL。它也只能在其他函數之前聲明它們。VB6允許您隱藏括號:

x = "error: " & SERVICE_TOOMANY 

Select Case y 
    Case SERVICE_BADARG 
     z = "error: y is a bad arg" 
    Case SERVICE_TOOMANY 
     z = "error: y is too many" 
End Select 

缺點是一個小的開銷,但是這通常是可以忽略不計

相關問題