language agnostic - ¿La declaración "si" se considera un método?
language-agnostic if-statement (14)
¿La declaración "si" se considera un método?
No, no se considera un método como posiblemente ya haya visto en las otras respuestas. Sin embargo, si su pregunta fue: "¿Se comporta como un método?", Entonces la respuesta podría ser sí, dependiendo del idioma en cuestión. Cualquier lenguaje que admita funciones de primera clase podría funcionar sin un constructo / enunciado incorporado como if
. Ignora todas las cosas suaves como los valores de retorno y la sintaxis, ya que básicamente es solo una función que evalúa un valor booleano y si es true
, entonces ejecuta algún bloque de código. Ignore también OO y las diferencias funcionales porque los siguientes ejemplos se pueden implementar como un método en la clase Boolean
en cualquier idioma que se esté usando, como Smalltalk lo hace.
Ruby admite bloques de código ejecutable que se pueden almacenar en una variable y transferir a los métodos. Así que aquí hay una función _if_
personalizada implementada en Ruby. Lo que está dentro del { .. }
es una pieza de código ejecutable que se pasa a la función. También se lo conoce como un bloque en 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" }
}
Podemos hacer lo mismo en C, C ++, Objective-C, JavaScript, Python, LISP y en muchos otros idiomas. Aquí hay un ejemplo de JavaScript.
function _if_(condition, code) {
condition && code();
}
_if_(42 > 0, function() { console.log("Yes!"); });
Interesante discusión surgió entre mis pares sobre si la declaración "si" se considera o no un método. Aunque se agrega "if" a la declaración de palabra, aún se comporta de forma similar a un método simple de valor de no devolución.
Por ejemplo:
if(myValue) //myValue is the parameter passed in
{
//Execute
}
Del mismo modo, un método podría realizar la misma operación:
public void MyMethod(myValue)
{
switch(myValue)
{
case true:
//Logic
break;
case false:
//Logic
break;
}
}
¿Es correcto llamar (considerar) la declaración "si" un método predefinido simple en un lenguaje de programación?
Considerar que la declaración if
es un método solo lo hace confuso, en mi opinión. Las similitudes con una llamada a un método son solo superficiales.
La instrucción if
es una de las declaraciones que controlan el flujo de ejecución. Cuando se compila en código máquina nativo, evaluará la expresión y realizará un salto condicional.
Pseudo código:
load myValue, reg0
test reg0
jumpeq .skip
; code inside the if
.skip:
Si usa else
, obtendrá dos saltos:
load myValue, reg0
test reg0
jumpeq .else
; code inside the if
jmp .done
.else:
; code inside the else
.done:
Depende del idioma con seguridad, pero en C, java, perl, no, son comandos de idioma. Palabras reservadas. Si fueran funciones, podría sobrecargarlas y obtener punteros para ellas y hacer todas las otras cosas que puede hacer con las funciones.
Sin embargo, esta es más una cuestión philiosophical que una cuestión de programación.
En idiomas como C, C ++, C #, Java, IF
es una declaración implementada como palabra reservada, parte del núcleo del lenguaje. En los lenguajes de programación de la familia LISP (Scheme viene a la mente) IF
es una expresión (lo que significa que devuelve un valor) y se implementa como una forma especial. Por otro lado, en lenguajes orientados a objetos puros como Smalltalk, IF
realmente es un método (más precisamente: un mensaje ), típicamente implementado en la clase Boolean
o en una de sus subclases.
En pocas palabras: la verdadera naturaleza de la instrucción condicional IF
depende del lenguaje de programación y del paradigma de programación de ese idioma.
La instrucción IF es una característica de construcción condicional utilizada en la mayoría de idiomas que ejecuta un flujo de ruta desde la evaluación de la condición booleana de verdadero o falso. Aparte del caso de predicado de bifurcación, esto siempre se logra modificando selectivamente el flujo de control en función de alguna condición.
La construcción IF es la lógica más básica y necesaria que se usa al programar. Permite que se introduzcan los bloques de construcción para las funciones.
No puede crear un método myIfStatement()
y esperar que funcione lo siguiente:
...
myIfStatement(something == somethingElse)
{
// execute if equal
}
else
{
// execute if different
}
if
es una instrucción de control, y no puede ser replicada por un método, ni puede reemplazar una llamada a un método con if:
myVariable = if(something == somethingElse);
if
no puede ser sobrecargado
Estas son algunas señales de que if
no es un método, pero hay otros que sospecho.
No, la declaración "si" no es como un método en C #. Considere las formas en que no es como un método:
- Las entidades en el bloque contenedor están dentro del alcance de un "si". Pero un método no obtiene ningún acceso al entorno de enlace de su llamador.
- En muchos idiomas, los métodos son miembros de algo, un tipo, probablemente. Las declaraciones no son miembros.
- En idiomas con métodos de primera clase, los métodos se pueden pasar como datos. (En C #, convirtiéndolos en delegados). Las sentencias "if" no son de primera clase.
- y así. Las diferencias son innumerables.
Ahora, tiene sentido pensar en algunas cosas como un tipo de método, simplemente no en las afirmaciones "si". Muchos operadores, por ejemplo, se parecen mucho a los métodos. Hay muy poca diferencia conceptual entre:
decimal x = y + z;
y
decimal x = Add(y, z);
Y, de hecho, si desensambla una adición de dos decimales en C #, encontrará que el código generado en realidad es una llamada a método.
Algunos operadores tienen características inusuales que dificultan su caracterización como método:
bool x = Y() && Z();
es diferente de
bool x = Y (Y (), Z ());
en un lenguaje que tiene una evaluación entusiasta de los argumentos del método; en el primero, Z () no se evalúa si Y () es falso. En el segundo, ambos son evaluados.
Su creación de un método "si" más bien plantea la pregunta; la implementación es más complicada que una declaración "si". Decir que puedes emular "si" con un interruptor es como decir que puedes emular una bicicleta con una motocicleta; reemplazar algo simple con algo mucho más complejo no es convincente. Sería más razonable señalar que un interruptor es en realidad un "si" elegante.
No. No regresas cuando terminas con un if. Es simplemente una declaración de control.
Por supuesto, puede escribir los métodos If()
y IfElse()
, pero eso no los hace iguales.
if()
se define como una declaración en el lenguaje, al mismo nivel que las llamadas a métodos. Pero hay diferencias en ao syntax y posibilidades de optimización.
Entonces: No, la declaración if()
no es un método . No puede, por ejemplo, no asignarlo a un delegado.
Si por método entendemos un bloque de código que podría llamarse y el flujo de control regresa automáticamente a la persona que llama cuando el método finaliza, entonces if
s no son métodos. El flujo de control no regresa a ninguna parte después de if
se ejecuta un if
.
Si se clasificara como un método, seguramente estaríamos en los dominios de OO, sin embargo no lo estamos, así que asumiré que estamos hablando de una función. Ciertamente, se podría escribir una función / subrutina para replicar el comportamiento if (creo que en realidad es una función en lisp / scheme).
No lo clasificaría como una función o incluso como una subrutina, solo controlé el flujo.
Tenga en cuenta que en su ejemplo, reemplazó una "declaración de selección" (especificación C # 4, sección 8.7), la instrucción if (sección 8.7.1) con otra, la instrucción switch (sección 8.7.2). También refactorizó la declaración de selección en un método separado. Sin embargo, no ha reemplazado el uso de una declaración de selección con un método.
La respuesta a tu pregunta es no".
Un método tiene una firma y su intención principal es la lógica reutilizable , mientras que si es simplemente una condición que controla el flujo de ejecución. Si entiende ensamblaje, sabría que ambos son diferentes incluso en un nivel muy bajo.
Sí , if
es una función en ciertos idiomas, aunque es rara y los usos son limitados.
Por lo general, la construcción es algo así como if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse)
Esto se puede usar como delegado a otras funciones si así lo desea.
Mathematica, por ejemplo, se comporta de esta manera e incluso C # puede hacerlo con un poco de trabajo si usa expresiones Linq; Eche un vistazo a System.Linq.Expressions.Expression.IfThenElse
.