last day (31 days later) » 

4:50 PM
@fori1ton вы тут ?)
в общем как будете тут, напишите )
 
@kxxko, я тут, но с перерывами. Завтра буду стабильнее. Можете пока более подробно описать условия вашей задачи.
 
5:20 PM
@fori1ton
вопрос состоит вот в чем.
Я сейчас разрабатываю приложение "импортирование данных в БД из XML файла"
Как бы все уже рабочее, код работает, но руководитель практики сказал что мой код не для бизнес модели. То есть другой программист там голову скрутит и надо начинать писать хороший код.

Есть классы
1) XML парсер
2) Класс Image
3) Класс Singletone подключения к БД
4) Класс для записи данных в БД

1) - возвращает ListArray<> в котором объекты из XML файла (которые я записываю в БД) И в этих объектах есть путь к фотографии, с которыми я буду проделывать манипуляции различные.
 
 
1 hour later…
6:26 PM
Задачка выглядит несложной, не требующей особых архитектурных изощрений. Я бы решал её так:

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. Записываем результаты в базу данных. При однопоточной реализации особых ухищрений не нужно: просто пишем в соответствующие таблицы обработанные картинки. В случае многопоточной всё становится интереснее. Мы либо ждём завершения всех потоков, и пишем данные в базу, как при однопоточном варианте, либо пишем данные в базу по ходу обработки. Во втором случае стоит реализовать (или использовать готовый из библиотеки) пул соединений - класс, осуществляющий разделение доступа к базе данных.
Подробно можете почитать в Интернете, а в двух словах, суть такова. Открытие и закрытие соединения к базе данных - достаточно трудоёмкая операция. Если вы будете делать это каждый раз, когда какой-либо поток закончит работу, вы сильно затормозите приложение. Выход - при запуске приложения открыть несколько соединений и держать их всё время открытыми.
Пул потоков будет предоставлять доступ к свободным соединениям. Если свободных соединений нет - заставит поток подождать, пока другой поток не освободит соединение.
Что конкретно не понравилось вашему руководителю в вашем коде - сложно сказать, не видя код. Выложите его на github.com (если, конечно, ваша работа не попадает под NDA), тогда критика будет предметной. Из того, что вы написали, можно отметить разве что крайне неудачно выбранные имена классов.
 
Я могу сделать скрин шоты и показать вам код тут ?
И у меня есть проблема. Она заклчается в том, что я не вижу смысла использовать интерфейсы... читал тонну литературы, уроки смотрел
но как правильно их исопльзовать так и не понял (
написать интерфейс и реализовать его - вообще нет проблем
а вот продумать где он нужен
(
сейчас покажу код
 
6:51 PM
Я хотел тут сделать так, что бы при инстанциировании я мог бы обратиться ко всем полям этой инстанции. В дальнейшем мне это понадобиться
@fori1ton совсем плохо все в этом классе написано ?)
Это я еще переделывал
 
7:20 PM
Слышал про такое как фабричный метод, можно ли его тут использовать ?
 

  last day (31 days later) »