Я зашла слишком далеко в исключение повторяющегося кода в этом примере?


В контроллере (PHP и CodeIgniter с) я добавляю скрипты и CSS для переменных, которые будут использоваться в целях производства. Моя первоначальная маркировка выглядела так:

private function _add_script($path, $where = self::ADD_LAST) {
    $html = "<script src='$path'></script>\n";
    switch($where) {
        case self::ADD_LAST:
            array_push($this->_data['script'], $html);
            break;
        case self::ADD_FIRST:
            array_unshift($this->_data['script'], $html);
            break;
    }
}

private function _add_css($path, self::ADD_LAST) {
    $html = "    <link rel='stylesheet' href='$path'>\n";
    switch($where) {
        case self::ADD_LAST:
            array_push($this->_data['css'], $html);
            break;
        case self::ADD_FIRST:
            array_unshift($this->_data['css'], $html);
            break;
    }
}

Ну, я заметил, что эти двое просто повторяли сами себя, так что я немедленно переписал их в таком формате:

private function _add_script($path, $where = self::ADD_LAST) {
    $html = "<script src='$path'></script>\n";
    $this->_add_external('script', $html, $where);
}


private function _add_css($path, $where = self::ADD_LAST) {
    $html = "<link rel='stylesheet' href='$path'>\n";
    $this->_add_external('css', $html, $where);
}



private function _add_external($type, $html, $where) {
    switch($where) {
        case self::ADD_LAST:
            array_push($this->_data[$type], $html);
            break;
        case self::ADD_FIRST:
            array_unshift($this->_data[$type], $html);
            break;
    }
}

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



311
1
php
задан 26 апреля 2011 в 02:04 Источник Поделиться
Комментарии
1 ответ

Я думаю, что ты поступил правильно. Я тоже думаю, можно объединить первые 2 функции.

Что-то вроде этого:

private function _add_item($path, $type, $where = self::ADD_LAST) {
$script = "<script src='$path'></script>\n";
$css = "<link rel='stylesheet' href='$path'>\n";

if ($type == 'script') {
$html = $script;
}
elseif ($type == 'css') {
$html = $css;
}

$this->_add_external($type, $html, $where);
}

Или вот это:

private function _add_item($path, $type, $where = self::ADD_LAST) {
$script = "<script src='$path'></script>\n";
$css = "<link rel='stylesheet' href='$path'>\n";

switch($type) {
case 'script':
$html = $script;
break;
case 'type':
$html = $css;
break;
}

$this->_add_external($type, $html, $where);
}

Или этот (мой любимый):

private function _add_item($path, $type, $where = self::ADD_LAST) {
$array['script'] = "<script src='$path'></script>\n";
$array['css'] = "<link rel='stylesheet' href='$path'>\n";

$html = $array[$type];

$this->_add_external($type, $html, $where);
}

Редактировать:

И я думаю, что это будет работать тоже, все в одном решении:

private function _add_item_external($path, $type, $where = self::ADD_LAST) {
$array['script'] = "<script src='$path'></script>\n";
$array['css'] = "<link rel='stylesheet' href='$path'>\n";

switch($where) {
case self::ADD_LAST:
array_push($this->_data[$type], $array[$type]);
break;
case self::ADD_FIRST:
array_unshift($this->_data[$type], $array[$type]);
break;
}
}

4
ответ дан 26 апреля 2011 в 03:04 Источник Поделиться