Pregunta

¿Hay otras formas de cambiar el tipo de una variable en un lenguaje de tipo estático como Java y C ++, excepto 'casting'?

Estoy tratando de descubrir cuál es la diferencia principal en términos prácticos entre la tipificación dinámica y estática y seguir encontrando definiciones muy académicas. Me pregunto qué significa en términos de cómo se ve mi código.

¿Fue útil?

Solución

Asegúrese de no confundir la escritura estática y la dinámica con la escritura fuerte contra la débil.

  • Escritura estática: cada variable, parámetro de método, tipo de retorno, etc. tiene un tipo conocido en tiempo de compilación, ya sea declarado o deducido.
  • Escritura dinámica: los tipos se ignoran / no existen en tiempo de compilación
  • Tipo fuerte: cada objeto en tiempo de ejecución tiene un tipo específico, y solo puede realizar aquellas operaciones que están definidas para ese tipo.
  • Tipo débil: los objetos de tiempo de ejecución no tienen un tipo explícito o el sistema intenta convertir tipos automáticamente cuando sea necesario.

Estos dos opuestos se pueden combinar libremente:

  • Java está tipificado estática y fuertemente
  • C se escribe de manera estática y débil (¡aritmética de punteros!)
  • Ruby es dinámica y fuertemente tipada
  • JavaScript se escribe de forma dinámica y débil

En general, la escritura estática significa que el compilador captura muchos errores, que son errores de tiempo de ejecución en un lenguaje de tipo dinámico, pero también significa que pasa mucho tiempo preocupándose por los tipos, en muchos casos innecesariamente (vea interfaces contra pato escribiendo).

La escritura fuerte significa que cualquier conversión entre tipos debe ser explícita, ya sea a través de una conversión o mediante el uso de métodos de conversión (por ejemplo, analizar una cadena en un número entero). Esto significa más trabajo de mecanografía, pero tiene la ventaja de mantenerlo en control de las cosas, mientras que una tipificación débil a menudo genera confusión cuando el sistema realiza una conversión implícita oscura que lo deja con un valor de variable completamente incorrecto que causa un caos en el método. línea.

Otros consejos

En C ++ / Java no puedes cambiar el tipo de una variable.

Escritura estática : una variable tiene un tipo asignado en el tipo de compilación y eso no cambia.

Escritura dinámica : el tipo de una variable puede cambiar durante el tiempo de ejecución, por ejemplo, en JavaScript:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

La principal diferencia es que, en los idiomas tipeados dinámicamente, no lo sabes hasta que no vas a usar un método en tiempo de ejecución si ese método existe. En los idiomas escritos de forma estática, la comprobación se realiza en tiempo de compilación y la compilación falla si el método no existe.

  

Me pregunto qué significa en términos de cómo se ve mi código.

El sistema de tipos no necesariamente tiene ningún impacto en el aspecto del código, por ejemplo, los idiomas con escritura estática, inferencia de tipos y conversión implícita (como Scala, por ejemplo) se parecen mucho a los idiomas tipificados dinámicamente. Consulte también: Qué debe saber antes de debatir los sistemas de tipos .

Usted no necesita la conversión explícita. En muchos casos, la conversión implícita funciona.

Por ejemplo:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

Sin embargo, no puede cambiar el tipo de una variable. Sin embargo, puede usar uniones en C ++ para lograr algún tipo de escritura dinámica.

Echemos un vistazo a Java para el lenguaje tipificado de manera estática y JavaScript para la dinámica. En Java, para los objetos, la variable es una referencia a un objeto. El objeto tiene un tipo de tiempo de ejecución y la referencia tiene un tipo. El tipo de referencia debe ser el tipo del objeto de tiempo de ejecución o uno de sus ancestros. Así es como funciona el polimorfismo. Debe realizar la conversión para subir la jerarquía del tipo de referencia, pero no hacia abajo. El compilador se asegura de que se cumplan estas condiciones. En un lenguaje como JavaScript, tu variable es solo eso, una variable. Puede hacer que apunte a cualquier objeto que desee y no sabe el tipo de él hasta que lo verifique.

Para las conversiones, sin embargo, hay muchos métodos como toInteger y toFloat en Java para hacer una conversión y generar un objeto de un nuevo tipo con el mismo valor relativo. En JavaScript también hay métodos de conversión, pero también generan nuevos objetos.

En realidad, su código no debe ser muy diferente, independientemente de si está utilizando un lenguaje de tipo estático o no. El hecho de que pueda cambiar el tipo de datos de una variable en un lenguaje de tipo dinámico, no significa que sea una buena idea hacerlo.

En VBScript, por ejemplo, la notación húngara se usa a menudo para especificar el tipo de datos preferido de una variable. De esa manera, puedes detectar fácilmente si el código está mezclando tipos. (Este no fue el uso original de la notación húngara, pero es bastante útil).

Al mantener el mismo tipo de datos, evita las situaciones en las que es difícil saber qué hace realmente el código y las situaciones en las que el código simplemente no funciona correctamente. Por ejemplo:

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

Al usar la notación húngara, puede detectar código que está mezclando tipos, como:

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top