Должен ли объект быть полностью завершенным до внедрения в качестве зависимости? - PullRequest
1 голос
/ 12 июня 2010

Это расширение этого вопроса: Понимание того, как внедрить объектные зависимости . Поскольку это немного отличается, я хотел разделить их, чтобы, надеюсь, было легче ответить. Кроме того, это не настоящая система, а упрощенный пример, который, как я думал, мы все будем знакомы. ТИА. :

DB

потоков: идентификатор_потока, имя_потока и т. Д.

сообщений: post_id, thread_id, post_name, post_contents, post_date, post_user_id и т. Д.

Обзор

По сути, я смотрю на наиболее приемлемый способ загрузки $ post_id, чтобы он был каскадным и загружал другие вещи, о которых я хочу знать, и я стараюсь поддерживать контроллер в скине. НО:

  • У меня слишком много зависимостей для внедрения
  • Я передаю инициализированные, но пустые объекты
  • Я хочу ограничить количество передаваемых параметров
  • Я мог бы вставить $ post (-> many) в $ thread (one <-), но на этой странице я не смотрю ветку, я смотрю сообщение </li>
  • Я мог бы объединить / внедрить их в новый объект

Деталь

Если я внедряю объект в другой, лучше ли сначала его полностью создать? Я пытаюсь ограничить количество параметров, которые нужно передать на страницу, но в итоге получаю круг.

// 1, empty object injected via constructor
$thread = new Thread;
$post = new Post($thread); // $thread is just an empty object
$post->load($post_id); // I could now do something like $post->get('thread_id') to get everything I want in $post

// 2, complete object injected via constructor
$thread = new Thread;
$thread->load($thread_id); // this page would have to have passed in a $thread_id, too
$post = new Post($thread); // thread is a complete object, with the data I need, like thread name
$post->load($post_id);

// 3, inject $post into $thread, but this makes less sense to me, since I'm looking at a post page, not a thread page
$post = new Post(); 
$post->load($post_id); 
$thread = new Thread($post);
$thread->load(); // would load based on the $post->get('post_id') and combine.  Now I have all the data I want, but it's non-intuitive to be heirarchially Thread->Post instead of Post-with-thread-info


// Or, I could inject $post into $thread, but if I'm on a post page,
// having an object with a top level of Thread instead of
// Post-which-contains-thread-info, makes less sense to me.

// to go with example 1
class post
{
    public function __construct(&$thread)
    {
        $this->thread=$thread;
    }

    public function load($id)
    {
        // ... here I would load all the post data based on $id

        // now include the thread data
        $this->thread->load($this->get('thread_id'));

        return $this; 
    }
}

// I don't want to do 

$thread = new Thread;
$post   = new Post;
$post->load($post_id);
$thread->load($post->get('post_id'));

Или я мог бы создать новый объект и вставить в него и $ post, и $ thread, но тогда у меня есть объект с растущим числом зависимостей.

1 Ответ

0 голосов
/ 31 июля 2013

Это не зависимости, а просто части одной и той же модели, поэтому нет необходимости вводить что-либо.Подумайте о своей модели и ее использовании.Каковы основные объекты (строительные блоки) - пост или поток?Или они одинаково важны / используются?Вы должны иметь дело (загружать / хранить) только с основными сущностями, предпочтительно используя внешний класс, обычно называемый Repository.Например, у вас может быть метод ThreadRepository :: findById ($ id), и этого достаточно, оставьте остальное внутренним ресурсам репозитория ... Загружайте и устанавливайте все, что вы хотите внутри репозитория, но никогда не открывайте его другим частям приложения.Вы также можете реализовать некоторую форму отложенной загрузки (внутренний загрузчик ресурсов, шаблон прокси-сервера и т. Д.), Если производительность является проблемой

Если у вас есть свободное время в вашей жизни, загрузите и прочитайте эту книгу (или купите оригинал): http://www.infoq.com/minibooks/domain-driven-design-quickly Ваши проблемы с кодированием уже решены и хорошо объяснены там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...