+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 92.51 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Объектно-ориентированное функциональное метапрограммирование или каррирование метода

07.08.2012 12:24
3axap4eHko

Искусство каррирования
Вдохновившись статьей Еще раз о каррировании и частичном применении в PHP, в голову пришла реализация частичного применения метода, именно метода, а не функции.

Вводная часть


Изначально определение каррирования дается как преобразование функции от пары аргументов в функцию, берущую свои аргументы по одному. Это преобразование было введено М. Шейнфинкелем и Г. Фреге и получило свое название в честь Х. Карри. Давайте теперь распространим это определение и на метод. Реализация этой идеи проста как 2 байта, но дает огромный потенциал. В этом и заключается доля метапрограммирования, когда методы можно создать в так сказать run-time, причем явно не описывая тело метода.

Исходный код


И так вот он класс с каррирующим методом, который и реализует (простите за каламбур) частичное использование метода класса. При этом, создается псевдометод, который и вызывается (опять скаламбурил) магическим методом __call():

abstract class ACurry
{
    /**
    * A curry method that returns a partial call of function
    * or a result of its execution, depending on the number
    * of parameters of the invoked method
    *
    * @param array $callback
    * @param array $args
    * @return callable
    */

    protected function curry($callback, $args = array())
    {
        return function() use($callback, $args)
        {
            $methodInfo = new ReflectionMethod(get_class($callback[0]), $callback[1]);
            if (count(array_merge($args, func_get_args())) >= $methodInfo->getNumberOfParameters()) {
                return call_user_func_array($callback, $args);
            } else {
                return $callback[0]->curry($callback, $args);
            }
        };
    }

    /**
    * Create a method $methodName by currying a method of $curryMethodName
    * with arguments $args
    *
    * @param string      $methodName
    * @param string      $curryMethodName
    * @param array       $args
    * @return ACurry
    */

    public function createMethod($methodName, $curryMethodName, $args = array())
    {
        $this->$methodName = $this->curry(array($this, $curryMethodName), $args);
        return $this;
    }

    /**
    * @param string $name
    * @param array  $args
    * @return mixed
    */

    public function __call($name, $args)
    {
        if (property_exists($this, $name) && is_callable($this->$name)) {
            return call_user_func_array($this->$name, $args);
        }
    }
}

Пример


Вот мой пример применения, он сделан по аналогии с примером товарища Bodigrim
<?php
require_once 'ACurry.php';

/**
 * A class to calculate a mass from the density and size
 */

class Masses extends ACurry{

    public function __construct(){
        /* create method to calculate mass of iron cube   */
        $this->createMethod('ironCube', 'cube', array(7.8));
    }

    /**
     * Method return a mass of subjection from density and size
     */

    public function get($density, $length, $width, $height){
        return $density * $length * $width * $height;
    }

    /**
     * Method return a mass of cube subjection from density and size
     */

    public function cube($density, $length){
        return $this->get($density, $length, $length, $length);
    }
}

$masses=new Masses();
echo $masses->ironCube(2);

В данном примере псевдометод ironCube() вычисляет массу железного куба в граммах со стороной 2 см (как известно, у железа плотность 7.8 г/см³).

Итог


Вот и получилось этакое объектно-ориентированное функциональное метапрограммирование. Конечно же, область применимости этого приема возрастет в разы, если преобразуем класс в trait, что позволит нам каррировать уже наследованные методы.

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

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



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года