Autor Zpráva
srigi
Profil
Kcem sa opytat ako vyriesit tuto modelovu situaciu (kedze sa jedna o vseobecny programatorsky problem, davam to do tejto sekcie).

Majme kod, ktory sa vykona ak je splnena nejaka podmienka (napr. pridanie objednavky do kosika iba vtedy ak udaje z formulara presli validatorom)

if ($form->validate()) {
  for ($form as $item) {
    $basket->addItem($item);
  }
}


Cele to trocha skomplikujme a pridajme dalsiu podmienku:
if ($form->validate()) {
  if (isset($form['voucher'])) {
    if ($form['voucher']->isValid()) {
      // tu by malo byt opat pridanie do kosika
    }
  }

  for ($form->items as $item) {
    $basket->addItem($item);
  }
}


Ako sa da toto zjednodusit (iba jeden vyskyt cyklu for ($form->items as $item)) a to tak aby som nemusel pouzit funkciu? Prosim aby ste sa uvedeny priklad divali z nadhladu a nekritizovali konkretnu vec, ktora sa v kode riesi. Zaujima ma iba code flow (a moznost DRY), ked sa takato dodatocna podmienka objavi pod hlavnou podmienkou.
THX.
srigi
Profil
Kcem len dodat, ze jedno hnusne-skarede riesenie existuje v jazykoch s podporou prikazu GOTO:
if ($form->validate()) {
  if (isset($form['voucher'])) {
    if ($form['voucher']->isValid()) {
      goto LABEL;
    }
  }

:LABEL
  for ($form->items as $item) {
    $basket->addItem($item);
  }
}


Tomuto sa ale samozrejme kcem vyhnut.
Chamurappi
Profil
Reaguji na srigiho:
Chtělo by to asi lepší příklad, protože tak, jak jsi to napsal, dochází k přidání do košíku vždy, takže není důvod se opakovat — celá podmínka je zbytečná, stejně jako případný skok na :LABEL v [#2] (poněvadž není co přeskočit).
srigi
Profil
Chamurappi:
Ano to je pravda. Kcem poukazat na to, ze akcia pridat do kosika sa ma vykonat iba ak je vsetko OK. Preto chybaju else vetvy. Kcem to napisat tak, aby neboli potrebne - ak je najaky problem, telo IF sa obyde.
if ($form->validate()) {
  if (isset($form['voucher'])) {
    if ($form['voucher']->isValid()) {
      // tu by malo byt pridanie do kosika
    } else {
      $form->addError('blablabla');
    }
  }

  // tu by malo byt pridanie do kosika
}

$this->render(array('form'=>$form)); // ak $form nepresiel validatorom, obsahuje chyby ($form->hasErrors())


Alebo to skusim napisat este inak: Ak validator OK, vykonaj kod XYZ. Ak validator OK a zaroven NEJAKA_DODATOCNA_PODMIENKA a zaroven NEJAKA_DODATOCNA_PODMIENKA je OK, vykonaj ten isty kod XYZ.
Chamurappi
Profil
Reaguji na srigiho:
Píšeš pořád totéž. Dle tvého popisu (slovního i programového) se vykonává kód XYZ tak jako tak, není důvod k podmínce uvnitř.

Pokud se snažíš vyjádřit, že se má dotyčný košík-naplňující kód vykonávat pouze při splnění první podmínky a zároveň buď při splnění dalších dvou podmínek, nebo při nesplnění první z těch dalších dvou, tak v tom nevidím vědu — stačí si tuto myšlenku přeložit do programovacího jazyku.
srigi
Profil
Chamurappi:
Ano je to tak, myslim ze sa to da vyjadrit takto:

if (
      (  $form->validate() && !isset($form['voucher'])                                 )
  ||  (  $form->validate() &&  isset($form['voucher']) && $form['voucher']->isValid()  )
) {

  // tu by malo byt pridanie do kosika

}


Vdaka za diskusiu.
TomášK
Profil
srigi:
Do přechozího problému jsem nepronikl, ale ten poslední if jde v zájmu DRY zkrátit:
if ( $form->validate() && ( !isset($form['voucher']) || $form['voucher']->isValid() ) ) {

  // tu by malo byt pridanie do kosika

}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: