If best practice statement [duplicate]

0

Sto rivedendo le migliori pratiche con le dichiarazioni if . Sotto nell'esempio A includo l'intero codice da eseguire e assicuriamo che rimanga all'interno dell'istruzione if . Mentre per esempio B il codice da eseguire risiede al di fuori dell'istruzione if .

Dalla mia comprensione di Best practice su if / return , esempio A sembra essere la migliore pratica.

Esempio A

#!/bin/bash
if [ 'whoami' != 'root' ]
then
  echo "MUST be ROOT!"
  exit
else
  ifconfig -a | sed 's/[ \t].*//;/^\(lo:\|\)$/d'
  read -p "Enter interface: " int
  mac=$(macchanger $int | grep 'Permanent MAC:' |  grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')
  ifconfig $int down
  iwconfig $int mode manage
  macchanger $int $mac
  ifconfig $int up
  echo "$int in stock configuration with MAC: $mac"
  echo "Connect to a Wi-Fi network and run 'ping 1.1.1.1'"
  sleep 2 && cinnamon-settings network &
fi

Esempio B

#!/bin/bash
if [ 'whoami' != 'root' ]
then
  echo "MUST be ROOT!"
  exit
fi
ifconfig -a | sed 's/[ \t].*//;/^\(lo:\|\)$/d'
read -p "Enter interface: " int
mac=$(macchanger $int | grep 'Permanent MAC:' |  grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')
ifconfig $int down
iwconfig $int mode manage
macchanger $int $mac
ifconfig $int up
echo "$int in stock configuration with MAC: $mac"
echo "Connect to a Wi-Fi network and run 'ping 1.1.1.1'"
sleep 2 && cinnamon-settings network &

Posso prevedere un potenziale esempio C, che includerebbe la struttura:

if [ 'whoami' != 'root' ]
then
  echo "MUST be ROOT!"
  exit
if [whoami' == 'root' ]
  then
   ...
fi

Tuttavia, sembra come creare una condizione extra non necessaria, che utilizza risorse aggiuntive. Quindi, ignorerò l'esempio C.

    
posta safesploit 13.08.2018 - 21:13
fonte

1 risposta

3

In questo caso particolare, non penso che ci sia molto da raccomandare l'approccio A contro l'approccio B, o viceversa.

Tuttavia, non sono d'accordo che in generale è meglio usare

if A then 
  stuff
else 
  other stuff
endif

vs

if A then 
  stuff;
  exit/return;
endif

other stuff;

Il problema con l'approccio di nidificazione è che, se applicato con rigore, è possibile ottenere un sacco di nidificazione e l'annidamento è difficile da comprendere per gli umani.

IMHO, il seguente è spesso più semplice e chiaro:

  if A then
    check any boundary cases that dont have mcuh to do the the core logic.
    either throw, or return or whatever makes sense.
  end;

  ASSERT (!A); /// and any further assertions of stuff you checked above.

  // then freely write code ignoring those corner cases as already handled.
    
risposta data 13.08.2018 - 21:39
fonte

Leggi altre domande sui tag