Bildiğim dinamik olarak yazılan diller, geliştiricilerin değişken türlerini belirtmesine asla izin vermez veya en azından bunun için çok sınırlı bir desteğe sahip değildir.
Örneğin JavaScript, uygun olduğunda değişken türlerini zorunlu kılmak için herhangi bir mekanizma sağlamaz. PHP yöntemi, argümanların bazı türlerini belirtmenizi sağlar fakat yerli türleri (kullanmak yolu yoktur int
, string
bağımsız değişkenler için, vb) ve argümanlar dışında herhangi türlerini uygulamak için bir yolu yoktur.
Aynı zamanda, bazı durumlarda tür kontrolünü manuel olarak yapmak yerine, dinamik olarak yazılan bir dilde bir değişkenin türünü belirleme seçeneğine sahip olmak uygun olacaktır.
Neden böyle bir sınırlama var? Teknik / performans nedenlerinden ötürü (JavaScript durumunda olduğunu varsayalım) mı yoksa sadece siyasi nedenlerden dolayı mı (PHP'nin durumu olduğuna inanıyorum)? Bu, aşina olmadığım dinamik olarak yazılmış diğer diller için geçerli mi?
Düzenleme: cevapları ve yorumları takip ederek, bir açıklama örneği: diyelim ki düz PHP'de aşağıdaki yöntem var:
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.
}
Bazı çabalarla bu yeniden yazılabilir ( PHP'deki Sözleşmelerle programlama bölümüne bakınız ):
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.
}
Ancak, PHP isteğe bağlı olarak bağımsız değişkenler için yerel türleri kabul ederse aynı yöntem aşağıdaki gibi yazılır:
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.
}
Hangisi yazmak daha kısa? Hangisini okumak daha kolay?