Bahasa yang diketik secara dinamis yang saya tahu tidak pernah membiarkan pengembang menentukan jenis variabel, atau setidaknya memiliki dukungan yang sangat terbatas untuk itu.
JavaScript, misalnya, tidak menyediakan mekanisme apa pun untuk menegakkan jenis variabel saat nyaman untuk melakukannya. PHP membiarkan Anda menentukan beberapa jenis metode argumen, tetapi tidak ada cara untuk menggunakan jenis asli ( int
, string
, dll) untuk argumen, dan tidak ada cara untuk menegakkan jenis untuk apa pun selain argumen.
Pada saat yang sama, akan lebih mudah untuk memiliki pilihan untuk menentukan dalam beberapa kasus jenis variabel dalam bahasa yang diketik secara dinamis, daripada melakukan pemeriksaan jenis secara manual.
Mengapa ada batasan seperti itu? Apakah karena alasan teknis / kinerja (saya kira itu dalam kasus JavaScript), atau hanya karena alasan politik (yang, saya percaya, kasus PHP)? Apakah ini kasus untuk bahasa yang diketik secara dinamis lainnya yang saya tidak kenal?
Sunting: mengikuti jawaban dan komentar, berikut ini adalah contoh untuk klarifikasi: katakanlah kita memiliki metode berikut dalam PHP biasa:
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.
}
Dengan beberapa upaya, ini dapat ditulis ulang sebagai (juga lihat Pemrograman dengan kontrak dalam 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.
}
Tetapi metode yang sama akan ditulis sebagai berikut jika PHP secara opsional akan menerima tipe asli untuk argumen:
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.
}
Yang mana yang lebih pendek untuk ditulis? Yang mana yang lebih mudah dibaca?