У вас логика наизнанку; это то, что создает вашу проблему. Сделайте это в другом порядке и разбейте все на крошечные методы:
Army GetArmy(ArmyNum a)
{
switch(a)
{
case ArmyNum.army1: return controller.army1;
...
}
}
Unit GetUnit(Army a, UnitNum u)
{
switch(u)
{
case UnitNum.unit1: return a.unit1;
...
}
}
void ChangeAttribute(GameAttribute a, Army a, Unit u)
{
switch (attributeToChange) {
case GameAttribute.Accuracy:
u.accuracy += 1;
break;
...
А теперь звонить на сайт просто:
Army a = GetArmy(activeArmy);
Unit u = GetUnit(a, unitToChange);
ChangeAttribute(attributeToChange, a, u);
Урок здесь - - создайте небольшие методы, каждый из которых делает одну вещь исключительно хорошо . Затем составьте более сложные методы из этих меньших методов.
Как только вы это сделаете, вы можете начать изменять детали реализации. Например, мы можем заметить, что GetUnit
- это метод Army
, поэтому мы изменили бы его подпись на
Unit GetUnit(UnitNum u) // Now a method of Army
{
switch(u)
{
case UnitNum.unit1: return this.unit1; // this, not 'a'.
...
}
}
А теперь сайт звонков
Army a = GetArmy(activeArmy);
Unit u = a.GetUnit(unitToChange);
ChangeAttribute(attributeToChange, a, u);
что явно лучше.
Теперь предположим, что вы делаете Dictionary<ArmyNum, Army>
с именем Armies
. Затем вы переписываете:
Army GetArmy(ArmyNum a) => Armies[a];
И аналогично для GetUnits. Как только вы окажетесь там, вы сможете найти сайты, где вы используете GetArmy
и GetUnit
и заменить их на Armies[a]
и Armies[a].Units[u]
и т. Д.
Ваше представление о движении в мир, где все параметризовано, является хорошей идеей. Постепенно доберитесь , внеся небольших изменений, каждое из которых явно правильное .
Расширенное решение заключается в выполнении действий, связанных с делегатами :
actions = new Dictionary<GameAttribute, Action<Army, Unit>>()
{
{ Attribute.Accuracy, (a, u) => { u.accuracy += 1; } },
...
};
и тогда вы могли бы написать:
a = Armies[army];
u = a.Units[unit]
actions[attribute](a, u);
Но иди, прежде чем бежать! По мере того, как логика вашей программы усложняется, вы обнаружите, что вы снова создаете огромную массу сложного кода, и затем вы попытаетесь организовать его в классы, используя хорошие принципы ОО и , которые могут сделать его хуже, Я написал серию статей о том, как использование ОО для решения подобных проблем не работает; если эта тема вас интересует, см. https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/