Искусство работы с foreach, или Парадигма for-case

Apr 17, 2011 02:17


Хотя этот пост я обещал очень давно, руки дошли только сейчас. До того писал велосипед в виде парсера кода, так как бывший примитивный ломался на этом участке.

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

foreach($__sysReslt as $__keys => $__rows) {
switch($__keys) {
case 'id': {
$__tmpArr['id'] = $__rows;
}; break;
case 'surname': {
$__tmpArr['surname'] = $__rows;
}; break;
case 'name': {
$__tmpArr['name'] = $__rows;
}; break;
case 'patron': {
$__tmpArr['patron'] = $__rows;
}; break;
case 'is_curator_labl': {
$__tmpArr['is_curator_labl'] = $__rows;
}; break;
}
}

foreach ($__tmpArr as $__key => $__val) {
foreach($__val as $__values) {
switch($__key) {
case 'id': {
$__uIDArr[] = $__values;
}; break;
case 'surname': {
$__surnameArr[] = $__values;
}; break;
case 'name': {
$__nameArr[] = $__values;
}; break;
case 'patron': {
$__patronArr[] = $__values;
}; break;
case 'is_curator_labl': {
$__isCurBit[] = $__values;
}; break;
}
}
}

if(count($__uIDArr) != 0 && is_array($__uIDArr)) {
foreach($__uIDArr as $__key => $__val) {
if(strlen(trim(
$__surnameArr[$__key] . ' ' . $__nameArr[$__key] .
' ' . $__patronArr[$__key]
)) != 0) {
$__genResult .=
'' .
'. trim($__val) . '">' .
$__surnameArr[$__key] . ' ' . $__nameArr[$__key] .
' ' . $__patronArr[$__key] . '' .
'' .
'
:pointer;" width=12px height=12px src="imgs/deleteIcon.png" alt="Удаление эксперта" />' .
(
$__isCurBit[$__key] == '__expert__' ?

.png" alt="Эксперт" />' :

.png" alt="Куратор" />'
) .

:pointer;" width=12px height=12px src="imgs/E_symbol.png" alt="Отправить письмо" />' .
'' .
'';
}

}
} else {
$__genResult .=
'' .
'' .
':red;font-size:17px;text-align:center">НЕ ИМЕЕТ НИ ОДНОГО
ПРИВЯЗАННОГО ЭКСПЕРТА
-top:5px;background:green;color:#fff;font-size:12px;text-align:center;width:100%;height:0;border:green 1px solid;padding:3px">НАЖМИТЕ КНОПКУ ВЫШЕ "ДОБАВИТЬ ЭКСПЕРТА"' .
'' .
'';
}

echo $__genResult;
Итак, «что мы имеем с гусь»? А «с гусь» мы имеем:

  1. Парадигму for-case, описанную в литературе ранее;
  2. неоправданное использование тернарных операторов;
  3. смесь французского PHP с нижегородским HTML, причём противоестественным каким-то образом;
  4. потенциально некорректное (в случае, если фамилия, имя или отчество - пустые строки) формирование полного имени пользователя.


На самом деле, копирование массивов, которое осуществляется на протяжении трёх циклов foreach является прямым следствием того, что ранее человек не захотел разобраться в том, как правильно грузить данные из БД, и решил воспользоваться обманчиво коротким синтаксисом, предназначенным совсем для других нужд. Что привело к неоправданному переусложнению кода.

Вообще, как показывает мой опыт, желание добиться от кода чего-то странного является недвусмысленным намёком на то, что вы что-то не так спланировали, или не понимаете чего-то в работе прочих частей системы.

Как можно догадаться, данный кусок кода в моём исполнении выглядит примерно так:

$imgNames = array('0' => 'point_Vlt.png',
'1' => 'point_Kpo.png');
$imgAlts = array('0' => 'Эксперт',
'1' => 'Куратор');
if (count($result) > 0) {
foreach ($result as $rowNum => $row) {
$name = $row['fio'];
if (strlen(trim($name)) != 0) {
$rowId = trim($row['id']);
$imgName = $imgNames[$row['is_curator']]
$imgAlt = $imgAlts[$row['is_curator']];
$result .= <<< EOHTML_R

$name


: pointer;" width=12px height=12px src="images/deleteIcon.png" alt="Удаление эксперта" />
 


: pointer;" width=12px height=12px src="images/E_symbol.png" alt="Отправить письмо" />

EOHTML_R;
}
}
} else {
$result .= <<< EOHTML

: red; font-size: 17px; text-align: center">В списке нет ни одного эксперта

-top: 2px; background: green; color: #fff; font-size: 12px; text-align: center; width: 100%; height: 0; border: green 1px solid; padding: 2px">Нажмите «Добавить эксперта»

EOHTML;
}
echo $result;
За счёт правильно сформированного массива $result получилось около одиннадцати строк кода и четырнадцати строк HTML, и то можно пооптимизировать. Правильное формирование массива, кстати, не привнесло никаких дополнительных затрат - это обычный PDOStatement::fetchAll().

Так-то!

wtf, я, работа, истории из жизни, программизмы, php

Previous post Next post
Up