49

Interessante discussione tra i miei colleghi sul fatto che l'affermazione "se" sia considerata un metodo o meno? Anche se "se" viene aggiunto con la dichiarazione della parola, si comporta ancora come un semplice metodo di valore di non ritorno.L'istruzione "if" considera un metodo?

Ad esempio:

if(myValue) //myValue is the parameter passed in 
{ 
    //Execute 
} 

Allo stesso modo un metodo potrebbe eseguire la stessa operazione:

public void MyMethod(myValue) 
{ 
    switch(myValue) 
    { 
     case true: 
      //Logic 
      break; 
     case false: 
      //Logic 
      break; 
    } 
} 

E 'esatto chiamare (considerare) la "if" un semplice metodo predefinito in una programmazione linguaggio?

+35

No, 'if' è un flusso logico non costruire un metodo. – asawyer

+0

No, non lo penserei mai in questo modo. È una dichiarazione di controllo, integrata nella lingua. Sarò sorpreso se qualcun altro è d'accordo con te. – duffymo

+3

public int five() {return 5; } // vuol dire che 5 è un metodo? – yurib

risposta

106

In lingue come C, C++, C#, Java, IF è una dichiarazione implementata come parola riservata, parte del nucleo della lingua. Nei linguaggi di programmazione della famiglia LISP (Schema mi viene in mente) IF è un'espressione (ovvero restituisce un valore) ed è implementata come un modulo speciale. D'altra parte, in puro linguaggio orientato agli oggetti come Smalltalk, IF è in realtà è un metodo (più precisamente: un messaggio), in genere implementato nella classe Boolean o in una delle sue sottoclassi.

Bottom line: la vera natura dell'istruzione condizionale IF dipende dal linguaggio di programmazione e dal paradigma di programmazione di tale linguaggio.

+12

+1 per Smalltalk :) –

+7

@ noah1989: Accetto. Strano che ci sia una sola risposta che menziona Smalltalk. "Coloro che dimenticano la loro storia sono tenuti a ripeterlo", immagino ... –

+0

@NiklasB. in che dialetto di Lisp? Puoi fornire un collegamento? Perché in Scheme di solito è una forma speciale o una macro, non può essere una funzione - non tutti i suoi argomenti vengono valutati come in una funzione normale: solo la condizione viene sempre valutata e viene valutata la conseguente o l'alternativa, mai entrambi –

8

Dipende sicuramente dalla lingua, ma in C, java, perl, no, sono comandi di lingua. Parole riservate Se fossero funzioni, saresti in grado di sovraccaricarle e ottenere puntatori a loro e fare tutte le altre cose che puoi fare con le funzioni.

Questa è più una questione filosofica che una domanda di programmazione.

+1

funziona anche con i dati di ritorno. se e passa non farlo. Guardando sempre meno come una funzione, più ci penso. Non puoi passarlo a un'altra funzione come parametro. – stu

+0

Tuttavia, un metodo che include void non restituisce alcun valore. – loyalpenguin

+1

che non lo rende non una funzione. Questo lo rende una funzione che non restituisce nulla. In tutti gli altri aspetti è ancora una funzione (ottenere un puntatore, ecc.) Mentre un comando di linguaggio non lo è. – stu

3

Naturalmente è possibile scrivere i metodi If() e IfElse() ma questo non li rende uguali.

if() è definito come un'istruzione nella lingua, allo stesso livello delle chiamate di metodo. Ma ci sono differenze in a.o. sintassi e possibilità di ottimizzazione.

Quindi: No, la dichiarazione non è un metodo. Ad esempio, non è possibile assegnarlo a un delegato.

2

Se dovesse essere classificato come un metodo, sicuramente saremmo nel regno di OO, tuttavia non lo siamo, quindi supporrò che stiamo parlando di una funzione. Certamente una funzione/subroutine potrebbe essere scritta per replicare il comportamento if (penso che sia in realtà una funzione in lisp/scheme).

Non lo classificherei come una funzione o anche una subroutine, ma controlla il flusso.

2

Se per metodo capiamo un blocco di codice che potrebbe essere chiamato ed il flusso di controllo ritorna automaticamente al chiamante quando il metodo termina, poi if s non sono metodi. Il flusso di controllo non restituisce in qualsiasi momento dopo l'esecuzione di if.

0

No.Non torni indietro quando hai finito con un if. È semplicemente una dichiarazione di controllo.

0

