내가 아는 동적 유형 언어는 개발자가 변수 유형을 지정하지 못하게하거나 최소한 매우 제한적으로 지원합니다.
예를 들어, JavaScript는 편리한 경우 변수 유형을 적용하는 메커니즘을 제공하지 않습니다. PHP는 메소드 인자의 일부 유형을 지정할 수 있지만, 기본 유형 (사용할 수있는 방법이 없습니다 int
, string
인수 등) 및 인수 이외의 아무것도 유형을 적용 할 수있는 방법은 없습니다.
동시에, 유형 검사를 수동으로 수행하는 대신 동적 유형 언어로 변수 유형을 지정하는 것이 편리한 경우가 있습니다.
왜 그러한 제한이 있습니까? 기술적 / 성능상의 이유 (JavaScript의 경우) 또는 정치적 이유 (PHP의 경우)라고 생각합니까? 내가 익숙하지 않은 다른 동적 유형의 언어의 경우입니까?
편집 : 답변과 의견 다음에 설명을위한 예가 있습니다. 일반 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.
}
몇 가지 노력으로 다음과 같이 다시 작성할 수 있습니다 ( 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.
}
그러나 PHP가 선택적으로 인수에 대한 기본 유형을 허용하는 경우 동일한 방법이 다음과 같이 작성됩니다.
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.
}
어느 것이 더 짧은가? 어느 것이 더 읽기 쉬운가요?