using System; using System.Collections.Generic; using System.Linq; namespace Model.Players { public class PlayerManager : IManager { /// /// a collection of the players that this manager is in charge of /// private readonly List players; public PlayerManager() { players = new(); } /// /// add a new player /// /// player to be added /// added player, or null if was null public Player Add(Player toAdd) { if (toAdd is null) { throw new ArgumentNullException(nameof(toAdd), "param should not be null"); } if (players.Contains(toAdd)) { throw new ArgumentException("this username is already taken", nameof(toAdd)); } players.Add(toAdd); return toAdd; } /// /// finds the player with that name and returns A COPY OF IT ///
/// that copy does not belong to this manager's players, so it should not be modified ///
/// a player's unique name /// player with said name, or null if no such player was found public Player GetOneByName(string name) { if (!string.IsNullOrWhiteSpace(name)) { Player wanted = new(name); Player result = players.FirstOrDefault(p => p.Equals(wanted)); return result is null ? null : new Player(result); // THIS IS A COPY (using a copy constructor) } throw new ArgumentException("param should not be null or blank", nameof(name)); } /// /// get a READ ONLY enumerable of all players belonging to this manager /// so that the only way to modify the collection of players is to use this class's methods /// /// a readonly enumerable of all this manager's players public IEnumerable GetAll() => players.AsEnumerable(); /// /// update a player from to /// /// player to be updated /// player in the state that it needs to be in after the update /// updated player public Player Update(Player before, Player after) { Player[] args = { before, after }; foreach (Player player in args) { if (player is null) { throw new ArgumentNullException(nameof(after), "param should not be null"); // could also be because of before, but one param had to be chosen as an example // and putting "player" there was raising a major code smell } } Remove(before); return Add(after); } /// /// remove a player /// /// player to be removed public void Remove(Player toRemove) { if (toRemove is null) { throw new ArgumentNullException(nameof(toRemove), "param should not be null"); } // the built-in Remove() method will use our redefined Equals(), using Name only players.Remove(toRemove); } } }