5:20 PM
@fori1ton
вопрос состоит вот в чем.
Я сейчас разрабатываю приложение "импортирование данных в БД из XML файла"
Как бы все уже рабочее, код работает, но руководитель практики сказал что мой код не для бизнес модели. То есть другой программист там голову скрутит и надо начинать писать хороший код.
Есть классы
1) XML парсер
2) Класс Image
3) Класс Singletone подключения к БД
4) Класс для записи данных в БД
1) - возвращает ListArray<> в котором объекты из XML файла (которые я записываю в БД) И в этих объектах есть путь к фотографии, с которыми я буду проделывать манипуляции различные.
вопрос состоит вот в чем.
Я сейчас разрабатываю приложение "импортирование данных в БД из XML файла"
Как бы все уже рабочее, код работает, но руководитель практики сказал что мой код не для бизнес модели. То есть другой программист там голову скрутит и надо начинать писать хороший код.
Есть классы
1) XML парсер
2) Класс Image
3) Класс Singletone подключения к БД
4) Класс для записи данных в БД
1) - возвращает ListArray<> в котором объекты из XML файла (которые я записываю в БД) И в этих объектах есть путь к фотографии, с которыми я буду проделывать манипуляции различные.
1 hour later…
6:26 PM
Задачка выглядит несложной, не требующей особых архитектурных изощрений. Я бы решал её так:
1. Загружаем информацию об изображениях. Этим занимается класс XmlImageDataLoader, который реализует интерфейс ImageDataLoader. Зачем так сложно? Затем, что в случае необходимости вы сможете легко заменить реализацию ImageDataLoader'а на другую, загружающую информацию из сети, БД или файловой системы, не меняя код, который от него зависит. Одно из основных правил хорошего дизайна - слабая связанность. Чем меньше компоненты программы знают друг о друге, тем легче их изменять и заменять. Метод ImageDa…
1. Загружаем информацию об изображениях. Этим занимается класс XmlImageDataLoader, который реализует интерфейс ImageDataLoader. Зачем так сложно? Затем, что в случае необходимости вы сможете легко заменить реализацию ImageDataLoader'а на другую, загружающую информацию из сети, БД или файловой системы, не меняя код, который от него зависит. Одно из основных правил хорошего дизайна - слабая связанность. Чем меньше компоненты программы знают друг о друге, тем легче их изменять и заменять. Метод ImageDa…
2. Собственно обработка изображений. Создаём интерфейс ImageProcessor, содержащий единственный метод Collection<Image> processImageData(ImageData image). Создаём класс, например, ImageSplicer, реализующий этот интерфейс. Метод processImageData этого класса будет загружать картинку, применять преобразования и возвращать коллекцию объектов Image - обработанных изображений.
Судя по условию задачи, вам нужно разрезать катринку на квадратики разной величины - разумным будет передавать размер кавдратиков в конструктор ImageSplicer и использовать это значение при обработке:
ImageProcessor splicer100px = new ImageSplicer(100); ImageProcessor splicer200px = new ImageSplicer(200); Collection<Image> tiles100px = splicer100px.processImageData(imageData); Collection<Image> tiles200px = splicer200px.processImageData(imageData);
3. Скармливаем список ImageData, полученный из XML ImageProcessor'ам. В однопоточном варианте просто проходим циклом по списку и применяем ImageProcessor'ы. В многопоточном - разделяем список на несколько частей (по числу потоков), создаём потоки, делающие то же, что и однопоточная версия, и запускаем. Здесь будет удобно воспользоваться готовыми инструментами из JDK - ThreadPoolExecutor, который позволит выстроить очередь задач и запустить их в несколько потоков.
4. Записываем результаты в базу данных. При однопоточной реализации особых ухищрений не нужно: просто пишем в соответствующие таблицы обработанные картинки. В случае многопоточной всё становится интереснее. Мы либо ждём завершения всех потоков, и пишем данные в базу, как при однопоточном варианте, либо пишем данные в базу по ходу обработки. Во втором случае стоит реализовать (или использовать готовый из библиотеки) пул соединений - класс, осуществляющий разделение доступа к базе данных.
Подробно можете почитать в Интернете, а в двух словах, суть такова. Открытие и закрытие соединения к базе данных - достаточно трудоёмкая операция. Если вы будете делать это каждый раз, когда какой-либо поток закончит работу, вы сильно затормозите приложение. Выход - при запуске приложения открыть несколько соединений и держать их всё время открытыми.
next day → last day (31 days later) »