Есть у меня одна библиотечка, которая работает, но требуется туда внести значительные изменения.
И пока ещё есть время для глупых вопросов.
Суть такова. Есть сервак, который хранит пространственные данные и когда пользователь обведёт рамкой объекты на карте и отправит войск... ,
необходимо экспортировать, попавшие в выделение слои и объекты, в другой формат — DXF или MID/MIF или ещё какой, который понадобится завтра.
Весь "алгоритм" состоит из нескольких частей:
1. Открываем источник. Он всегда один и тот же.
2. Настраиваем драйвер таргета. Тут могут быть нюансы, в зависимости от формата.
3. Создаём таргет. Тут тоже могут быть нюансы.
4. Начинаем в цикле выгребать из источника слои и в каждом слое объекты. Тут всё одинаково.
5. Что бы скопировать данные надо сделать копию слоёв в таргете.
Т.е. создать слой такой же как в источнике, и структура слоя должна быть такой же или не очень.
И тут уже идут нюансы.
В DXF понятия слоя нет, и атрибуты слоя создавать не надо, всё автоматом драйвером делается.
Типа деление на слои уже идёт в приложениях по полю layer. Что туда понапишем, на такие слои и разобьется.
А вот в MID/MIF уже можно делать всё по-человечески. 1 слой из источника = 1 слой в таргете. И атрибуты слоя надо руками создавать,
как минимум копируя структуру слоя источника.
6. Дальше идёт копирование объекта. Геометрия просто копируется, а атрибуты снова в зависимости от формата. DXF — заполняем поле layer
атрибутом layerName из источника. В MID/MIF придётся как минимум копировать все атрибуты из источника.
7. Ещё могут быть какие-то работы после экспорта. Как-то обрабатываться файлы результата. MID/MIF состоит из двух файлов, значит надо обернуть в zip.
Ну и в зависимости от кодировки может потребоваться обработка файла.
Вопрос в том, стоит ли упираться и как можно сильнее разделить, мол вот код общий для всех, а вот код уже конкретного формата?
Уж очень много точек, где приходится учитывать особенности того или иного формата.
Мой первый вариант был с базовым классом, а в наследнике определяются функции CreateLayerDefn, CopyAttr и т.д. которые в конструкторе наследника,
инициализируют переменные базового класса. И базовый класс, когда надо просто вызывал их в нужный момент.
Но щас глянул на всё это непотребство и думаю, может не гемороиться и тупо весь код копировать в каждый класс для того или иного формата?
Здравствуйте, LevLimin, Вы писали:
LL>Есть у меня одна библиотечка, которая работает, но требуется туда внести значительные изменения. LL>И пока ещё есть время для глупых вопросов.
Вроде как тут общим может быть только код создания коллекции, или обхода нужных элементов.
Метод записи в каждый формат должен быть свой.
Оборачивание в zip — общий метод, для тех форматов где это требуется — вызывать из метода конвертирования формата с подходящими параметрами.
Никакого копипаста при нормальном структурировании не остается. 1 Строчку обхода коллекции или энумерации копипастом не считаем.
Если еще какой то код будет повторяться — выносим в метод.
Здравствуйте, swame, Вы писали:
S>Здравствуйте, LevLimin, Вы писали:
LL>>Есть у меня одна библиотечка, которая работает, но требуется туда внести значительные изменения. LL>>И пока ещё есть время для глупых вопросов.
S>Вроде как тут общим может быть только код создания коллекции, или обхода нужных элементов. S>Метод записи в каждый формат должен быть свой.
Спасибо! Вы избавили меня от метаний. Пока есть время, буду переписывать.