在函数内创建对象是否可以

时间:2012-04-19 10:37:41

标签: oop vga

我在VBA中处理一个类,它使用MSXML2.XmlHttp封装下载内容。

返回值有三种可能性:Text,XML和Stream。

我应该为每个创建一个函数:

 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设置为类中的任何内容,但必须编写几个或多或少相同的函数。

在后一种情况下,我转发“垃圾收集器”,但有一个更瘦的类。

两者都应该有效,但哪一个更好的编码风格?

2 个答案:

答案 0 :(得分:0)

在我看来,第一种方式更好,因为你没有将低级细节暴露给高级抽象。

我在Java中使用Web爬虫做了类似的事情,所以我只有一个类操作URL连接获取所有需要的数据(低级别)和高级别类使用返回名为Page的对象的低级别类

您可以使用第三种方法只执行myDownloader.Synchronous(URL,formData,dlPost,.....)并将返回的对象存储在私有变量中,而其他方法只操作此对象。这个表单,你只会打开一次连接。

答案 1 :(得分:0)

经过大量的网络搜寻(由EmmadKareem的评论引发)我发现了这个:

首先,不要在方法结束时执行localObject=Nothing - 变量无论如何都会超出范围并被丢弃。见this older but enlightening post on msdn

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

关于编码风格:我认为我设计时的不舒服感可以通过简单地将函数重命名为myDownloader.getSyncDLObj(...)或其他一些来消失。

在codestyle上似乎有两个阵营。一个促进清晰的代码,易于阅读,但每次使用它时使用五行。它最重要的特权是"每个功能应该只做一件事,一件事。他们的方法可能看起来像

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

一个是可以的,更混乱,但更少线路消费

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

两者都有其优点,既没有错,也没有危险或不赞成。因为这是一个帮助类,我使用它从主代码中删除xmlhttp的内部工作方式,我对这里的第二种方法更为舒服。 (一个目标一行;)

我会对任何人采取此事非常感兴趣