2016-06-13 12 views
1

Ich bin neu in C# und versuche, eine bedingte Anweisung zu machen, wo ich überprüfe, welche Option mein Skript auf einer Webseite auswählen soll. Im Moment mache ich es so, wo ich für jede Option individuelle bool-Anweisungen gemacht habe und ich habe eine lange else if-Anweisung, die jede von ihnen prüft.Effizienteste Bedingungsanweisung für mehrere Optionen?

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(); 
} 

Das Problem ist für einige Dinge, die ich eine Tonne von Optionen überprüfen wollen, gibt es Ich will nicht eine Million Bool Aussagen und haben wirklich lange else if Aussagen machen. Gibt es eine einfachere Möglichkeit, dies zu formatieren?

+0

Definieren Sie Ihre Elemente gemäß POM, z. '[FindsBy (How = Wie.ID, Using =" cphMain_BLAHBLAHBLAHType_1 ")] public IWebElement RandomClickableElement;'. Rufen Sie es dann mit 'RandomClickableElement.Click();' –

+0

auf. Ich weiß nicht, ob dies neu geschrieben werden könnte, um so viele Bedingungen zu verwenden, aber ich denke, Sie könnten den Code minimieren, den Sie schreiben müssen, indem Sie den Code innerhalb des if else extrahieren Anweisungen in einer separaten Methode, die driver.find ... ausführt und eine Parameterzeichenfolge an die bereits vorhandene Zeichenfolge anfügt, die Sie zum Klicken verwenden. Auf diese Weise werden Sie weniger Code schreiben. – meJustAndrew

+0

@meJustAndrew Ok, das hilft, ja ein Teil des Problems ist, wie lange der Code ist, wenn ich so viele Optionen habe Ich versuche so viele Möglichkeiten zu finden, um zu minimieren, wie viel ich schreiben muss. –

Antwort

1

Das hängt wirklich von Ihrer tatsächlichen Logik ab. Und ich befürchte, dass diese Frage möglicherweise als "zu allgemein" markiert wird.

Dennoch gibt es eine Menge Möglichkeiten, um mehrere Zustände zu überprüfen.

Wenn Sie bei mehreren Prüfungen nur ein einziges Ergebnis erwarten (d. H. Sie würden ENTWEDER PersonalPolicy, FarmOwnersPolicy oder SelectoMaticPolicy persönlich erwarten), würde ich wahrscheinlich eine "PolicyType" -Variable setzen und eine switch-Anweisung ausführen. Beispiel:

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; 
} 

jedoch für diese Vorgehensweise in Ihrem Fall möglich sein, müßten Sie Ihre separaten bools zu einem gewissen Äquivalent eines Ausführungsebene oder fehler Ebene gelöst haben.

Es ist jedoch auch möglich, mehrere Bedingungen mit einer größeren Einzelaussage zu verknüpfen. Die am häufigsten vorkommenden Beispiele sind & & oder || zwischen jeder Aussage bedeutet "AND" oder "OR". Die Anwendung besonders inverse Logik OR-Anweisungen kann beweisen, mächtig sein, wenn mehrere bools Vergleich

Beispiel:

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 
} 

Diese letztere Ansatz kann mehr sehr nützlich sein, wenn Sie mehr Bedingungen auf einmal zu prüfen und zu bieten eine mögliche Lesbarkeit gegenüber einem endlosen Streifen von If-Elsen.

Wenn ich "eine (anscheinend endlose) Anzahl von Überprüfungen" habe, versuche ich normalerweise jede "Menge" von booleschen Überprüfungen in Blöcken und eine einzige resultierende Variable aufzulösen.

Es ist schwer, ein gutes Beispiel dafür zu geben, aber stellen Sie sich vor, wir hätten eine riesige Form (der Einfachheit halber), wo es einen Adressbereich usw. gibt. Vielleicht möchte ich zuerst alle Adressinformationen überprüfen und diese zusammenführen ein "AddressValid" bool, nur für verbesserte Lesbarkeit in weiteren Sektionen :) Wenn ein Teil dieser sequentiellen Bool-Logik würde brechen, ist es möglicherweise weniger Aufwand, in "was dieser Code getan hat" zu lesen, wenn Sie nicht haben habe diesen Code ein wenig berührt.

Edit:

Es gibt auch das Bedingte (Ternary) Operator. Wenn im folgende Beispiel verwendet:

TestCase ? Value1 : Value2; 

es in der folgenden Logik ergibt:

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

Ich benutze diese „die ganze Zeit“ default-Werte für die Einstellung oder die Rückkehr bestimmte Variablen Default- Werte, wenn es keinen Wert enthält, den ich erwarten würde.

+0

Dies ist hilfreich und scheint zu sein, was ich suche, danke. –

+0

Sie sind herzlich willkommen. Auch bezüglich des Erhalts von "Standardwerten" habe ich vergessen, einen recht handlichen Operator zu erwähnen. Der "Ternary Operator", ich bearbeite meine Antwort, um diese in ein paar Minuten aufzunehmen :) – Annihlator

Verwandte Themen