« PreviousNext »

Бережём память в PHP

17 December 2007

Я люблю писать красивый код, но люблю и лаконичный, чтобы не было ничего левого и ненужного. Конечно, не до такой степени, чтобы страдала читабельность. И вот сегодня, пописывая, заметил нунужные строки в коде. Было где-то так:

$letter = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
if(isset($ex[$letter])){
    $tmp['class'] = ‘exist’;
} else {
    $tmp['class'] = ;
}
$tmp['letter'] = $letter;

Как видно с кода сначала в переменную $letter чево-то там заганяется, а потом проверяется нуществование значения $ex[$letter]. Если нет, то в $tmp['class'] записывается пустое значение, иначе - ‘exist’. Ну и в конце записывается данные $letter в $tmp['letter']. В этом коде меня напрягла переменная $letter и я решил от неё избавится. Это сделать просто:

$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
if(isset($ex[$tmp['letter']])){
    $tmp['class'] = ‘exist’;
} else {
    $tmp['class'] = ;
}

Теперь у нас ничего в память левого не заганяется. Но если идти дальше, то это же можно записать в 2 строки:

Вариант 1.

$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
(isset($ex[$tmp['letter']]))?$tmp['class'] = ‘exist’: $tmp['class'] = ;

Но можно ещё короче!

Вариант 2.

(isset($ex[$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i))]))?$tmp['class'] = ‘exist’: $tmp['class'] = ;

Но эта конструкция уже сильно запутаная и использывать её не стоит - уж больно читаемый PHP стал похож на Perl.

Вот как 6 строчек кода можно превратить в 2 без ущерба читаемости и с экономией одной сототой килобайта памяти ;)

Update

Тут в комментариях друг Star высказался о ещё одном уменшении размера строки, но это уже больше относится к “уменшим размер - не прочитаем код”. Он предлагает уменшить строки


(isset($ex[$tmp['letter']]))? $tmp['class'] = ‘exist’: $tmp['class'] = ;

и как результат мы получим вариант 1 и 2 в таком виде:

Вариант 1.2.

$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i));
$tmp['class'] = isset($ex[$tmp['letter']])? ‘exist’: ;

Вариант 2.2.

$tmp['class'] = isset($ex[$tmp['letter'] = $GLOBALS['tf_validate']->ords_to_unistr(array($i))])? ‘exist’: ;

Posted in php, программирование | Trackback | del.icio.us | Top Of Page

    12 Responses to “Бережём память в PHP”

  1. говновкуснешек Says:

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

  2. wert2all Says:

    Какой к чёрту маркетинг? Ты читать умеешь - последную строчку НЕ ИСПОЛЬЗЫВАТЬ! А если Вы, сударь, сейл, то это не означает, что код в 2 простые строчки сложный.. И если ты, по своей тугодумности, не осилил короткую запись оператора условия, то пора с сейлом завязывать )))

    Нет, не пора - каждому своё.

  3. foxa.killa Says:

    я ні хрена в цьму не поняв

  4. wert2all Says:

    отож, а ше хош программувати… Їди на курси до говновкусняшки - він тебе продавати Тайд навчить )

  5. говновкуснешек Says:

    о
    да-да, вот уже народ подтягивается, который тоже не догнал. Нет просто в этих строках любви к Людям, не для Людей они, не правильно это.

  6. wert2all Says:

    ибо чаловек этот ниграма не шарит в программировании. Ты для него - ГУРУ в программировании ). Кирпичик колько мну задалбывает, чтобы я иво научил программить.. Он всех задалбывает ;)

  7. говновкуснешек Says:

    от йопт, никакой адекватной оппозиции создать не получается ;)

  8. прохожий Says:

    to №7
    сударь, судя по нику у вас развилась самокритика! поздравляю!

  9. говновкуснешек Says:

    2 8:
    говнокоммент, важна не форма - а суть.

  10. wert2all Says:

    всё теперь стало на свои места - суть у тебя в говновкуснешеке. ;)

  11. Star Says:

    чувак вот такие конструкции
    (isset($ex[$tmp[‘letter’]]))?$tmp[‘class’] = ‘exist’: $tmp[‘class’] = ”;

    удобнее писать в таком виде:
    $tmp[‘class’] = isset($ex[$tmp[‘letter’]])) ? ‘exist’ : ”

  12. wert2all Says:

    Да, спсб что напомлин. Юзается иногда с маленькими конструкциями. Ибо у тебя, наверно, тоже был Сидоров и он точно говорил, что в блок схеме алгоритма должно быть нарисовано так:

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

    Хотя, если в выражении мало букв, то можно. Вот и только-что нашёл в коде:

    $this->result['status'] = ($return_value)?’ok’:'bad’;

    Тут прочитать не сложно.

    В любом случае - спасибо, сейчас поправлю заметочку с твоим комментарием.

Leave a Reply