私はVB.Netに変換したい約100個のカスタムコレクションクラスを持つVB6プロジェクトを持っています。典型的な例は、次のようなものになります。アイテムが保存されている
Class CAccounts
Private m_Accounts As New Collection
Public Sub Add(newItem As CAccount)
m_Accounts.Add newItem, newItem.IdKey
End Sub
Public Sub Remove(index As Variant)
m_Accounts.Remove index
End Sub
Public Function Item(index As Variant) As CAccount
Set Item = Nothing
On Error Resume Next
Set Item = m_Accounts.Item(index)
End Function
.........
は
Class CAccount
Public Id as long
Public Code as String
Public Name as string
Public Sub Init(ByVal Id as Long)
Me.Id = Id
Code = ""
Name = ""
End Sub
Public Property Get IdKey() as String
IdKey = Code
End Property
......
プロジェクト内のコレクションクラスのすべてが、この標準的なアプローチを使用しています。ただし、コレクションクラスのすべてのプロパティ/メソッドが実際に使用されるわけではありません。コレクションのほとんどは "for each"ループで使用されます。文字列キーを使用したキーアクセスは非常に一般的です。インデックスによるキーアクセスは、あまり一般的ではありません。
理想的には、これらのクラスを変換するための標準的なアプローチをとってみたいと思います。私は本当に各コレクションを見直す必要はありませんし、リスト、ディクショナリなどが必要かどうかを検討するための使い方があります。これらのコレクションの中には10万個のオブジェクトが含まれているものもあれば、10個しかないものもあります。よりシンプルなオプションではより複雑な構造を使用することで、パフォーマンスの問題を引き起こしたいと考えています。
私は最善のアプローチについて助言をいただきたいと思います。私は以下を考慮した。
旧式のコレクションに固執する。したがって、VB.Netに変換するのは比較的簡単ですが、私はむしろより現代的な構造に移行したいと考えています。
CAccountsはKeyedCollection(Of String、CAccount)を継承しますか。幸いにも、コレクションに保持されているクラスのほとんどはクラスの一部としてキーを持っています(例えば上記のCAccount.IdKeyなど)。これはうまくいくようです。しかし、比較的少数のクラスが数値索引によってコリレクションにアクセスします。だから、もし私が文字列キーだけでキーアクセスをしたいのであれば、おそらくこれは過剰です。
私は数値インデックスでアクセスする必要のないクラスの継承辞書(Of String、CAccount)を持っています。私がこれを持っている問題は、すべての既存の "for each"ループが "アカウントの各アカウント"に似ていることです。私はこれらの出来事をすべて「アカウント内の各アカウントごとに」変更する必要はありません。おそらく、私はデフォルトのプロパティを変更することでこれを得ることができますか?
CAccountsはMyCollection(Of String、CAccount)を継承します。ここで、MyCollectionは自分専用のコレクションです。これはあまりにも苦労するようです。
オプション2に行く傾向があります。すべてをKeyedCollectionにします。次に、必要に応じて例外を設定します(非ユニークキーなど)。しかし、KeyedCollectionsがDictionaryよりもはるかに遅い場合は、DictionaryとしてDictionaryを使用し、KeyedCollectionを使用して数値インデックスでアクセスする必要があります。
すべてのアドバイスをいただければ幸いです。
100個のカスタムクラスは、大きなVB6アプリケーションのようです。アップグレードする最善の方法について常に議論があります。ここでは、あなたが検討したいと思うかもしれない様々な方法のプロと詐欺について議論する最近閉鎖された質問があります:http://stackoverflow.com/questions/10252998/vb6-code-アップグレード/ 10256670#comment13187430_10256670 –
このアプリのアップグレード方法について何年も考えていない場合は、数か月を費やしました。ほとんどの変換ツールを試しました。パイロットプロジェクトを実行する。私たちは無料のMicrosoftツールを使用して変換を行い、出力(集計、ADOBDからADO、古い.ocxグリッドからDatagridなど)を整理することにしました。私たちはこれが多くの仕事であることを認識しています。しかし、ビジネスロジックの多く、そしてほとんどのデータアクセスは、標準的なアプローチを持つクラス内にあります。だから我々は、グローバルなレコードコードをDataReaderなどに置き換えるコードを書いている。ゼロから始めることは現実的な選択肢ではなかった。 – djk