2012-07-23 85 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 

缺点是一个小的开销,但是这通常是可以忽略不计

相关问题