dimitri rettig: Komplexe if-Bedingung

Beitrag lesen

hallo,

ich habe noch einige schönheitsfehler entdeckt:

1. um die ganzen form(s) wegzulassen, kannst du http://selfhtml.teamone.de/javascript/sprache/objekte.htm#with verwenden.

2. es sieht viel besser aus, wenn du du an Stelle von if ...== 1, 2, 3 die switch-Anweisung verwendest (mein geschmack).

3. du könntest den quelltext natürlich auch unlesber gestalten. diese technik ins besondere bei perl-programmierern weit verbreitet.

with(document.form) {
  if ((REPORT_DETAIL_TYPE.value == 1
    && REGION.options[0].selected
    && PRODUCTLINE.options[0].selected
    && PROJECT_STATUS.options[0].selected
    && TIER.options[0].selected
    && APPLICATIONS.options[0].selected
    && PRODUCT_PROJECT.options[0].selected
    && OEM.options[0].selected
    && MISC.options[0].selected)
    ||
    (REPORT_DETAIL_TYPE.value == 2
    && REGION.options[0].selected
    && TIER.options[0].selected
    && OEM.options[0].selected
    && MISC.options[0].selected)
    ||
    (REGION.options[0].selected
    && PRODUCTLINE.options[0].selected
    && TIER.options[0].selected
    && APPLICATIONS.options[0].selected
    && PRODUCT_PROJECT.options[0].selected
    && OEM.options[0].selected
    && MISC.options[0].selected)) {
      alert("Headline!");
      REGION.focus();
      return false;
    }
}

du könntest hier natürlich noch einiges ausklammern, sodass das ergebnis so aussähe:

with(document.form) {
  if (
    REGION.options[0].selected
    && TIER.options[0].selected
    && OEM.options[0].selected
    && MISC.options[0].selected
    &&
    (
      (
        REPORT_DETAIL_TYPE.value == 1
        && PRODUCTLINE.options[0].selected
        && PROJECT_STATUS.options[0].selected
        && APPLICATIONS.options[0].selected
        && PRODUCT_PROJECT.options[0].selected
      )
      ||
      REPORT_DETAIL_TYPE.value == 2
      ||
      (
        PRODUCTLINE.options[0].selected
        && APPLICATIONS.options[0].selected
        && PRODUCT_PROJECT.options[0].selected
      )
    )
  )
  {
    alert("Headline!");
    REGION.focus();
    return false;
  }
}

wie man jetzt leicht erkennen kann, ist der letzte ausdruck des gesamten terms (also die große klammer) immer dann wahr, wenn der letzte klammerausruck in dieser klammer wahr ist, oder wenn REPORT_DETAIL_TYPE.value gleich zwei ist.

oder:

REPORT_DETAIL_TYPE.value == 1
        && PRODUCTLINE.options[0].selected
        && PROJECT_STATUS.options[0].selected
        && APPLICATIONS.options[0].selected
        && PRODUCT_PROJECT.options[0].selected

impliziert

PRODUCTLINE.options[0].selected
        && APPLICATIONS.options[0].selected
        && PRODUCT_PROJECT.options[0].selected

da all die aussagen durch ein logischer oder verknüpft sind, reicht es vollkommen aus, wenn die letztere aussage wahr ist. man kann also die gesamte if-anweisung vereinfachen:

with(document.form) {
  if (
    REGION.options[0].selected
    && TIER.options[0].selected
    && OEM.options[0].selected
    && MISC.options[0].selected
    &&
    (
      REPORT_DETAIL_TYPE.value == 2
      ||
      (
        PRODUCTLINE.options[0].selected
        && APPLICATIONS.options[0].selected
        && PRODUCT_PROJECT.options[0].selected
      )
    )
  )
  {
    alert("Headline!");
    REGION.focus();
    return false;
  }
}

und schon sieht der ausdruck ordentlich aus. ich hoffe einfach mal, dass ich keinen fehler gemacht habe. aber vom grundansatz her, sollte es stimmen. der nachteil des vereinfachten ausdrucks ist, dass änderungen sich nur schwerlich einbringen lassen. deswegen würde ich dir raten, erst einmal mit vielen verschachtelten if-else blöcken zu arbeiten, und dann, wenn du dir sicher bist, dass nichts mehr geändert werden muss, versuchen, den term zu vereinfachen.

mit freundlichen grüßen
   dimitri rettig