I linguaggi tipicamente dinamici che conosco non consentono mai agli sviluppatori di specificare i tipi di variabili, o almeno hanno un supporto molto limitato per questo.
JavaScript, ad esempio, non fornisce alcun meccanismo per imporre tipi di variabili quando è conveniente farlo. PHP permette di specificare alcuni tipi di argomenti del metodo, ma non c'è modo di usare tipi nativi ( int
, string
, ecc) per argomenti, e non c'è modo di far rispettare i tipi per qualcosa di diverso argomenti.
Allo stesso tempo, sarebbe conveniente avere la possibilità di specificare in alcuni casi il tipo di una variabile in una lingua tipizzata in modo dinamico, invece di fare il controllo del tipo manualmente.
Perché esiste una tale limitazione? È per motivi tecnici / prestazionali (suppongo che sia nel caso di JavaScript) o solo per motivi politici (che è, credo, il caso di PHP)? È un caso per altre lingue tipicamente dinamiche che non conosco?
Modifica: seguendo le risposte e i commenti, ecco un esempio per un chiarimento: diciamo che abbiamo il seguente metodo in semplice 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 contratti 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 verrebbe scritto come segue se PHP accettasse facoltativamente tipi nativi per 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?