Несколько методов импорта / экспорта с разными параметрами - PullRequest
3 голосов
/ 02 сентября 2011

У меня есть 2 метода экспортера (планируя иметь больше), которые по сути берут мое определение спрайта от моего создателя спрайтов и экспортируют его в файл PNG и файл XML, который описывает PNG. Прямо сейчас я добавил эти два метода в свой класс Sprite для тестирования, но они на самом деле не принадлежат ему. Поэтому я подумал, что было бы хорошо, если бы я создал интерфейс для экспортеров и импортеров, а затем имел один класс для каждого типа импортеров / экспортеров, верно?

Теперь проблема в том, что два моих метода не имеют одинаковых параметров, поэтому я не могу использовать интерфейс очень легко.

Первый экспортер - это «организованный» экспортер, который экспортирует кадры таким образом, что люди могут легко следовать, без ограничений. Было бы просто взять определение спрайта и имя файла (без расширения), чтобы получить пару файлов.

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

XML идентичен для существующих экспортеров, но PNG отличается. Некоторое время спустя я мог бы захотеть иметь других экспортеров метаданных, таких как JSON.

Для существующих экспортеров они оба следуют этой схеме:

  • Определить размер выходного PNG ( Разное для каждого метода)
  • Создание растрового объекта с таким размером
  • Настройте и начните запись в мой XML-файл
  • Запишите кучу метаданных, которые пока не относятся к фреймам
  • Итерация по каждой последовательности (немного сложнее, чем кажется)
    • Для каждого кадра:
      • Выясните, куда пойдет кадр ( Различный для каждого метода)
      • Введите информацию об этом кадре, включая расположение и размер спрайт-листа сверху
      • Нарисуйте рамку для выходного растрового изображения в месте и размере, рассчитанном выше
  • Сохранить и закрыть файлы

Я могу предоставить ссылку на код по запросу.

(я добавил вопрос "Импортер", потому что я хочу добавить импортеров к этим экспортерам однажды)

Есть какие-нибудь предложения о том, как я могу вывести этих экспортеров из моего класса Sprite и как их связать?

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Полагаю, было бы лучше, если бы вы создали какой-то базовый класс экспорта, который имеет только некоторые базовые функции, общие для всех классов экспорта, например addSprite или saveToFile. после этого вы можете создать некоторые другие классы, которые наследуют этот, плюс у них есть специальные функции для добавления параметров сохранения, что-то вроде этого:

class baseExported
{
    public abstract void addSprite(Bitmap texture);
    public abstract bool export(String target);
};

class ExporterA : baseExporter
{
    public override void addSprite(...) {...};
    public override bool export(...) {...};
}

class ExporterB : baseExporter
{
    public override void addSprite(...) {...};
    public override void setMaxDimentions(int maxHeight,int maxWidth) {...};
    public override bool export(...) {...};
}

class ExporterC : baseExporter
{
    public override void addSprite(...) {...};
    public override void setMaxDimentions(int maxHeight,int maxWidth) {...};
    public override void addMetaData(String someData) {...};
    public override bool export(...) {...};
}
1 голос
/ 02 сентября 2011

Я бы определил экспортер для каждого уникального пункта назначения (PNG, XML и т. Д.). Затем я бы собрал классы Exporter, которые реализовали один или несколько из этих интерфейсов. Вы можете создать их на фабрике («Дайте мне всех экспортеров, которые обрабатывают PNG / изображения»). Одним из них будет SpriteExporter.

Вариантом этого (но не исключительного) является классификация / организация экспортеров по входам (что они могут экспортировать).

Вместо того чтобы сказать IPNGExporter.ExportToPNG(Sprite) вы бы сказали IPNGExporter.ExportToPNG(IExportable)

Вы могли бы пойти дальше и сказать IExportableToImage, но я не понимаю, как это действительно увеличило бы мою голову.

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