Добрый день!
Есть такая конструкция
case "get_post_by_id":
tcpTmp = new Post(new Parametr("id", attribute.FirstChild.InnerText));
resalt = XMLtoString(((Post) tcpTmp).GetAsXml(_user.Parametres.GetValueByName("access") == "1"));
_log.AddToLog((_user.Parametres.GetValueByName("login") != "NoAccess") ? int.Parse(_user.Parametres.GetValueByName("id")) : 0, "Запрос на получение должности " + attribute.FirstChild.InnerText);
break;
case "get_all_post":
tcpTmp = new Post();
resalt = XMLtoString(((Post) tcpTmp).GetAllAsXml(_user.Parametres.GetValueByName("access") == "1"));
_log.AddToLog((_user.Parametres.GetValueByName("login") != "NoAccess") ? int.Parse(_user.Parametres.GetValueByName("id")) : 0, "Запрос на получение всех должностей");
break;
case "get_departament_by_id":
tcpTmp = new Departament(new Parametr("id", attribute.FirstChild.InnerText));
resalt = XMLtoString(((Departament) tcpTmp).GetAsXml(_user.Parametres.GetValueByName("access") == "1"));
_log.AddToLog((_user.Parametres.GetValueByName("login") != "NoAccess") ? int.Parse(_user.Parametres.GetValueByName("id")) : 0, "Запрос на получение отдела " + attribute.FirstChild.InnerText);
break;
case "get_all_departament":
tcpTmp = new Departament();
resalt = XMLtoString(((Departament) tcpTmp).GetAllAsXml(_user.Parametres.GetValueByName("access") == "1"));
_log.AddToLog((_user.Parametres.GetValueByName("login") != "NoAccess") ? int.Parse(_user.Parametres.GetValueByName("id")) : 0, "Запрос на получение всех отделов");
break;
....
и так дальше на 700 строк
Вот собственно и вопрос как можно это сократить конструкция примерно однотипная как можно заметить из примера.
tcpTmp - экземпляр родительского класса всех этих классов(Post, Departament, ...)
case "get_post_by_id":
tcpTmp = new Post(new Parametr("id", attribute.FirstChild.InnerText));
resalt = XMLtoString(((Post) tcpTmp).GetAsXml(_user.Parametres.GetValueByName("access") == "1"));
_log.AddToLog((_user.Parametres.GetValueByName("login") != "NoAccess") ? int.Parse(_user.Parametres.GetValueByName("id")) : 0, "Запрос на получение должности " + attribute.FirstChild.InnerText);
break;
Можно попробовать заменить на
case "get_post_by_id":
GetResult(new Post(new Parametr("id", attribute.FirstChild.InnerText)) ,
"Запрос на получение должности " + attribute.FirstChild.InnerText,
1 );
break;
Где:
GetResult<T>(T model, string descForLog , int caseAllOr);
В котором:
Либо(подчерпнул из другого ответа):
case "get_post_by_id":
GetResult(typeof(Post) ,
"Запрос на получение должности " + attribute.FirstChild.InnerText,
1 );
break;
И внутри метода case c созданием разных типов, или:
case "get_post_by_id":
GetResult(MODELS.Post ,
"Запрос на получение должности " + attribute.FirstChild.InnerText,
1 );
break;
Где Models - Enum. Но я бы максимум убрал бы log в красивую функцию, остальное может сильно меняться(смотрите по ситуации)
UPD 3.
Если испольльзовать файл со строками(которые для локализации используются), то можно вынести строки в отдельный файл, а ключом будут являться ваши case.
case "get_post_by_id":
GetResult(MODELS.Post ,
*переменная из switch*,
1 );
break;
А внутри метода по enum создавать(или typeof) создавать объект, по id искать строку(или использовать тут же enum, как в другом ответе предложили)
P.S. Смотрите по ситуации. Можно переборщить и любые изменения будут давать тяжко(любое отхождение от шаблона). Придется под каждое отхождение от шаблона делать изменения шаблона(ну или в таком case просто все по старому писать).
А если вы не сильно уменьшите читаемость, то и не стоит этого делать.
А про оптимизацию и ускорение - вообще третий вопрос и нужно намного больше инфы. Какой сервер, сколько нагрузки, часто ли и т.д.
UPD 4. Увеличивая таким образом читаемость - уменьшаете скорость. Смотрите по ситуации все.
Упросить или ускорить? В заголовке одно, а в теле другое и это 2 совершенно разных понятия.
Если речь идет об упрощении, т.е сделать код более читабельным и самодокументированным, то очевидно, что нужно вынести логику каждого CASE
в отдельный метод. Далее, внутри каждого метода ищем снова дублирующийся код и выносим в отдельные методы, делая декомпозицию.
Анализируемую строку так же лучше поменять на какой-нибудь enum
- это упрастить рефакторинг.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, довольно давно использую несколько методов, приведу код нижеВозможно есть более гуманное решение этой задачи, поделитесь...
Программа не видит путь к файлу C:\Windows\System32\nslookupexe Проверка естественно всегда выдает "Путь не найден"
Добрый день! Есть MVC сайтДля просмотра некоторой информации, передаются в строке uRL 2 параметра: а) лицевой счет, б) номер телефона, таким образом:
Всем приветПодскажите пожалуйста как получить скриншот свернутого opengl окна при помощи языка c#