Ищете рекомендации по дизайну для следующей проблемы. Я получаю два строковых значения - действие и сообщение и должен вызвать соответствующий метод, который обрабатывает строковое сообщение (processM1MessageVer1, processM1MessageVer2, processM2MessageVer1 ...). Метод, который я должен вызывать, зависит от заданного строкового действия. Существует 2 версии (но в будущем может быть больше) каждого метода обработки. Версия метода, который я должен вызывать, определяется глобальной версией. Каждый метод возвращает объект другого типа (ResultObject1, ResultObject2 ...). Результат должен быть сериализован, преобразован в base64 и возвращен обратно.Руководство по проектированию C# - вызов соответствующего метода на основе значения строки
Есть ли более элегантный способ написания этого (исключить дублирование кода, сделать возможным в будущем изменения легче, уменьшить код ...):
string usingVersion = "ver1";
public string processRequest(string action, string message)
if (usingVersion == "ver1"){
processRequestVer1(action, message);
}
else{
processRequestVer2(action, message);
}
}
//version 1
public string processRequestVer1(string action, string message){
string result = "";
switch (action){
case "m1":
ResultObject1 ro = processM1MessageVer1(message);
result = serialize(ro);
result = convertToB64(result);
case "m2":
ResultObject2 ro = processM2MessageVer1(message);
result = serialize(ro);
result = convertToB64(result);
case "m3":
ResultObject3 ro = processM3MessageVer1(message);
result = serialize(ro);
result = convertToB64(result);
}
return result;
}
//version 2
public string processRequestVer2(string action, string message){
string result = "";
switch (action){
case "m1":
ResultObject1 ro = processM1MessageVer2(message);
result = serialize(ro);
result = convertToB64(result);
case "m2":
ResultObject2 ro = processM2MessageVer2(message);
result = serialize(ro);
result = convertToB64(result);
case "m3":
ResultObject3 ro = processM3MessageVer2(message);
result = serialize(ro);
result = convertToB64(result);
}
return result;
}
Было бы проще, если сообщения, которые должны быть обработаны, имеют различные типы объектов вместо строк, так что соответствующий метод можно было бы назвать полиморфно. Тот факт, что каждый метод процесса возвращает другой тип объекта, также усложняет ситуацию. Но это не зависит от меня, и я не могу его изменить.
Используя переключатель отлично и эффективная производительность. Если вы знаете во время компиляции все возможности, это неплохой путь. В некоторых случаях люди могут предпочесть словарь, например. 'Словарь>' в вашем случае, где он заполнен ключами (то есть, что в противном случае было бы метками 'case') и' делегатами делегирования 'Func '' для методов, которые выполняют соответствующую обработку (т.е. взять «сообщение» и получить результат «результат»). Это не будет работать лучше, чем 'switch', но в качестве предпочтения некоторым может понравиться это лучше. –