2016-06-13 2 views
1

Я новичок в C# и пытаюсь сделать условное утверждение, где я проверяю, какой вариант мой скрипт должен выбрать на веб-странице. Прямо сейчас я делаю это так, когда я делаю отдельные инструкции bool для каждого параметра, и у меня есть длинный else if, проверяющий каждый из них.Наиболее эффективный условный оператор для нескольких опций?

bool PersonalPolicy = true; 
bool FarmOwnersPolicy = true; 

if (PersonalPolicy) 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_radioListCommOrPersonal_0")).Click(); 
} 
else 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_radioListCommOrPersonal_1")).Click(); 
} 
if (FarmOwnersPolicy) 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_rdoPolicyType_0")).Click(); 
} 
else if (SelectoMaticPolicy) 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_rdoPolicyType_1")).Click(); 
} 
else 
{ 
    driver.FindElement(By.Id("cphMain_ctl_WorkflowManager_Quote_Farm_ctl_Farm_Basic_Policy_Info_rdoPolicyType_2")).Click(); 
} 

Проблема для некоторых вещей, которые я хочу, чтобы проверить, есть тонна вариантов я не хочу, чтобы сделать миллион заявлений BOOL и имею очень долго еще, если заявления. Есть ли более простой способ отформатировать это?

+0

Определите свои элементы согласно POM, например. '[FindsBy (How = How.ID, Using =" cphMain_BLAHBLAHBLAHType_1 ")] public IWebElement RandomClickableElement;'. Затем назовите его «RandomClickableElement.Click();« –

+0

»Я не знаю, можно ли переписать это, чтобы не использовать столько условий, но я думаю, вы могли бы свести к минимуму код, который вам нужно написать, извлекая код внутри if else в отдельном методе, который делает driver.find ... и добавляет строку параметров к уже существующей строке, которую вы используете для клика. Таким образом, вы будете писать меньше кода. – meJustAndrew

+0

@meJustAndrew Хорошо, что помогает, да, часть проблемы заключается в том, как долго код, когда у меня так много вариантов, я пытаюсь найти как можно больше способов минимизировать, сколько мне нужно писать. –

ответ

1

Это действительно зависит от вашей фактической логики. И я боюсь, что этот вопрос может стать помеченным, поскольку он может быть «слишком общим».

Тем не менее, существует множество способов приблизиться к проверке нескольких состояний.

Если вы ожидаете получить только один результат при нескольких проверках (то есть вы ожидали бы, что EITIER PersonalPolicy, FarmOwnersPolicy или SelectoMaticPolicy будет возвращен), лично я бы, вероятно, установил переменную PolicyType и выполнил на ней инструкцию switch. Пример:

switch(PolicyType){ 
    case "PersonalPolicy": 
     // Code specific to PersonalPolicy 
     break; // Don't forget to break unless you want to use "fallthrough logic" 
    case "FarmOwnersPolicy": 
     // Code specific to PersonalPolicy 
     break ; 
    case default: 
     // Code for "any-other-than" cases :) 
     break; 
} 

Однако для такого подхода осуществимый в вашем случае, вы должны иметь свой отдельный Bools решить какой-то эквивалент выполнения уровня или ошибки уровня.

Это, однако, также можно связать несколько условных выражений с более крупным заявлением. Наиболее распространенными примерами являются: & & или || между каждым заявлением подразумевается «И» или «ИЛИ». Применение особенно обратной логики к OR-заявления может оказаться мощным при сравнении нескольких Bools

Пример:

if (PersonalPolicy) { } 
else { } 

if (FarmOwnersPolicy && !SelectomaticPolicy) { 
    //Will only be executed if FarmOwnersPolicy is True AND SelectomaticPolicy is NOT true. 
} 

if (!FarmOwnersPolicy && !SelectomaticPolicy) { 
    // Will only be executed if FarmOwnersPolicy AND SelectomaticPolicy are both unset 
} 

if (!FarmOwnersPolicy || !SelectomaticPolicy) { 
    // Will be executed if either FarmOwnersPolicy OR SelectomaticPolicy is unset 
} 

Этот последний подход может быть более полезным, когда у вас есть несколько условий, которые будут проверяться сразу и обеспечивают потенциальную читаемость, противоположную бесконечной полосе if-else.

Если у меня есть «бесконечное количество проверок», я обычно пытаюсь разбить каждый «набор» булевых проверок в блоках и одну результирующую переменную.

Его трудно дать хороший пример для этого, но представьте, что у нас была бы форма huuuuge (для простоты), где есть раздел адреса и т. Д. Сначала я могу сначала проверить всю адресную информацию и соединить это с «AddressValid» bool, просто для улучшения удобочитаемости в следующих разделах :) Кроме того, если одна часть этой последовательной логики bool сломается, это может быть меньше проблем с чтением в «то, что этот код делал», когда у вас нет немного коснулся этого кода.

Edit:

Там же (троичный) оператор Условный. При использовании в следующем примере:

TestCase ? Value1 : Value2; 

это приводит к следующей логике:

If (TestCase){ 
    return Value1; 
} 
Else { 
    return Value2; 
} 

я использую это «все время» для установки по умолчанию и значения, или возвращать некоторые переменные default- когда он не содержит значения, которое я ожидал бы.

+0

Это полезно и, кажется, то, что я ищу, спасибо. –

+0

Добро пожаловать. Кроме того, что касается получения «значений по умолчанию», я забыл упомянуть одного довольно удобного оператора. «Тернарный оператор», я отредактирую свой ответ, чтобы включить его в течение нескольких минут :) – Annihlator