Почистил тему, придумал этой концепции название, и опишу ее по-подробнее.
Пластилиновая типизация - это проверка типов во время выполнения, на каждое передаваемое значение в функцию, в метод, в свойство можно наложить модификатор (фильтр). Задача модификатора - модифицировать значение в то что нам нужно, если у него это не получается - выдать ошибку. Модификатор похож на скульптора, который лепит из глины то что ему нужно. Глина - это поступающая информация, скульптор - это наш фильтр-модификатор, скульптор знает во что надо превратить глину (т.е. к какому типу привести значение). В случае если глины не хватает, или она не подходит для скульптуры, скульптор недоволен (т.е. происходит фатальная ошибка).
"Скульптор" - Модификатор - это обычно метод класса, который вызывается, тогда, когда значение нужно модифицировать в объект данного класса. В метод первым параметром передается значение. Скульптор одновременно может и фильтровать (т.е. контролировать поступающие значения) и модифицировать поступающие значения.
"Скульптура" - то что нужно лепить из значения, обычно это название класса или типа, у которых есть методы для произведения модификации. Если их нет или они вызываются неудачно, происходит ошибка приведения типов.
Применение
1. С помощью пластилиновой типизации можно реализовать что-то похожее на перегрузку методов и функций в языках без строгой типизации
2. С помощью данной концепции можно легко контролировать поступающие данные из одного места в исходниках. Тем самым повышается безопасность, т.к. мы можем с одного места в исходных кодах контролировать поступающую информацию в сотнях функций и методах нашего проекта.
3. Концепция очень хорошо вписывается в юнит тестирование. С помощью нее юнит-тесты создавать намного проще, короче и понятнее. Повышается уровень отладки проекта. В динамических языках юнит-тестирование призвано вычислить все ошибки связанные с приведением типов, оно очень важно.
4. С помощью данной концепции можно легко организовывать логирование.
Примеры в языке
В методе и в функции мы можем указать к какой "скульптуре" (т.е. типу или классу) приводить переданное значение, если оно не того типа, что нам нужно.
- Код: Выделить всё
function getOffset(->int $x, ->int $y){
// $x всегда будет типа int внутри функции
// $y также
// в некоторых случаях некоторые значения нельзя привести к типу INT, тогда будет фатальная ошибка
}
Приведение к классам, основная концепция
Вы можете назначить модификаторами кроме скалярных типов ->int, ->float, ->string и т.п. целые классы. Сейчас рассмотрим пример:
- Код: Выделить всё
class TPoint {
var $x;
var $y;
}
function getOffset(->TPoint $p){
//
}
getOffset( array(20, 30) ); // передаем массив вместо объекта TPoint
- Код: Выделить всё
class TPoint {
var $x;
var $y;
function oper:typed( $value ){
if ( isset $value ){ // проверяем, если задан $value, значит нужно модифицировать
if ( count( $value ) == 2 ){
$this->x = $value[0];
$this->y = $value[1];
} else
return false;
}
// проверка на валидность объекта
if ( $this->x < 0 or $this->y < 0 )
return false;
}
}
function getOffset(->TPoint $p){
//
}
$d = getOffset( array(20, 50) ); // все ок, внутри вызываемой функции будет не массив, а будет объект TPoint(x=>20, y=>50)
$d = getOffset( array(-20, 50) ); // модификация в объект удачная, но т.к. ->x меньше 0, фильтрация не проходит и конвертация неудачная. выходит фатальная ошибка
$point = new TPoint;
$point->x = -30;
$d = getOffset( $point ) // модификация не будет происходить, но фильтрация будет происходить при каждом вызове функции, в данном случае т.к. ->x меньше нуля, будет фатальная ошибка, см. условие в методе oper:typed класса TPoint.