Архитектура (ООП)
Давно не был на форуме, и зайдя, ужаснулся: структура форума стала просто отвратительной. Надеюсь админ это читает:D
Прошу прощения за оффтоп, перейду сразу к вопросу.
Вопрос у меня в следующем:
Реализую систему вывода изображений. Можно представить, что это некий графический редактор, в котором изображение составляется из отдельных элементов.
У меня таких элементов несколько: это текст (и его вариации), картинка и т.д.
Набросал следующую архитектуру:
абстрактный класс Object, имеет поля (координаты, размеры) и абстрактный метод draw()
От этого абстрактного класса наследуются все атомарные графические классы (текст, картинка и т.д.)
Имеется класс Image, который содержит свои поля и методы, а также является контейнером для указанных выше атомарных объектов. Один из методов класса Image это render(). В этом методе в цикле прогоняются объекты и для каждого из них вызывается метод draw().
При сохранении в файл, объект класса Image просто сериализуется. При загрузке - десериализуется соответственно.
Всё бы хорошо, но я немного заступорился на следующем моменте:
Объект "Текст" содержит поле "имя файла шрифта", которым рисуется этот текст. При сохранении этого объекта хранить нужно только имя шрифта, но не путь к нему.
Вопрос такой: какая сущность, по логике вещей должна настраивать объект "Текст", добавляя к шрифту еще и путь, а при сериализации, удаляя этот путь?
Пишу это на PHP. Самый очевидный вариант - добавить к объекту "Текст" метод __sleep() и при сериализации стирать путь.
Добавлять же путь будет объект "Конструктор", который будет брать из контейнера Image все текстовые объекты и исправлять в них путь.
Воторой вариант - жестко прописать какой-либо глобальный конфиг, из которого объект "Текст" будет сам брать настройки.
Помогите разобраться, как будет всё-таки правильнее?
Если пути к шрифтам (картинкам, стилям) являются параметрами окружения, они должны передаваться как окружение в класс или процедуру сохранения/загрузки, чтобы в файле хранились только перемещаемые, абстрактные данные, а конфигурация на каждом узле (домене, сервере, сайте) может и должна быть своя.