С точки зрения архитектуры, как мне заменить чрезвычайно большой оператор switch на что-то более управляемое?
РЕДАКТИРОВАТЬ 1: Забыл добавить вложенный шарик кривой свойства.
ОБНОВИТЬ: Я выбрал ответ @ mtazva, так как это было предпочтительным решением для моего конкретного случая. Оглядываясь назад, я задал общий вопрос с очень конкретным примером, и я полагаю, что это привело всех (или, возможно, только меня) в замешательство относительно того, что именно было задано. Я верю, что на общий вопрос также был дан ответ (см. Ответы по шаблону стратегии и ссылки). Всем спасибо!
Большие операторы переключателя, очевидно,запах и я видел несколько ссылок о том, как вы могли бы сделать это ссловарь, который отображается на функции, Но мне интересно, есть ли лучший (или умный способ) сделать это? В некотором смысле, это вопрос, который у меня всегда возникал у меня в голове, но у меня никогда не было хорошего решения.
Этот вопрос возник из другого вопроса, который я задавал ранее:Как выбрать все значения свойства объекта в списке типизированных объектов в .Net с C #
Вот пример класса, с которым я работаю (из внешнего источника):
public class NestedGameInfoObject
{
public string NestedName { get; set; }
public int NestedIntValue { get; set; }
public decimal NestedDecimalValue { get; set; }
}
public class GameInfo
{
public int UserId { get; set; }
public int MatchesWon { get; set; }
public long BulletsFired { get; set; }
public string LastLevelVisited { get; set; }
public NestedGameInfoObject SuperCoolNestedGameInfo { get; set; }
// thousands more of these
}
К сожалению, это исходит из внешнего источника ... представьте ОГРОМНЫЙ дамп данных из Grand Theft Auto или что-то в этом роде.
И я хочу получить только небольшое поперечное сечение списка этих объектов. Представьте, что мы хотим сравнить вас с кучей объектов игровой информации ваших друзей. Индивидуальный результат для одного пользователя будет выглядеть так:
public class MyResult
{
public int UserId { get; set; } // user id from above object
public string ResultValue { get; set; } // one of the value fields from above with .ToString() executed on it
}
И пример того, что я хочу заменить чем-то более управляемым (поверьте мне, я НЕ хочу поддерживать этот оператор переключения монстров):
const int MATCHES_WON = 1;
const int BULLETS_FIRED = 2;
const int NESTED_INT = 3;
public static List<MyResult> GetMyResult(GameInfo[] gameInfos, int input)
{
var output = new List<MyResult>();
switch(input)
{
case MATCHES_WON:
output = gameInfos.Select(x => new MyResult()
{
UserId = x.UserId,
ResultValue = x.MatchesWon.ToString()
}).ToList<MyResult>();
break;
case BULLETS_FIRED:
output = gameInfos.Select(x => new MyResult()
{
UserId = x.UserId,
ResultValue = x.BulletsFired.ToString()
}).ToList<MyResult>();
break;
case NESTED_INT:
output = gameInfos.Select(x => new MyResult()
{
UserId = x.UserId,
ResultValue = x.SuperCoolNestedGameInfo.NestedIntValue.ToString()
}).ToList<MyResult>();
break;
// ad nauseum
}
return output;
}
Так что вопрос в том, есть ли разумные способы управлять этим зверем? Что мне действительно нравится, так это динамический способ получения этой информации в случае изменения исходного объекта (например, добавляются дополнительные свойства информации об игре). Есть ли лучший способ создать это, чтобы он был менее неуклюжим?