Domanda

Esistono altri modi per modificare il tipo di una variabile in un linguaggio tipicamente statico come Java e C ++, tranne 'casting'?

Sto cercando di capire quale sia la differenza principale in termini pratici tra la tipizzazione dinamica e statica e continuo a trovare definizioni molto accademiche. Mi chiedo cosa significhi in termini di aspetto del mio codice.

È stato utile?

Soluzione

Assicurati di non confondere la tipizzazione statica rispetto a quella dinamica con la tipizzazione forte vs. debole.

  • Digitazione statica: ogni variabile, parametro di metodo, tipo restituito ecc. ha un tipo noto al momento della compilazione, dichiarato o dedotto.
  • Digitazione dinamica: i tipi vengono ignorati / non esistono al momento della compilazione
  • Digitazione forte: ogni oggetto in fase di esecuzione ha un tipo specifico e su di esso è possibile eseguire solo le operazioni definite per quel tipo.
  • Digitazione debole: gli oggetti di runtime non hanno un tipo esplicito o il sistema tenta di convertire automaticamente i tipi ogni volta che è necessario.

Questi due opposti possono essere combinati liberamente:

  • Java è staticamente e fortemente tipizzato
  • C è tipizzato staticamente e debolmente (aritmetica del puntatore!)
  • Ruby è tipizzato in modo dinamico e fortemente
  • JavaScript è digitato in modo dinamico e debolmente

Generalmente, la tipizzazione statica significa che molti compilatori vengono colti da errori che sono errori di runtime in un linguaggio tipizzato in modo dinamico, ma significa anche che si trascorre molto tempo a preoccuparsi dei tipi, in molti casi inutilmente (vedere interfacce vs. digitazione anatra).

La tipizzazione forte significa che qualsiasi conversione tra tipi deve essere esplicita, attraverso un cast o attraverso l'uso di metodi di conversione (ad es. l'analisi di una stringa in un numero intero). Ciò significa più lavoro di battitura, ma ha il vantaggio di mantenerti in controllo delle cose, mentre la digitazione debole spesso crea confusione quando il sistema esegue una conversione implicita oscura che ti lascia con un valore variabile completamente sbagliato che causa il metodo del caos dieci linea.

Altri suggerimenti

In C ++ / Java non è possibile modificare il tipo di una variabile.

Digitazione statica : una variabile ha un tipo assegnato al tipo di compilazione e questo non cambia.

Digitazione dinamica : il tipo di una variabile può cambiare durante il runtime, ad es. in JavaScript:

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

La differenza principale è che nelle lingue tipizzate dinamicamente non si conosce fino a quando non si utilizza un metodo in fase di esecuzione se tale metodo esiste. Nelle lingue tipizzate staticamente il controllo viene eseguito al momento della compilazione e la compilazione non riesce se il metodo non esiste.

  

Mi chiedo cosa significhi in termini di aspetto del mio codice.

Il sistema dei tipi non ha necessariamente alcun impatto sull'aspetto del codice, ad es. le lingue con tipizzazione statica, inferenza di tipo e conversione implicita (come Scala per esempio) assomigliano molto alle lingue tipizzate dinamicamente. Vedi anche: Cose da sapere prima di discutere sui sistemi di tipi .

Non hai bisogno di il cast esplicito. In molti casi il cast implicito funziona.

Ad esempio:

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.)

Tuttavia, non è possibile modificare il tipo di una variabile. Puoi usare i sindacati in C ++, tuttavia, per ottenere una sorta di tipizzazione dinamica.

Vediamo Java per aver tipicamente scritto il linguaggio e JavaScript per la dinamica. In Java, per gli oggetti, la variabile è un riferimento a un oggetto. L'oggetto ha un tipo di runtime e il riferimento ha un tipo. Il tipo di riferimento deve essere il tipo di oggetto runtime o uno dei suoi antenati. Ecco come funziona il polimorfismo. Devi eseguire il cast per salire nella gerarchia del tipo di riferimento, ma non verso il basso. Il compilatore garantisce che queste condizioni siano soddisfatte. In una lingua come JavaScript, la tua variabile è proprio questa, una variabile. Puoi fare in modo che punti a qualsiasi oggetto desideri e non ne conosci il tipo fino a quando non esegui il controllo.

Per le conversioni, tuttavia, ci sono molti metodi come toInteger e toFloat in Java per fare una conversione e generare un oggetto di un nuovo tipo con lo stesso valore relativo. In JavaScript ci sono anche metodi di conversione, ma generano anche nuovi oggetti.

Il tuo codice in realtà non dovrebbe apparire molto diverso, indipendentemente dal fatto che tu stia usando o meno un linguaggio tipicamente. Solo perché puoi cambiare il tipo di dati di una variabile in una lingua tipizzata in modo dinamico, non significa che sia una buona idea farlo.

In VBScript, ad esempio, la notazione ungherese viene spesso utilizzata per specificare il tipo di dati preferito di una variabile. In questo modo puoi facilmente individuare se il codice sta mescolando i tipi. (Questo non era l'uso originale della notazione ungherese, ma è piuttosto utile.)

Mantenendo lo stesso tipo di dati, si evitano situazioni in cui è difficile dire cosa fa effettivamente il codice e situazioni in cui il codice semplicemente non funziona correttamente. Ad esempio:

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

Usando la notazione ungherese puoi individuare il codice che mescola i tipi, come:

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

strId = 42 ' putting a number in a string variable
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top