Как лучше избежать дублирование кода ?

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Как лучше избежать дублирование кода ?

Сообщение Ekstazi »

Собственно задачу я уже решил, но на будущее интересно было бы знать мнение знающих людей.
Пример 1.
Допустим есть у меня два контроллера PostController и CommentController
и есть некий код, который обрабатывает действие предпросмотра комментария, что-то вроде:

Код: Выделить всё

    public function handlePreview($comment)
    {
        if(empty($_POST['preview']))
            return '';

        $preview='';
        
        $comment->scenario='preview';
        if($comment->validated('preview')){
            $preview=$this->renderPartial('/comment/preview',array(
                'model'=>$comment
            ),true);
        }
        
        if(Yii::app()->request->isAjaxRequest){
            echo $this->processOutput($preview);
            Yii::app()->end();
        }
        return $preview;
    }

 
который должен вызываться из post/view и из comment/update.

Пример 2.
Есть опять же эти два контроллера и действия post/view, post/delete и comment/create
Все три действия юзают один момент для проверки существования поста в таблице:

Код: Выделить всё

public function loadPost($id)
{
$model=Post::model()->findByPk($id);
if(!isset($model))
  throw new CHttpException(404);
}
return $model;
 
Как лучше избежать дублирование кода?
1) Использовать базовый контроллер, но если методов типа loadPost очень много (много вложенных уровней связей таблиц, например Site->Catalog->Region->Bouquet->BouquetComponent), то базовый контроллер просто раздувается.
2) Использовать поведение - то же что и пред. пункт + падение производительности.
3) Использовать статический метод у PostController - public static function loadPost($id) и уже к нему обращаться из других контроллеров, при необходимости.

Если кто может аргументировать какой из способов лучше или предложит свой, то буду очень рад выслушать.
P.S.: все примеры из реальных проектов, так что вопрос не только теоретический, но и практический.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как лучше избежать дублирование кода ?

Сообщение samdark »

Я за базовый контроллер и наследование. Если методов общих много, в случае со статикой раздуется один из контроллеров. В случае с базовым раздуется базовый. Можно, конечно, вынести и в сервис-слой часть методов, которые не занимаются задачами контроллера.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Как лучше избежать дублирование кода ?

Сообщение Ekstazi »

В продолжение темы http://habrahabr.ru/qa/9265/
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Как лучше избежать дублирование кода ?

Сообщение Svyatov »

Я недавно прочитал очень интересный подход к работе с моделями в Yii. Думаю для этих целей он тоже подойдет.

http://weavora.com/blog/2011/07/04/yii- ... ogic-idea/
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Как лучше избежать дублирование кода ?

Сообщение Ekstazi »

Не совсем то, хотя подход полезный. Не думаю что модель должна кидать CHttpException.
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Как лучше избежать дублирование кода ?

Сообщение Svyatov »

Ekstazi писал(а):Не совсем то, хотя подход полезный. Не думаю что модель должна кидать CHttpException.
Согласен. По-моему полностью избежать дублирования практически невозможно.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Как лучше избежать дублирование кода ?

Сообщение Ekstazi »

Мне нравятся все способы, но, всё зависит от ситуации. По всей видимости однозначного ответа нет и не будет.
Ответить