Si noti che nel tuo esempio, è stata sostituita una "dichiarazione di selezione" (C# 4 specifica, la sezione 8.7), il se dichiarazione (sezione 8.7.1) con un altro, l'istruzione switch (punto 8.7.2). Hai anche rifattorizzato la dichiarazione di selezione in un metodo separato. Tuttavia, non hai sostituito l'uso di una dichiarazione di selezione con un metodo.

La risposta alla tua domanda è "no".

+0

Perché il downvote? – phoog

4

Un metodo ha una firma e il suo intento principale è resuable logico, mentre se è semplicemente una condizione che controlla il flusso di esecuzione. Se capisci il montaggio, sapresti che entrambi sono diversi anche a un livello molto basso.

3

Considerare l'istruzione if come un metodo lo rende solo confuso, secondo me. Le somiglianze con una chiamata al metodo sono solo superficiali.

L'istruzione if è una delle istruzioni che controllano il flusso di esecuzione. Quando è compilato nel codice macchina nativo, valuterà l'espressione e farà un salto condizionato.

Pseudo codice:

load myValue, reg0 
test reg0 
jumpeq .skip 
    ; code inside the if 
.skip: 

Se si utilizza else, si otterrà due salti:

load myValue, reg0 
test reg0 
jumpeq .else 
    ; code inside the if 
    jmp .done 
.else: 
    ; code inside the else 
.done: 
14

Non è possibile creare un metodo myIfStatement() e si aspettano il seguente al lavoro:

... 
myIfStatement(something == somethingElse) 
{ 
    // execute if equal 
} 
else 
{ 
    // execute if different 
} 

if è una dichiarazione di controllo e non può essere replicato da un metodo, né è possibile sostituire una chiamata di metodo con se:

myVariable = if(something == somethingElse); 

if non può essere sovraccaricato.

Questi sono alcuni segni che non è un metodo, ma ci sono altri che io sospetto sia lo if.

42

No, l'istruzione "se" non assomiglia a un metodo in C#. Considera i modi in cui non è come un metodo:

  • Le entità nel blocco contenitore sono nel campo di validità di un "se". Ma un metodo non ottiene alcun accesso all'ambiente di binding del suo chiamante.
  • In molti linguaggi i metodi sono membri di qualcosa - un tipo, probabilmente. Le dichiarazioni non sono membri.
  • Nelle lingue con metodi di prima classe, i metodi possono essere passati come dati. (In C#, convertendoli in delegati.) "Se" le affermazioni non sono di prima classe.
  • e così via. Le differenze sono una miriade.

Ora, ha senso pensare ad alcune cose come a un tipo di metodo, ma non a dichiarazioni "se". Molti operatori, ad esempio, sono molto simili ai metodi.C'è poca differenza concettuale tra:

decimal x = y + z; 

e

decimal x = Add(y, z); 

E in effetti se si smonta l'aggiunta di due decimali in C#, troverete che il codice generato in realtà è un metodo chiamata.

Alcuni operatori hanno caratteristiche particolari che rendono difficile caratterizzare loro come metodi se:

bool x = Y() && Z(); 

è diverso da

bool x = E (Y(), Z());

in un linguaggio che ha una valutazione stimolante degli argomenti del metodo; nel primo, Z() non viene valutato se Y() è falso. Nel secondo, entrambi vengono valutati.

La creazione di un metodo "se" fa piuttosto sorgere la domanda; l'implementazione è più complicata di un'istruzione "if". Dire che è possibile emulare "se" con un interruttore è come dire che è possibile emulare una bicicletta con una moto; sostituire qualcosa di semplice con qualcosa di molto più complesso non è convincente. Sarebbe più ragionevole sottolineare che un interruttore è in realtà un "se" di fantasia.

2

L'istruzione IF è una funzione di controlo condizionale utilizzata nella maggior parte delle lingue che esegue un flusso di percorso dalla valutazione delle condizioni booleane di vero o falso. A prescindere dal caso della previsione delle branche, ciò viene sempre ottenuto alterando selettivamente il flusso di controllo in base ad alcune condizioni.

Il costrutto IF è la logica più basilare e necessaria utilizzata durante la programmazione. Permette di introdurre gli elementi costitutivi delle funzioni.

3

L'istruzione "se" è considerata un metodo?

No, non è considerato un metodo come si è già visto nelle altre risposte. Tuttavia, se la tua domanda fosse: "Si comporta come un metodo?", La risposta potrebbe essere a seconda della lingua in questione. Qualsiasi linguaggio che supporti funzioni di prima classe potrebbe fare a meno di un costrutto/istruzione incorporato come if. Ignora tutte le cose soffici come i valori di ritorno e la sintassi, in pratica è solo una funzione che valuta un valore booleano e se è true, quindi esegue un blocco di codice. Ignora anche OO e differenze funzionali perché i seguenti esempi possono essere implementati come metodo sulla classe Boolean in qualsiasi lingua venga utilizzata come Smalltalk.

Ruby supporta blocchi di codice eseguibile che possono essere memorizzati in una variabile e trasferiti ai metodi. Quindi ecco una funzione personalizzata _if_ implementata in Ruby. Il materiale all'interno di { .. } è un pezzo di codice eseguibile passato alla funzione. È anche conosciuto come blocco in Ruby.

def _if_ (condition) 
    condition && yield 
end 

# simple statement 
_if_ (42 > 0) { print "42 is indeed greater than 0" } 

# complicated statement 
_if_ (2 + 3 == 5) { 
    _if_ (3 + 5 == 8) { puts "3 + 5 is 8" } 
    _if_ (5 + 8 == 13) { puts "5 + 8 is 13" } 
} 

Possiamo fare la stessa cosa in C, C++, Objective-C, JavaScript, Python, LISP, e molte altre lingue. Ecco un esempio di JavaScript.

function _if_(condition, code) { 
    condition && code(); 
} 

_if_(42 > 0, function() { console.log("Yes!"); }); 
2

, if è una funzione in alcune lingue, anche se è raro e gli usi sono limitati.

Di solito il costrutto è qualcosa di simile if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse) Questo può essa stessa essere usata come delegato ad altre funzioni, se si desidera.

Mathematica, ad esempio, si comporta in questo modo e anche C# può farlo con un po 'di lavoro se si utilizzano le espressioni di Linq; Dai uno sguardo allo System.Linq.Expressions.Expression.IfThenElse.