- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
//Невероятные приключения Microsoft'а в Индии:
private string ExtractHttpVerb(XmlDocument configDOM)
{
string httpVerb;
string hv = IfExistsExtract(configDOM, "/Config/method", "2");
switch (hv)
{
case "0":
httpVerb = HttpVerbs[0];
break;
case "1":
httpVerb = HttpVerbs[1];
break;
case "2":
httpVerb = HttpVerbs[2];
break;
default:
httpVerb = HttpVerbs[2];
break;
}
return httpVerb;
}
tirinox 05.02.2014 18:35 # +5
Dummy00001 05.02.2014 19:16 # +4
Elvenfighter 06.02.2014 01:01 # +5
3Doomer 06.02.2014 07:19 # +4
Prabhakar_Srivastar 01.10.2021 18:10 # 0
anonimb84a2f6fd141 06.02.2014 11:25 # −4
neeedle 06.02.2014 13:15 # 0
Во вторых даже если строку, то ну еж-то в /Config/method находится число?
anonimb84a2f6fd141 06.02.2014 13:19 # 0
neeedle 06.02.2014 14:27 # 0
И вернуть уже элемент перечисления а не какую-то строку.
anonimb84a2f6fd141 06.02.2014 23:39 # 0
HellMaster_HaiL 06.02.2014 13:23 # 0
Говнокод тут в использовании switch.
HttpVerbs - это массив строк, метод должен вернуть одну строку из этого массива по номеру, указанному в "/Config/method".
neeedle 06.02.2014 14:25 # 0
>HttpVerbs - это массив строк
Это перечисление.
roman-kashitsyn 06.02.2014 14:27 # 0
neeedle 06.02.2014 14:29 # −1
andrewiv 07.02.2014 01:58 # −1
bormand 07.02.2014 05:32 # 0
HellMaster_HaiL 06.02.2014 14:47 # 0
private static readonly string[] HttpVerbs = new[] { "GET", "HEAD", "POST" };
Хотя особого значения не имеет.
>вернет строку, как вы собираетесь использовать ее в качестве индекса?
Как-то так:
neeedle 06.02.2014 14:55 # 0
return HttpVerbs[index];
Только у метода parse 3 исключения возможных, плюс IndexOutOfRange, плюс возможные исключения метода ifexistextract.
Ваш, правильный код, не будет коротеньким.
Ну разве что вы пишите только для идеального случая.
HellMaster_HaiL 06.02.2014 15:02 # +1
Не все. что коротко - совершенно.
Бороться за строки кода - это глупость, в угоду расширяемости и отказоустойчивости.
Добавить проверки на исключения - это песня другой оперы.
Я же сказал, что говнокодом в данном случае я считаю оператор switch.
HellMaster_HaiL 06.02.2014 15:09 # +1
bormand 06.02.2014 14:56 # +3
Правильный вариант:
neeedle 06.02.2014 14:57 # 0
bormand 06.02.2014 15:06 # 0
HellMaster_HaiL 06.02.2014 15:04 # +2
На этот вопрос Вам ответят разработчики MS BizTalk, ибо конфиг приходит из его "интерфейса" в котором свой, отдельный, справочник вида:
{0, "GET"}, {1, "POST"}, {2, "PUT"} и так далее.
Конфиг в данном случае - это ресурс, на который мы влиять не можем.
В данном случае return IfExistsExtract(configDOM, "/Config/method", "POST");
Вернет либо строку из "/Config/method" (а это может быть "0", "1", "2"...."N"), либо строку "POST".
В первом случае - это беда-печаль.
bormand 06.02.2014 15:09 # +1
> разработчики MS BizTalk
Мда, так вот где индусы порылись ;)
bormand 06.02.2014 15:15 # 0
HellMaster_HaiL 06.02.2014 15:31 # 0
Ведь список методов, по сути, может быть тоже сторонним ресурсом. пришедшим из бездны.
В идеале метода ExtractHttpVerb должен принимать xml и IEnumerator (список методов) и работать уже с ними.
Еще более кошерно, естественно, получить в конфиге чистую строку метода, но это не всегда возможно.
bormand 06.02.2014 15:47 # 0
Да тоже как-то топорно - не понятно, откуда брать дефолт. Хардкодить "2" или "POST" как-то некрасиво, раз уж мап теперь приходит извне. Передавать дефолт третьим параметром тоже как-то не айс.
Может быть стоит запилить отдельный универсальный класс в духе MapWithDefault, которому в конструкторе дают мап и дефолт (например добыв все это из недр бизтолка). А метод get этого класса возвращает значение из мапа, или дефолт.
Так мы избавимся от непонятного "2" и абстрагируемся от добывания этого самого мапа. А код выродится в httpVerbs.get(IfExistsExtract(configDOM, "/Config/method", "")
neeedle 06.02.2014 15:15 # 0
dictionary<string, Httpverbs> и по ключу искать, а не парсить потом исправлять кучу ошибок или кидать их дальше по слоям.
И код укоротится еще больше:
А вообще класс с таким словарем должен быть, ИМХО, я бы сделал.
HellMaster_HaiL 06.02.2014 15:33 # 0
Еще, кстати, интересно будет протестировать, что будет работать быстрее:
парсинг + поиск по числовому индексу в массиве
или поиск по строковому ключу словаря
neeedle 06.02.2014 15:35 # 0
Так или иначе это одна единственная ошибка, которую легко обработать.
neeedle 07.02.2014 05:59 # 0
HellMaster_HaiL 07.02.2014 10:55 # 0
Это совершенно не это. Нэймспэйс System.Web.Mvc не используется.
Да и по сути такого жесткого перечисления не нужно. Я использую, к примеру, только GET и POST. Остальные все убрал как и с конфига, так и из кода.