3

私は、MSXML2.XmlHttpを使用してダウンロードをカプセル化するVBAのクラスに取り組んでいます。

戻り値には、テキスト、XML、ストリームの3つの可能性があります。

それぞれに関数を作成する必要があります:

 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を何にも設定できませんが、多かれ少なかれ同じであるいくつかの関数を作成する必要があります。

後者の場合、私は「ガベージコレクター」を中継しますが、よりスリムなクラスを持っています。

どちらも機能するはずですが、どちらがより良いコーディングスタイルですか?

4

2 に答える 2

0

私の意見では、低レベルの詳細を高レベルの抽象化に公開しないため、最初の方法の方が優れています。

JavaのWebクローラーで同様のことを行ったので、必要なすべてのデータを取得するURL接続を操作するクラス(低レベル)と、Pageというオブジェクトを返す低レベルクラスを使用する高レベルクラスがあります。

myDownloader.Synchronous(URL,formData,dlPost,.....)返されたオブジェクトを実行してプライベート変数に格納するだけの3番目のメソッドを作成し、othersメソッドはこのオブジェクトのみを操作することができます。このフォームでは、接続を1回だけ開きます。

于 2012-04-19T10:56:41.170 に答える
0

(EmmadKareemによるコメントによってトリガーされた)Webで多くのことを探し回った後、私はこれを見つけました:

まずlocalObject=Nothing、メソッドの最後で実行しないでください。変数はとにかくスコープ外になり、破棄されます。msdnのこの古いが啓発的な投稿を参照してください

VBAは参照カウントを使用し、ADOの古いバグを除けば、これはうまく機能しているようで、(私が理解しているように)使用されなくなったリソースをすぐに破棄します。したがって、パフォーマンス/メモリ使用量の観点からは、これは問題ではないようです。

コーディングスタイルに関して:私がこれを設計したときに私が持っていた不快なfdeelingは、関数の名前をそのmyDownloader.getSyncDLObj(...)ようなものに変更するだけで解消できると思います。

コードスタイルには2つの陣営があるようです。1つは、読みやすいクリーンなコードを促進しますが、使用するたびに5行を使用します。その最も重要な特権は、「すべての機能は1つのことと1つのことだけを実行する必要があります。彼らのアプローチはおそらく次のようになります。

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

1つは、雑然としていますが、回線消費量が少ない場合は問題ありません。

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

どちらにもメリットがあり、どちらも間違っていたり、危険だったり、眉をひそめたりしていません。これはヘルパークラスであり、メインコードからxmlhttpの内部動作を削除するために使用するため、ここでの2番目のアプローチの方が快適です。(1つの目標に対して1行;)

私は誰もがその問題を引き受けることに非常に興味があります

于 2012-04-19T21:39:01.693 に答える