Cosa ne pensi di questa nuova sintassi if-then [chiusa]

11

Stavo solo pensando a qualcosa che sarebbe davvero bello avere nei miei controlli if-elif-else.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

Quindi fondamentalmente un then verrà eseguito quando una delle condizioni verrà eseguita TRANNE la condizione else. Pensi che questo sia utile? È simile al try-except-else di python.

Penso che alcuni di voi stiano prendendo a pugni un'implementazione molto preliminare. Il blocco then sarebbe proprio come il blocco else in un blocco try-except in python. La vera ragione che suggerisco è per situazioni come questa.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

Il blocco then ha come ambito il primo se proprio come else è. Quindi la nidificazione funziona bene. E se hai bisogno di eseguire un metodo prima delle istruzioni if, questo in realtà non ha nulla a che fare con questo caso d'uso.

    
posta Falmarri 19.10.2010 - 20:32
fonte

6 risposte

17

Penso che sia orribile. Se vuoi che il codice venga eseguito dopo una serie di condizioni, allora (a) ricontrolla quelle condizioni o (b) imposta una variabile su indicato come stato di successo.

    
risposta data 19.10.2010 - 20:51
fonte
14

Generalmente puoi già farlo con un interruttore / caso e un interruttore / caso fornisce un controllo più preciso su ciò che stai proponendo.

Inoltre, non viene letto correttamente in modo logico. Se A else se B then C. Non implica a qualcuno che C sarà eseguito se A o B valgono per vero.

    
risposta data 19.10.2010 - 20:51
fonte
8

Interessante, ma mi sembra (ammesso in qualche modo impostato nei miei modi) un invito a problemi di leggibilità, logica e sintassi.

Modifica: Il tuo if-elif è molto semplice - e se ci fossero 10 elifs? 20? Tutte le condizioni dovrebbero essere vere? Quali sono le possibilità?
Il tuo if-elif è molto semplice - e se ci fossero 10 elifs? 20? Questo non lo renderebbe illeggibile?

Inoltre, può essere facilmente raggiunto con una metodologia consolidata collaudata:

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Che cosa succede se "stuff_that_applies_to_both" deve avvenire prima dei singoli passaggi? Il tuo codice non gestisce questo caso:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Infine, questa sintassi consente una maggiore flessibilità con più condizioni:     se (thisCondition o thatCondition o anotherCondition)     {       stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Ho usato if / else, ma avrei potuto usare facilmente un'istruzione switch con un flag:

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

Nota che in realtà non avevo bisogno del flag conditionApplies - avrei potuto aggiungere la funzione "stuff_that_applies_to_both ()" a entrambe le condizioni non predefinite - l'ho appena fatto in modo che assomigli più alla sintassi definita sopra, anche se il "then" piuttosto che "else".

Pertanto, mi sembra una sintassi molto specializzata, in cui una sintassi più generale riempie il conto e altro ancora.

+1 per pensare a una possibile funzione (continua a farlo!), ma non voterei per implementarla.

    
risposta data 19.10.2010 - 20:52
fonte
2

Non mi dispiacerebbe usare qualcosa di simile oggi stesso. Ma, per essere sicuro, lo userei tutte le volte che uso ripetere fino a.

Il codice sembrerebbe almeno migliore senza il nesting superfluo. Anche se preferisco Else If a elif . Sostituirei Then con Do e l'ultimo Else con Otherwise .

    
risposta data 19.10.2010 - 21:07
fonte
0

Sembra un'idea interessante. Tuttavia l'unico problema che immagino è che sei più incline a bug. Come scrivere un if / else if e chiamare blah () in poi. Scrivi un altro se non vuoi bla, rimuovendo blah da quel momento e aggiungendolo ai tuoi ifs / elseifs. Poi quando tu o un altro programmatore aggiungete un'altra affermazione, potreste aspettarvi che blah venga chiamato ma non.

O puoi avere diversi ifs, scrivere un blah e dimenticare tutti i ifs ma uno richiede ciò che spezzerebbe qualcosa. Inoltre è probabile che se ne abbia bisogno seguirli tutti se lo metterai sotto il blocco if. Forse impostando un bool in else (NoUpdate = true) e scrivi semplicemente if (! NoUpdate) {} direttamente sotto il quale è più chiaro e può essere impostato da un if

Sto solo dicendo che sembra più soggetto a bug, non che non mi piace l'idea. Non mi dispiacerebbe vederlo in una lingua, ma non posso immaginare nessun situtaion in cui lo userei se la mia lingua lo supporta.

    
risposta data 26.10.2010 - 23:28
fonte
0

Trovo che la tua sintassi sia confusa, ma vedo qualche valore nel concetto. Concettualmente, quando ho preso in considerazione il problema, quello che mi sono trovato a desiderare è un "unelse", che fondamentalmente potrebbe eseguire le cose nei casi in cui l'ultima else non ha sparato. Guardandolo da quell'angolazione, suggerirei che si potrebbe ottenere un risultato simile tramite:

  do
  {
    if (condition1)
      ... stuff for condition1 only
    else if (condition2)
      ... stuff for condition2 only
    else
    {
      ... stuff for neither condition
      break;
    }
    ... stuff for both conditions
  } while(0); // Continuation point for break

In alcuni casi, un'altra opzione potrebbe essere:

  if ( ( condition1 && (action1,1)) ||
       ( condition2 && (action2,1)) ||
       (action_for_neither,0))
    action_for_either;

Un aspetto un po 'brutto, ma in alcuni casi potrebbe non esserci un buon modo per esprimere la sequenza desiderata di eventi diversi dalla duplicazione del codice o usando goto (che potrebbe non essere così male, tranne che per il fumetto che qualcuno potrebbe inserire Qui).

    
risposta data 19.07.2012 - 17:48
fonte

Leggi altre domande sui tag