LINUX.ORG.RU
ФорумTalks

[эпик фэйл][пхп][спать надо больше] Бывает же! :D


0

0

Короче, часто в объектах приходится использовать тяжёлые методы. Ежё понятно, что напрашивается решение, типа:

private $object = NULL;
function object()
{
    if(is_null($this->object))
        $this->object = object_load('object_class', $this->object_id());

    return $this->object;
}

Всё хорошо, но задалбывает же писать одно и то же. А в редакторе настоящего программиста должна отсутствовать функция копирования блоков кода (с) Чарльз Мур.

Ну и разродился таким, вот, решением с пару недель назад:

function object() { return $this->load_attr('object', object_load(...)); }

где load_attr() - функция, которая сохраняет полученное значение во хэш атрибутов объекта, если там оно ещё не сохранено. Иначе - возвращает старое значение.

...

Опаньки, а в PHP-то вычисления неленивые... Форт, блин, на годы расслабляет :D Вчера отловил случайно, аж в 25 мест использование такого способа расползлось :) Пришлось сделать некрасиво в стиле:

function object() { return $this->__havec('object') ? $this->__lastc() : $this->__setc(object_load(...)); }

Не хватает, однако, синтаксических макросов в языке или оперирования процессом трансляции... :)

(хотя, конечно, я пример несколько упростил, именно такие задачи у меня решаются проще):

function auto_object()
{
    return array(
        'object' => 'object_class(object_id)',
        ...
    );
}

...

Интересно, кто-то ещё на грабли допущения ленивости в языках, где её нет наступал, или это только меня так перекособочило? :D

★★★★★

> Интересно, кто-то ещё на грабли допущения ленивости в языках, где её нет наступал

наступал. в PHP4 :))) в пятерке (>5.1.0) вроде все работает нормально, слава йайцам. проект довольно крупный, клиентов много, так что вся феерия быстро вылезает наружу.

isden ★★★★★
()

Я наступил на то, что нет лямбд в PHP < 5.3; а также на то, что __toString() в PHP 5.1 ущербен — далеко не всегда срабатывает, когда тебе это надо.

Приду-ка я домой, рассупоню питонушку, код красивый понюхаю и аж заколдоблюсь...

shimon ★★★★★
()

Пришлось сделать некрасиво в стиле: function object() { return $this->__havec('object') ? $this->__lastc() : $this->__setc(object_load(...)); }

мне бы понятней было:

if (! $this->object) $this->object = object_load(...); return $this->object;

хотя мож у тебя и какая-то магия там в этих сетерах

Syncro ★★★★★
()

А что, в пыхпыхе разве нельзя делать так:

function object()
{
    return $this->object || ($this->object=object_load(...));
}
?

legolegs ★★★★★
()
Ответ на: комментарий от Syncro

>if (! $this->object)

Это требует заведения лишней переменной и исключает ряд её реальных значений (false, NULL, 0). Или даже при жёстком сравнении (=== или is_null()) - одно. А проверка в хеше делается через array_key_exists, и поэтому у переменной допустимы любые значения.

...

А так - надо побенчить на тему инициализации при передаче строки для eval. Тогда можно будет в какой-то мере первоначальный вариант оживить :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от legolegs

>А что, в пыхпыхе разве нельзя делать так:

Не-а, к сожалению, как в Перле, нельзя. || - сугубо логическая операция, вернёт true или false.

Ну и плюс к этому описанные в предыдущем сообщении ограничения и избыточность :)

KRoN73 ★★★★★
() автор топика

Аналогичное делается в Smalltalk без косяков

yoghurt ★★★★★
()
Ответ на: комментарий от legolegs

> А что, в пыхпыхе разве нельзя делать так:

Так нельзя, но можно

function object()
{
      $this->object or ($this->object = object_load(...));
      return $this->object;
}
shimon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.