Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пластилиновая типизация - Концепция языка, для динамических языков 
:(
    Опции темы
lukas
Дата 24.4.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: нет
Всего: 15



Данная концепция придумана мной (http://dim-s.net). Возможно что-то похожее где-то есть, но во всех популярных языках я ничего подобного еще не видел. Я пишу свой язык Орион, который очень напоминает синтаксически пхп, но далеко ушедший в возможностях от пхп.



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

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

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


Применение
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.


Это сообщение отредактировал(а) lukas - 24.4.2011, 09:47


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.0388 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.