2012-04-19 72 views
3

我使用VBA中的类来工作,它封装了使用MSXML2.XmlHttp下载的东西。是否可以在函数内部创建对象

有返回值的三种可能性:文本,XML和流。

我应该创建一个功能为每个:

aText=myDownloader.TextSynchronous(URL,formData,dlPost,....) 
aXml.load myDownloader.XmlSynchronous(URL,formData,dlPost,....) 

或者我能不能回到我的类中创建的XmlHttpObject,然后有

aText=myDownloader.Synchronous(URL,formData,dlPost,.....).ResponseText 
aXML=myDownloader.Synchronous(URL,formData,dlPost,.....).ResponseXML 

在前一种情况下,我可以设置OBJ到课堂上什么也没有,但必须写出几乎相同的功能。

在后者的情况下,我中继的“垃圾收集”,但有一个精简的类。

双方应该工作,但哪一个更好的编码风格?

+0

你真的可以依靠垃圾收集器在VBA? – NoChance 2012-04-19 12:06:00

+0

@EmmadKareem:指出我朝着正确的方向前进。 VBA使用引用计数和(除了ADO中的一些旧bug之外,只要你不做循环引用,似乎没有问题 – Johanness 2012-04-19 14:45:04

+0

感谢您的意见 – NoChance 2012-04-19 17:48:55

回答

0

后在网络(由EmmadKareem注释触发)多寻找周围,我发现这一点:

首先,不要在一个方法结束做localObject=Nothing - 变量超出范围反正是丢弃。请参阅this older but enlightening post on msdn

VBA使用引用计数,除了ADO上的一些较早的错误,这似乎工作得很好,并且(据我所知)立即丢弃了不再使用的资源。所以从性能/内存使用的角度来看,这似乎不成问题。

至于编码风格:我认为当我设计这个不舒服的fdeeling可以通过简单地将函数重命名为myDownloader.getSyncDLObj(...)或其他类似的东西而消失。

似乎有上codestyle两个阵营。一个促进干净的代码,这是很容易阅读,但每次使用它时使用五行。其最重要的特权是“每个函数应该做的一两件事,只有一两件事。他们的做法可能会看起来像

myDownloader.URL="..." 
myDownloader.method=dlSync 
myDownloader.download 
aText=myDownloader.getXmlHttpObj.ResponseText 
myDownloader.freeResources 

,一个是与比较凌乱OK,但不lineconsuming

aText=myDownloader.getSyncObj(...).ResponseText 

两者都有它们的优点都没有错,危险或皱眉,因为这是一个辅助类,我用它来从主代码中删除xmlhttp的内部工作,所以我更喜欢这里的第二种方法。(一条线为一个目标;)

我会对任何人采取这一事情非常感兴趣

0

在我看来,第一种方式是更好,因为你不暴露底层细节的高层次的抽象。

我在Java中使用了一个类似于web爬虫的类,所以我只有一个类来操纵获取所有需要的数据的URL连接(低级)和一个使用低级别类的高级类来返回一个被调用的对象页。

你可以有第三种方法只执行myDownloader.Synchronous(URL,formData,dlPost,.....)并存储在私有变量返回的对象和其他方法只处理这个对象。这种形式,你只会打开一次连接。

+0

这将导致: myDownloader.DoDownloadSynchronous(...)/ aText = myDownloader.getText ,内部为XmlHttp保持活着,只要下载生活...... – Johanness 2012-04-19 14:39:49

+0

@Johanness做所有必要的处理后,取出参考,私人VAR来避免重新连接,但只有当您获得多种类型的回报时才需要,如果不是,则不需要。 – 2012-04-19 14:50:08