4

例として、分析/ユーザーへの出力が必要なデータベース内の日付の大規模なセットのレストランのセットに関する大量のデータがあるとします。

したがって、私のコードでは、日付ごとに各レストランのデータを保持するカスタム クラスがあります。たとえば、次のようになります。

Public Class DateData
    Public Property Var1 As Double = 0
    Public Property Var2 As Double = 0
    Public Property Var3 As Double = 0
    Public Property Var4 As Double = 0

    Public Sub Sub1()
      ....
    End Sub

   ... etc ....
End Class

そして、私は各日付のこのデータを取得しているので (そして日付の順序は私の計算にとって重要なので)、次のクラスも設定しています (ほとんどの作業/計算が行われる場所):

Public Class RestaurantData
    Inherits SortedDictionary(Of Date, DateData)

   Public Property Name As String
   Public Property RestaurantLevelData1 As Double = 0
   Public Property RestaurantLevelData2 As Double = 0

   Public Sub New(ByVal strName As String, ByVal DatesList As List(Of Date))
       _Name = strName
       For Each daDate As Date In DatesList
           Me.Add(daDate)
       Next
   End Sub

   Public Overloads Sub Add(ByVal daDate As Date)
        MyBase.Add(daDate, New DateData)
   End Sub

   Public Sub Sub1()
       For i As Integer = 0 To Me.Keys.Count - 1
           Dim daDate As Date = Me.Keys(i)
           Me(daDate).Sub1()
           .... etc ....
       Next
   End Sub

   ... etc ....
End Class

最後に、これは多数のレストラン向けであるため、この Dictionary をレストランレベルで保持するクラスがあります。たとえば、次のようになります。

Public Class RestaurantsDict
    Inherits Dictionary(Of String, RestaurantData)

   Public Overloads Sub Add(ByVal strName As String, ByVal Dates As List(Of Date))
       MyBase.Add(strName, New RestaurantData(strName, Dates))
   End Sub
End Class

さて、これを設定したので、主な質問が 2 つあります。

  1. これはこれを設定する良い方法ですか?私の元のコードは数十個で構成されていましたがDictionary(Of String, SortedDictionary(Of Date, Double)) 、私はかなり初心者のプログラマであり、達成しようとしているものに対してより効率的なアーキテクチャがあるかどうかを知りたいと思っています.

  2. 私が現在これを設定している方法は、デバッグが非常に困難です。たとえば、Countmy のプロパティRestaurantDataは type の例外をスローしますSystem.TypeLoadException

全体として、このソリューションは完全にうまく機能していますが、より良い .Net & OOP プログラマーになる方法について、これから学びたいと思います。

ありがとう!

4

1 に答える 1

2

これは本質的に単なる意見であるため、このサイトにはあまり適していませんが、素晴らしい質問です.

簡単な答えは、まったく問題はありませんが、確かに必要ではないということです。したがって、価値があるかどうかは状況によって異なります。Integerたとえば、通常、 、String、またはGuid何らかの ID を表す以外のものを使用する理由はありません。ただし、誰かが UserId と EmployeeId などを簡単に混同しかねないという懸念がある場合は、誤って間違ったものを渡すことがないように、それぞれに独自の特定の型を作成する価値があるかもしれません。しかし、通常は、混乱を招く層を追加したくないでしょう。

ジェネリック コレクションでは、そうする理由はないと通常は言いますが、リストのリストがある場合は、長い構文を節約するためだけに、それを少し単純化しようとする欲求を理解できます。タイプ名。

ジェネリックが存在しなかった場合 (.NET 1.0 など)、このように独自のカスタム型を定義する必要があることを考えると、ジェネリックが単なる利便性の問題であることは明らかです。したがって、単に a を使用する方が便利なDictionary(Of String, SortedDictionary(Of Date, Double))場合は、それを実行しますが、それから独自のクラスを派生させる方が便利な場合は、それを実行します。

于 2012-12-11T20:48:35.353 に答える