Шаблон проектирования для уменьшения дублирования кода в разных типах коллекций одного объекта - PullRequest
2 голосов
/ 14 сентября 2011

Давайте предположим, что у меня есть класс, который определяет объект изображения. Изображение может принадлежать альбому, а альбом может принадлежать папке. Эти данные хранятся в MySQL. Данные также кэшируются. В кеше он хранится в денормализованной форме, то есть папки отслеживают изображения, с которыми они связаны, и альбомы тоже. Это сделано из соображений производительности.

Всякий раз, когда фотография создается сейчас, она добавляется как в папку, так и в альбом в кеше. Поскольку код для добавления фотографий в кеш одинаков, и меняются только ключи кеша, создается отдельный объект с именем CachedImageSet. Папка и альбом создают экземпляр CachedImageSet со своим уникальным идентификатором и типом коллекции, и они вызывают CachedImageSet для добавления и удаления изображений и для получения списка изображений в наборе.

Я не хочу, чтобы клиентский код напрямую взаимодействовал с CachedImageSet, поэтому у меня есть методы в классах папок и альбомов, которые являются обертками для методов CachedImageSet. Это приводит к большому дублированию кода. Есть ли шаблон дизайна, который помог бы мне избавиться от этого дублирования? Я использую PHP, MySQL и Redis (для кеш-слоя).

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Я, возможно, далеко от базы, но если я правильно истолковал ваш вопрос, я бы использовал фабричный шаблон.

Примерно так (что, конечно, упрощенно):

<?php

abstract class Folder {

    public static function factory($driver = 'Database')
    {
        $class = 'Folder_'.str_replace('/', '_', $driver);

        return new $class();
    }

}

class Folder_Database {

    public function get() {
        // Fetch folder from database
    }

    public function save() {
        // Save folder to database
    }

}

class Folder_Cache {

    public function get() {
        // Fetch folder from Redis
    }

    public function save() {
        // Save folder to Redis
    }

}

// Usage:
$folder = Folder::factory('Cache');
$folder->save('....');
0 голосов
/ 14 сентября 2011

MVC - это очень хороший шаблон дизайна, на мой взгляд, но я думаю, что вы должны выбрать тот, который подходит вам больше всего, подходить себе в википедии (Design Patterns)

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