3

私はオブジェクト指向プログラミングに非常に精通しており、自分のスタイルを正しくしようとしています。

多くの場合、プロパティが他のオブジェクトを含む辞書であるオブジェクトがあります。クラス「プレーヤー」を含むクラス「チーム」と呼びます。

ここで、プレーヤーがチームに追加されるたびに、チームの平均年齢を更新したいとします。

私のお気に入りの解決策:

Sub Main私はちょうど言うべきです

 Team.add(Player)

次にTeam、メソッドaddは次のとおりです。

 Public Sub Add(Player As CPlayer):
      pPlayers.Add Player.Name, Player
      Me.UpDateAvgAge(Player.Age)       
 End Sub

今、私はそれを行うための少なくとも1つの代替方法を想像できます:

Main

Team.add(Player)
Team.UpDateAvgAge(Player.Age)

もちろん、addメソッドにはMe.UpDateAvgAge(Player.Age)行がありません。

これは最も単純な例であると言う必要はありません。実際には、何かを「追加」するたびに、多くのプロパティが「更新」されます。

この追加/更新を行う方法について、プログラマーの間でコンセンサスはありますか? ガイドラインはありますか?

事前に!

4

1 に答える 1

0

こんなことが想像できました。クラスCTeam は、新しいプレーヤーがコレクションに追加された瞬間に、チーム メンバーの年齢の合計を事前に計算します。そして、すべてのアイテムをループして数を計算する代わりに、この数を使用するだけです。ただし、メンバーがコレクションから削除された場合などに値を更新する必要があります。この作業が適切かどうか、または必要なときにすべての値を計算するだけかどうかを決定する必要があります (つまり、キャッシュはありません)。

CTeamクラスにもイベントを追加して、新しいチーム メンバーがコレクションに追加されたことをサブスクライバーに知らせることができます。この例のように、UserForm1 はサブスクライバーであり、クラス CTeam であるパブリッシャーが新しいプレーヤーを作成すると通知されます。HTH

' CTeam クラス:

Public Event PlayerWasAdded(player As CPlayer)

Private m_players As VBA.Collection
Private m_sumTeamAge As Single

Private Sub Class_Initialize()
    Set m_players = New VBA.Collection
End Sub

Public Sub Add(player As CPlayer)
    m_players.Add player, player.Name
    m_sumTeamAge = m_sumTeamAge + player.Age
    RaiseEvent PlayerWasAdded(player)
End Sub

Public Property Get AverageAge() As Single
    If m_players.Count > 0 Then
        AverageAge = m_sumTeamAge / m_players.Count
    Else
        AverageAge = 0
    End If
End Property

' UserForm1 クラス:

Private WithEvents m_team As CTeam

Private Sub UserForm_Initialize()
    Dim i As Integer

    Set m_team = New CTeam

    For i = 1 To 5
        m_team.Add CreateNewPlayer(i)
    Next
End Sub

Private Sub m_team_PlayerWasAdded(player As CPlayer)
    MsgBox "New player " & player.Name & " was added. Do something ...", vbInformation
End Sub

Private Sub ShowAverageAge_Click()
    MsgBox "Average age of team member is: " & m_team.AverageAge, vbInformation
End Sub

Private Sub AddNewPlayer_Click()
    m_team.Add CreateNewPlayer(...)
End Sub

Private Function CreateNewPlayer(platerIndex As Integer) As CPlayer
    Dim upperbound As Integer: upperbound = 35
    Dim lowerbound As Integer: lowerbound = 18
    Dim player As CPlayer

    Set player = New CPlayer
    player.Name = "Player_" & platerIndex
    player.Age = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
    Set CreateNewPlayer = player
End Function
于 2014-04-07T15:34:34.370 に答える