Страница 1 из 1

Пластилиновая типизация

СообщениеДобавлено: 22.04.2011 14:37:31
devels
Язык Орион (аналог PHP).

Почистил тему, придумал этой концепции название, и опишу ее по-подробнее.

Пластилиновая типизация - это проверка типов во время выполнения, на каждое передаваемое значение в функцию, в метод, в свойство можно наложить модификатор (фильтр). Задача модификатора - модифицировать значение в то что нам нужно, если у него это не получается - выдать ошибку. Модификатор похож на скульптора, который лепит из глины то что ему нужно. Глина - это поступающая информация, скульптор - это наш фильтр-модификатор, скульптор знает во что надо превратить глину (т.е. к какому типу привести значение). В случае если глины не хватает, или она не подходит для скульптуры, скульптор недоволен (т.е. происходит фатальная ошибка).

"Скульптор" - Модификатор - это обычно метод класса, который вызывается, тогда, когда значение нужно модифицировать в объект данного класса. В метод первым параметром передается значение. Скульптор одновременно может и фильтровать (т.е. контролировать поступающие значения) и модифицировать поступающие значения.

"Скульптура" - то что нужно лепить из значения, обычно это название класса или типа, у которых есть методы для произведения модификации. Если их нет или они вызываются неудачно, происходит ошибка приведения типов.


Применение
1. С помощью пластилиновой типизации можно реализовать что-то похожее на перегрузку методов и функций в языках без строгой типизации
2. С помощью данной концепции можно легко контролировать поступающие данные из одного места в исходниках. Тем самым повышается безопасность, т.к. мы можем с одного места в исходных кодах контролировать поступающую информацию в сотнях функций и методах нашего проекта.
3. Концепция очень хорошо вписывается в юнит тестирование. С помощью нее юнит-тесты создавать намного проще, короче и понятнее. Повышается уровень отладки проекта. В динамических языках юнит-тестирование призвано вычислить все ошибки связанные с приведением типов, оно очень важно.
4. С помощью данной концепции можно легко организовывать логирование.

Примеры в языке
В методе и в функции мы можем указать к какой "скульптуре" (т.е. типу или классу) приводить переданное значение, если оно не того типа, что нам нужно.

Код: Выделить всё
function getOffset(->int $x, ->int $y){
    // $x всегда будет типа int внутри функции
    // $y также
   // в некоторых случаях некоторые значения нельзя привести к типу INT, тогда будет фатальная ошибка
}
->int $x = означает что необходимо привести $x аргумент функции к типу INT (целое число), если мы передали в функцию значение не типа int, если передали значение типа int - ничего не делать, все ок.


Приведение к классам, основная концепция
Вы можете назначить модификаторами кроме скалярных типов ->int, ->float, ->string и т.п. целые классы. Сейчас рассмотрим пример:

Код: Выделить всё
class TPoint {
    var $x;
    var $y;
}

function getOffset(->TPoint $p){
      //
}

getOffset( array(20, 30) ); // передаем массив вместо объекта TPoint
В данном примере массив не сможет быть модифицирован в объект класса TPoint при вызове функции getOffset, будет фатальная ошибка. Но это лишь потому что у него отсутствует метод для приведения типов. Сейчас изменим пример и все будет работать:

Код: Выделить всё
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.

Re: Пластилиновая типизация

СообщениеДобавлено: 27.08.2011 17:25:12
famous
А кто решает, как экземпляр одного типа преобразуется в экземпляр другого? В Python, например, есть методы класса, имена которых являются именами типов с двумя знаками подчёркивания в начале и в конце (например, __int__), эти методы и вызываются при приведении. А как в Orion?

Re: Пластилиновая типизация

СообщениеДобавлено: 28.08.2011 01:02:34
devels
Такие методы планируются т.е. для скалярных типов, я просто не успел их добавить. Для объектов же действуют выше описанные правила.

Re: Пластилиновая типизация

