"positivamente formulato" contro "legge come frase inglese" stile logico [duplicato]

0

Ci dispiace, sarei felice di avere qualcuno che migliora il titolo di questa domanda.

Quali sono i vantaggi e gli svantaggi della logica "formulata positivamente" rispetto al fatto che sia "leggibile in inglese". Sto cercando una posizione generica che possa essere inserita nelle linee guida del codice.

Esempi di ciò che vedo come logica "formulata positivamente"

if ($obj->isValid()){


if ($found){



if ($first){
    //do nothing
}else{
    doX();
}

$this->useFields(array('a','b'));

Esempi di ciò che vedo come logica "formulata negativamente"

if (!$first)
    doX();
}

$this->unset(array('d','e','f','g'));

Considerando che se ci si concentra su "leggibile in inglese", lo vedrei come valido:

if (isValid()){




if ($found){

e questo non è "leggibile in inglese"

if ($l){



if (isValid() || !isActive()){
    doX();
}
    
posta jdog 07.09.2011 - 01:02
fonte

2 risposte

4

In primo luogo vorrei mettere in discussione i vantaggi di "inglese leggibile". Le lingue naturali e l'inglese in particolare possono essere vaghe, ambigue e fuorvianti a un livello strabiliante.

Quanti significati possono avere una frase come "Se x non è rosso e verde" hanno?

L'unica professione che usa l'inglese ma che richiede un alto grado di precisione - la legge - ha finito per usare una versione dell'inglese che è irriconoscibile e illeggibile dalla maggior parte dei madrelingua inglesi.

Devi presumere che chiunque stia leggendo il tuo codice ha una comprensione minima della sintassi del linguaggio del programma e dei suoi idiomi comuni.

In secondo luogo non vedo alcuna ragione mentre "positivamente formulato" dovrebbe essere superiore a "formulato negativamente" in generale. La formulazione più concisa che trasmette l'intenzione è quella da usare.

if (!$first) {
    doX();
}

Secondo me è meglio di: -

if ($first){
    //do nothing
}else{
    doX();
}

Se devi percorrere questa strada, è meglio cambiare il nome della condizione e invertire la logica:

if ($subsequent) {
    doX();
}

L'unica cosa che vorrei davvero evitare è il doppio negativo come in

if (!notValid)

O nozioni di base visive inevitabilmente:

if not Obj IsNothing
    
risposta data 07.09.2011 - 06:00
fonte
0

Vorrei andare con la logica negativa.

Bene, hai qualcosa qui ... Il problema non è la possibilità di leggerlo in una determinata lingua, ma nel processo sottostante.

L'andare alla "logica negativa" semplifica il processo.
Se si dispone di una condizione a livello singolo, è necessario trarre i benefici dai nomi delle procedure, come isValid, isFound, come indicato.
Tuttavia, il vantaggio maggiore diventa visibile di seguito, se si sceglie di utilizzare la logica negativa e di non utilizzare ifs annidati:

se c1:
work1t
se c2:
work2t
se c3:
work3t
altro:
work3f
altro:
work2f
altro:
work1f

vs.

se! c1:
work1f
work1t

se! c2:
work2f
work2t

se! c3:
work3f
work3t

Invece di avere una struttura cespugliosa che può solo crescere e trasformarsi rapidamente in un incubo da mantenere, ora abbiamo un flusso di profondità costante che può essere manipolato in modo abbastanza semplice.

È la stessa idea con la disinfezione, non funzioniamo se tutti i parametri non sono validi, solo che disinfettiamo il processo.

Questa ridotta complessità trascende qualsiasi linguaggio naturale in quanto pura logica. Penso che l'inglese leggibile sia un titolo terrificante. Stai lontano dalle lingue naturali. Sono orribili perché inizi a parlare al computer e finisci con tonnellate di codice inefficiente. Si può andare con qualcosa di quantificabile come mantenere la complessità ciclomatica e NPath della classe / metodo sotto un certo livello.

    
risposta data 17.12.2014 - 15:48
fonte

Leggi altre domande sui tag