Яндекс.Метрика

    Веб разработка

    Правда ли, что плохие PHP-программисты встречаются чаще других

    Пришел работать в одну фирму на должность веб-программиста. Одной из обязанностей является поддержка электронного документооборота, написанного на PHP. Так ничего сложного, но некоторые фрагменты веселят, некоторые заставляют унывать.
    Представляю вашему вниманию функцию построения инструментов работы с документами (просмотр, редактировать, удалить).
    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 раз.