Le lingue digitate dinamicamente che conosco non consentono mai agli sviluppatori di specificare i tipi di variabili, o almeno di avere un supporto molto limitato.
JavaScript, per esempio, non fornisce alcun meccanismo per applicare tipi di variabili quando è conveniente farlo. PHP ti permette di specificare alcuni tipi di argomenti del metodo, ma non c'è modo di usare i tipi nativi ( int
, string
, ecc.) Per gli argomenti, e non c'è modo di imporre i tipi per qualcosa di diverso dagli argomenti.
Allo stesso tempo, sarebbe opportuno avere una scelta per specificare in alcuni casi il tipo di una variabile in una lingua digitata dinamicamente, invece di eseguire manualmente la verifica del tipo.
Perché esiste una tale limitazione? È per ragioni tecniche / prestazionali (suppongo sia nel caso di JavaScript), o solo per ragioni politiche (che è, credo, il caso di PHP)? Questo è un caso per altre lingue digitate dinamicamente che non mi sono familiari?
Modifica: in seguito alle risposte e ai commenti, ecco un esempio di chiarimento: diciamo che abbiamo il seguente metodo in formato PHP:
public function CreateProduct($name, $description, $price, $quantity)
{
// Check the arguments.
if (!is_string($name)) throw new Exception('The name argument is expected to be a string.');
if (!is_string($description)) throw new Exception('The description argument is expected to be a string.');
if (!is_float($price) || is_double($price)) throw new Exception('The price argument is expected to be a float or a double.');
if (!is_int($quantity)) throw new Exception('The quantity argument is expected to be an integer.');
if (!$name) throw new Exception('The name argument cannot be an empty string.');
if ($price <= 0) throw new Exception('The price argument cannot be less or equal to zero.');
if ($price < 0) throw new Exception('The price argument cannot be less than zero.');
// We can finally begin to write the actual code.
// TODO: Implement the method here.
}
Con alcuni sforzi, questo può essere riscritto come (vedi anche Programmazione per contratto in PHP ):
public function CreateProduct($name, $description, $price, $quantity)
{
Component::CheckArguments(__FILE__, __LINE__, array(
'name' => array('value' => $name, 'type' => VTYPE_STRING),
'description' => array('value' => $description, 'type' => VTYPE_STRING),
'price' => array('value' => $price, 'type' => VTYPE_FLOAT_OR_DOUBLE),
'quantity' => array('value' => $quantity, 'type' => VTYPE_INT)
));
if (!$name) throw new Exception('The name argument cannot be an empty string.');
if ($price <= 0) throw new Exception('The price argument cannot be less or equal to zero.');
if ($price < 0) throw new Exception('The price argument cannot be less than zero.');
// We can finally begin to write the actual code.
// TODO: Implement the method here.
}
Ma lo stesso metodo sarebbe scritto come segue se PHP accettasse facoltativamente i tipi nativi per gli argomenti:
public function CreateProduct(string $name, string $description, double $price, int $quantity)
{
// Check the arguments.
if (!$name) throw new Exception('The name argument cannot be an empty string.');
if ($price <= 0) throw new Exception('The price argument cannot be less or equal to zero.');
if ($price < 0) throw new Exception('The price argument cannot be less than zero.');
// We can finally begin to write the actual code.
// TODO: Implement the method here.
}
Quale è più breve da scrivere? Quale è più facile da leggere?