2012-04-19 92 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

相關問題