Ruby @ восходящее солнце

fixxxer

К.О.
Партнер клуба
кстати, чуть чуть оффтоп: у меня есть простой для себя признак что я освоился с проектом - это когда я перестаю запускать mc :)
 

Krishna

Продался Java
Лучше мне пусть кто-нибудь объяснит, а нафига вообще нужны замыкания.
Мне в PHP всегда нравился подход к области видимости, отличный от традиционного - мы по умолчанию ограничены видимостью локальной, а для доступа к глобальным переменным декларируем такую нужду отдельно. Это усиливает контроль.

closures тут играют в обратную сторону + развивают процедурный подход, в противовес последним тенденциям движения в сторону ООП.

Мне кажется, в пхп стоило бы внедрить анонимные классы по аналогии с явой.

Не nested classes, а именно анонимные.

-~{}~ 18.03.10 01:50:

P.S. Делать сайты на яве - имхо извращение. Впрочем, они уже вымерли в большинстве.
На форуме javatalks.ru всё админы грозятся перейти с phpBB на явовский движок, по идеологическим соображениям, но воз и ныне там )))
Очень показательно :)
 

whirlwind

TDD infected, paranoid
нафига вообще нужны замыкания.
Для создания хаоса :) Это все тянется из тех времен когда ооп не было. Вместо этого были грязные хаки, заменяющие полиморфизм и инкапсуляцию (ссылки-указатели на функции а-ля колбеки + глобалы с которыми проблемы). Потом у какого-то гавнакодера родилась гениальная идея - обозвать это все замыканиями и лямбда функциями. А чо, звучит круто. Буд-то и не про гавнакод, гы гы.
 

fixxxer

К.О.
Партнер клуба
Зачем нужны?
Ну вот, например (php считать псевдокодом):
PHP:
class DatabaseConnection {

    public function transactionWith(Closure $func) {
        $this->begin();
        try {
            $func();
            $this->commit();
        } catch (Exception $E) {
            $this->rollback();
            throw $E;
        }
    }

}

//....

class FooModel {

    public function registerUser() {

        $this->Db->transactionWith(function() {
            $this->Db->query(....);
            $this->Db->query(....);
            $this->Db->query(....);
        });

    }
}
 

whirlwind

TDD infected, paranoid
Это не замыкание.

-~{}~ 18.03.10 03:59:

В однопоточных приложениях замыкания нужны как корове седло.
 

Sherman

Mephi
Хехе, а мне более нравится делать так:

Код:
UserServiceImpl
{
   @Transactional
   public void registerUser(User user)
   {
      ...
   }
}
Насчет замыканий в java вот статья: http://bitsofmind.wordpress.com/2008/01/15/future_closures_for_java/

Но это все же не ключевая фича, скорее из разряда syntax sugar, имхо.

p.s. Для ФЯПфагов можно посмотреть scala & groovy.
 

fisher

накатила суть
Автор оригинала: whirlwind
Это не замыкание.
и здрасьте! а что же это?
тут только одно отличие от классического замыкания - что объявление "связи" и собственно вызов синхронны
 

fixxxer

К.О.
Партнер клуба
Sherman, ага, АОП дает вариант ничуть не хуже.

А пример этот я взял не с потолка, а как раз из Groovy ;)

Могу придумать и иные варианты, хоть бы и функции-итераторы с yield, но вот этот по крайней мере не из пальца высосанный, а дает реальное удобство при разработке =)
 

Lightning

Трудоголик
Хочу нормальные неймспейсы в PHP.
А еще лучше пакеты как в Java.
Но, судя по всему, в PHP 6 их еще не будет.

Меня бесят имена типа PHPUnit_Framework_TestCase
 

whirlwind

TDD infected, paranoid
fisher Это - вызов анонимной (типо лямбда) функции. Из примера не следует, что родительская область видимости будет существовать до тех пор, пока существует анонимная функция, так как эта конкретная функция из примера, будет уничтожена при выходе из registerUser, потому что на нее больше никто не ссылается. Вот замыкание

PHP:
function one() {
     wait = 'request done';
     this.ajax.asyncRequest('param', function() {
          alert(wait);
     });
}
-~{}~ 18.03.10 19:13:

PS. суть-то замыкания в чем - вложенная области видимости замыкается на родительской, то есть ставит на ней замок, что не дает родителю освободиться.
 

fixxxer

К.О.
Партнер клуба
Из примера это не следует только потому, что в этом примере таковой необходимости нет. :)

Мне написать пример с return function(), или не стоит? :)
 

whirlwind

TDD infected, paranoid
fixxxer а такого примера нет для пыха. Время жизни области действия функции создавшей лябда-функцию и самой лямбда функции может различаться ТОЛЬКО если лямбда-функция передается в другой поток управления. Это-то надеюсь понятно? :) А пока их время жизни совпадает, наличие замыканий бессмыслено.

-~{}~ 18.03.10 19:26:

PS. Вы путаете анонимные функции и замыкания. Наличие анонимной функции не гарантирует возможность замыкания.
 
Сверху