我在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设置为类中的任何内容,但必须编写几个或多或少相同的函数。
在后一种情况下,我转发“垃圾收集器”,但有一个更瘦的类。
两者都应该有效,但哪一个更好的编码风格?
答案 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的内部工作方式,我对这里的第二种方法更为舒服。 (一个目标一行;)
我会对任何人采取此事非常感兴趣