C'è qualche situazione in cui sarebbe opportuno usare a meno che ... altro?

7

Questa costruzione è considerata errata

unless
  #..
else
  #..
end

Questo è il motivo generale delle confusioni a doppia negazione. Si traduce in:

if not 
  #..
if not not
  #..
end

Siamo tutti d'accordo nel confondere.

C'è qualche situazione (include semantica) che la costruzione unless..else sarebbe più appropriata?

    
posta New Alexandria 12.07.2013 - 01:05
fonte

3 risposte

12

Non ho lavorato con Ruby, ma Perl ha un costrutto simile che ha lo stesso tipo di bagaglio intorno.

Non c'è differenza strutturale tra questi 3 costrutti:

if condition
    OneThing()
else
    AnotherThing()

unless condition
    AnotherThing()
else:
    OneThing()

if not condition
    AnotherThing()
else:
    OneThing()

Tuttavia, semanticamente, penso che la ragione per cui le persone lo raccomandino è che unless condition è in realtà solo zucchero sintattico per if not condition . La differenza è che non tutte le lingue hanno unless in modo che quest'ultimo sia più immediatamente leggibile da un nuovo programmatore. Quando si introduce unless di solito è nel contesto della definizione di cui sopra.

L'uso di unless then else confonde ulteriormente le cose, perché mentre unless è una scorciatoia utile, unless else aggiunge confusione avendo un costrutto sconosciuto non usato in modo appropriato.

Qualsiasi unless then else può essere banalmente riscritto come if then else , quindi suggerirei che non ci sono casi in cui unless then else migliora la leggibilità o la computabilità del codice.

    
risposta data 12.07.2013 - 01:24
fonte
4

Non ci sono.

Qualsiasi costrutto di quel tipo può essere riscritto nella seconda forma, con maggiore chiarezza.

Nella maggior parte delle lingue, if not not collassa comunque in un if semplice, quindi le conseguenze di piegamento mentale di unless else diventano particolarmente inutili.

    
risposta data 12.07.2013 - 01:20
fonte
0

Non vuoi "se non" perché causa facilmente confusione perché una condizione if con un built-in negativo sarebbe solo una cattiva progettazione. Anche perché è facile usare solo un "se".

Si otterranno dei costrutti come:

unless !(x=3) {

unless(item.isnotred){

che devi leggere due volte, dove è facile:

if (x=3)

if (item.isred){

è molto chiaro.

A meno che l'operatore non porti a doppi negativi che dovrebbero essere evitati.

    
risposta data 18.09.2013 - 08:54
fonte

Leggi altre domande sui tag