Веб разработка →
Правда ли, что плохие PHP-программисты встречаются чаще других
Пришел работать в одну фирму на должность веб-программиста. Одной из обязанностей является поддержка электронного документооборота, написанного на PHP. Так ничего сложного, но некоторые фрагменты веселят, некоторые заставляют унывать.
Представляю вашему вниманию функцию построения инструментов работы с документами (просмотр, редактировать, удалить).
Разработку и поддержку данного продукта осуществляло 4 программиста. И все они виновны! Разработчик архитектуры виновен в том, что в изначально сложном проекте не предусмотрел возможные будущие модификации и очень глубоко вживил в проект приведенную функцию. Последующие разработчики виновны в том, что не исправили данную ситуацию, а даже более усложнили. Я виновен в том, что пишу эту статью, вместо того, чтобы сесть и исправить этот отрыг.
Изучая материал по программированию на PHP, я принял для себя некоторые требования, которые здесь были нарушены:
Данная функция полностью работоспособна, вызывается более чем 12 раз.
Представляю вашему вниманию функцию построения инструментов работы с документами (просмотр, редактировать, удалить).
function buildTools($addStr='',$key='actions_foreach',$imploder=' '){
#echo $addStr.'<br />';
$ret='';
$script='';
if (isset($GLOBALS['modules'][$_GET['act']][$key])) {
$t = explode(',', $GLOBALS['modules'][$_GET['act']][$key]);
} else {
return true;
}
$c=0;
if(isset($_GET['type']) && $_GET['type']!=='dogovor'){
$script.='<script>
var inputs=new Array();
function relink(oId,addLink,vector,reverse){
inputs[addLink]=vector;
//window.alert(vector);
o=document.getElementById(oId);
s=\'\';
for(key in inputs){
if(inputs[key]==true) s+=key;
}
o.href=reverse+s;
}
</script>';
}
#Dump($t);
foreach ($t as $ii => $vv) {
if ($GLOBALS['mode'] !== 'list' && $GLOBALS['mode'] !== 'find') {
$icoFolder = 'icon32';
$icoMargin = '15px';
$s = '<br />' . $GLOBALS['actions'][$vv]['name'];
$st = 'display:block;float:left;text-align:center;width:150px;';
} else {
$icoFolder = 'icon';
$icoMargin = '0';
$s = '';
if ($key !== 'actions_for_each_doc1' && $key !== 'actions_for_each_doc2')
$st = 'display:block;float:left;text-align:center;width:auto;';else
$st='';
}
if (isset($GLOBALS['actions'][$vv]['name']) && (USER_IS_ADMIN || strstr($_SESSION['user_data']['accesslevel']['rights_str'], $_GET['act'] . '_' . $vv) || $vv == 'print')) {
if ($key == 'actions_for_each_doc1' || $key == 'actions_for_each_doc')
$ret[$c] = '<a href="?act=' . $_GET['act'] . '&action=' . $vv . $addStr . '" onclick="return confirm(\'Уверены?\')" id="' . $vv . '" title="' . $GLOBALS['actions'][$vv]['name'] . '">' . $GLOBALS['actions'][$vv]['name'] . '</a> ';
else
$ret[$c] = '<div style="' . $st . '"> <a href="?act=' . $_GET['act'] . '&action=' . $vv . $addStr . '" id="' . $vv . '" style="' . $st . '" title="' . $GLOBALS['actions'][$vv]['name'] . '"' . (isset($GLOBALS['actions'][$vv]['new_win']) && $GLOBALS['actions'][$vv]['new_win'] ? ' target="_blank"' : false) . '>' . (is_file('i/' . $icoFolder . '/' . $vv . '.png') ? '<img src="i/' . $icoFolder . '/' . $vv . '.png" style="border:none;margin:' . $icoMargin . ';" alt="' . $GLOBALS['actions'][$vv]['name'] . '" title="' . $GLOBALS['actions'][$vv]['name'] . '" />' . $s : ' ' . $GLOBALS['actions'][$vv]['name'] ) . '</a>';
if (isset($_GET['type']) && $_GET['type'] !== 'dogovor' && $_GET['type'] !== 'iso' && $_GET['type'] !== 'zayavka_inf' && $GLOBALS['mode'] !== 'list' && $GLOBALS['mode'] !== 'find' && $vv == 'print') {
$reverse = '?act=' . $_GET['act'] . '&action=' . $vv . $addStr;
$ret[$c].='<div align=left><br /><input type="checkbox" class="checkbox" id="andJ" onclick="relink(\'' . $vv . '\',\'&andJ\',this.checked,\'' . $reverse . '\')" /><img src=i/icon/print.png><strong>+</strong><label for="andJ">Журнал</label><br /><input type="checkbox" class="checkbox" id="andC" onclick="relink(\'' . $vv . '\',\'&andC\',this.checked,\'' . $reverse . '\')" /><img src=i/icon/print.png><strong>+</strong><label for="andC">Лист замечаний</label>
<input type="checkbox" class="checkbox" id="andR" onclick="relink(\'' . $vv . '\',\'&andR\',this.checked,\'' . $reverse . '\')" /><img src=i/icon/print.png><strong>+</strong><label for="andR">Расходный ордер</label>
</div>';
} // с комментариями
if (@$_GET['type'] == 'zayavka' && @$vv == 'print')
@$ret[$c].=' <a href="?act=' . $_GET['act'] . '&action=print&andC' . $addStr . '&' . implodeFilters('gets') . '" style="' . $st . '" title="' . $GLOBALS['actions'][$vv]['name'] . '"' . (isset($GLOBALS['actions'][$vv]['new_win']) && $GLOBALS['actions'][$vv]['new_win'] ? ' target="_blanc"' : false) . '>' . (is_file('i/' . $icoFolder . '/' . $vv . '.png') ? '<img src="i/' . $icoFolder . '/' . $vv . '.png" style="border:none;margin:' . $icoMargin . ';" alt="' . $GLOBALS['actions'][$vv]['name'] . '" title="' . $GLOBALS['actions'][$vv]['name'] . '" />' . $s . '' : $GLOBALS['actions'][$vv]['name'] ) . '</a>';
if ($key !== 'actions_for_each_doc1' && $key !== 'actions_for_each_doc')
$ret[$c].='</div>';
}
$c++;
}
#Dump($ret);
if(is_array($ret)) $ret=implode($imploder,$ret);
if($GLOBALS['mode']!=='list' && $GLOBALS['mode']!=='find')$ret=$ret.'<div style="clear:both;"> </div>';
return $script.$ret;
}
Разработку и поддержку данного продукта осуществляло 4 программиста. И все они виновны! Разработчик архитектуры виновен в том, что в изначально сложном проекте не предусмотрел возможные будущие модификации и очень глубоко вживил в проект приведенную функцию. Последующие разработчики виновны в том, что не исправили данную ситуацию, а даже более усложнили. Я виновен в том, что пишу эту статью, вместо того, чтобы сесть и исправить этот отрыг.
Что же здесь такого?
Изучая материал по программированию на PHP, я принял для себя некоторые требования, которые здесь были нарушены:
- Читабельность кода
- Отделение от представления
- Вынесение js-кода в специальные файлы
- Вынесение стилей в css-файлы
- Избегать подавление ошибок через @
- Адекватное комментирование кода
- Избегание использования суперглобальных переменных внутри функций, которые вызываются из различных частей проекта
- Понятное именование переменных
Данная функция полностью работоспособна, вызывается более чем 12 раз.
14.04.2011 19:59+0400