СообщениеДобавлено: 29.08.2011 10:06:54
vada
Какой геморой с этой динамической типизацией! Непаханное поле ошибок! А костылей то костылей!!!! Жуть! :(

Re: Пластилиновая типизация

СообщениеДобавлено: 29.08.2011 10:39:29
AlexVinS
Щас новая тенденция писать код со статической типизацией и конвертировать в динамический язык (напрмер Java->ECMAscript)

Re: Пластилиновая типизация

СообщениеДобавлено: 29.08.2011 11:55:53
vada
Это из-за лени один раз описать тип объекта? Дауж... :wink:
Вот сколько надо написать кода для приведения типов для простого объекта! Это просто пипец!
Например, у нас есть простой объект - ящик огурцов (1 ящик). В нем 8.1 кг огучцов (8.1 кг). В нем 32 огурца. Вот и начинаются пляски с пластилиновой типизацией. Что в целое преобразовывать 1 ящик или 32 огурца? А может 8.1 кг до целого округлить, или в граммы перевести? Даже если мы хотим получить на выходе штуки, уже неоднозначность.
И что, программа должна сама принять решение что куда? Жуть какая!!!!!!!!!!

Re: Пластилиновая типизация

СообщениеДобавлено: 29.08.2011 23:45:51
devels
vada писал(а):Это из-за лени один раз описать тип объекта? Дауж... :wink:
Вот сколько надо написать кода для приведения типов для простого объекта! Это просто пипец!
Например, у нас есть простой объект - ящик огурцов (1 ящик). В нем 8.1 кг огучцов (8.1 кг). В нем 32 огурца. Вот и начинаются пляски с пластилиновой типизацией. Что в целое преобразовывать 1 ящик или 32 огурца? А может 8.1 кг до целого округлить, или в граммы перевести? Даже если мы хотим получить на выходе штуки, уже неоднозначность.
И что, программа должна сама принять решение что куда? Жуть какая!!!!!!!!!!


Никакой тенденции писать статически типизированный код нет, есть только необходимость в оптимизации, чего можно достигнуть с помощью статической типизации, например в JavaScript для программирования игр.

А ваш пример на счет ящиков и огурцов в корне неверен, пластилиновая типизация относится к классам, а не к примитивным типам, поэтому такой проблемы нет. Есть декларация того, что функция или метод должен принимать объекты одного класса, если передается не того класса объект или что-то иное, то программист может регламентировать алгоритм приведения этих данных к нужному типу, чтобы внутри функции иметь всегда одного типа данные. Поэтому если функция принимает "ящики", значит она работает на уровне абстракции "ящики".

Re: Пластилиновая типизация

СообщениеДобавлено: 30.08.2011 12:25:19
vada
Ну почему же в корне не верен? Ящик огурцов не может быть классом? С атрибутами: количество ящиков; количество кг; штук огурцов; стоимость кг; дата поствки; поствщик;... И чем больше у вас атрибутов класса тем больше вам придется писать правил преобразования из невестьчего в целое, действительное, дату, строку... Не проще ли класс снабдить простыми методами которые бы массу выдавали в виде действительного числа, штук огурцов в виде целого, истек ли срок годности в виде булева... К чему автоматическая пластилиновая типизация? Я не понимаю. Проблем при программировании мало? Еще требуются?

Re: Пластилиновая типизация

СообщениеДобавлено: 30.08.2011 23:20:35
devels
vada писал(а):Ну почему же в корне не верен? Ящик огурцов не может быть классом? С атрибутами: количество ящиков; количество кг; штук огурцов; стоимость кг; дата поствки; поствщик;... И чем больше у вас атрибутов класса тем больше вам придется писать правил преобразования из невестьчего в целое, действительное, дату, строку... Не проще ли класс снабдить простыми методами которые бы массу выдавали в виде действительного числа, штук огурцов в виде целого, истек ли срок годности в виде булева... К чему автоматическая пластилиновая типизация? Я не понимаю. Проблем при программировании мало? Еще требуются?


http://ru.wikipedia.org/wiki/%D0%90%D0% ... 8%D1%8F%29

Чем то близко к этому...