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

现在我可以想象至少有一种替代方法可以做到这一点:

Main

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

而且add方法当然应该没有Me.UpDateAvgAge(Player.Age)线。

不用说这只是最简单的例子。在现实生活中,每次我“添加”某些东西时,都会有许多属性被“更新”。

程序员之间是否就如何进行此添加/更新达成共识?有什么指导方针吗?

提前谢谢!

4

1 回答 1

0

我可以想象这样的事情。CTeam类会在新玩家添加到集合中时预先计算团队成员的年龄总和。然后只需使用这个数字,而不必遍历所有项目并计算数字。但是如果成员从集合中删除等情况下,您必须更新值。您必须决定这项工作是否合适,或者您是否只是在需要时计算所有值(意味着没有缓存)。

您也可以将事件添加到 CTeam 类,以便让订阅者知道新的团队成员已添加到集合中。就像在这个例子中,UserForm1 是订阅者,当 CTeam 类的 publischer 创建新播放器时,它会收到通知。高温高压

' 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 回答