Even though I’ve been known to use Manager, I’m in the “despise the term” camp, because it inevitably leads to mission creep in the class, breaking the number one rule in SOLID, Single Responsibility Principle.
Manager is vague enough that while you may have intended for one purpose, mentally it’s easy to add other things for the class to Manage. For example, let’s suppose we’re making a multi unit game where each unit gets a turn based on it’s speed and when it took it’s last turn… so for that, we need something to remember whose turn it is
public class UnitManager //determines whose turn it is next
And it might start with a simple function
public Unit GetNextTurn()
which scans the list of units and determines the next Unit to take a turn.
Down the road, we might wonder… Hmmm is there a good way to tell how many units are left on each team? Oh, I know, I’ll put that in UnitManager.
public (int, int) GetUnitCount() //1st int is player, 2nd int is AI
You know what, since UnitManager knows so much already, it can tell us when a victory condition is reached
public bool? TestVictoryCondition() //true if player won, false if enemy won, null if not finished
Mission creep.
But… if that UnitManager started out being a UnitTurnBroker
public class UnitTurnBroker
Then the initial method makes sense, and the other methods, which are far from the scope of a turn broker don’t make as much sense…
public class UnitCensus
{
publilc (int, int) GetUnitCount()
}
public class VictoryChecker
{
public bool? TestVictoryCondition()
}
The advantage to more precise class naming is that six months from now, or a year, or when another person joins your team, they’ll know from the class name precisely what the purpose of the class is… and when you say "hmmm… I need to tweak the VictoryConditions, you won’t wonder what it’s doing in UnitManager.