Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Помогите выделить классы


Автор: v00d00 20.3.2009, 19:28
Доброго времени суток.

Задача:
Необходимо написать программу для загрузки файлов формата bmp (без стандартных компонент)
После загрузки необходимо зашумить определенный цвет ( задается пользователем )
Затем применить фильтр к пикселям растра ( в принципе их может быть несколько )
Разложить растр в HSB из RGB
Сохранить растр в формате PCX

Сейчас у меня используется два класса: форма и один большой класс в котором собираюсь реализовать все выше написаное

Какие бы вы выделили классы?

Автор: kosmonaFFFt 20.3.2009, 21:38
Навскидку - по классу на формат + методы конвертации к ним.
Класс фильтра и интерфейс для его наложения в стиле Рисунок.ПрименитьФильтр(Фильтр)

Автор: -Mikle- 21.3.2009, 10:51
Также как уже сделали другие до тебя... а зачем тебе собственный велосипед? если только для самотренировки...

1. Базовый класс Image и производные от него (Bitmap, Metafile и т.д.)
2. Классы encoder-decoder для чтения-записи различных форматов
3. Базовый класс ImageFilter и производные от него (BlurImageFilter, MosaicaImageFilter  smile  и т.д.)
4. Базовый класс ImageEffect и производные от него (DropShaddowImageEffect, OuterGlowImageEffect и т.д.)

Но лично я, не стал бы заморачиваться с первым и вторым пунктами, а взял бы готовые из System.Drawing.

Автор: v00d00 25.3.2009, 14:10
Такс, функциональная часть реализована

Теперь нужно выбрать правильную архитектуру

Вот такая на данный момент схема:
user posted image

Основная идея - написать такой класс для картинки, чтобы пользователь смог в дальнейшем добавлять работу с другими форматами графики не меняя код базового класса.

Чтобы добавить реализацию работы с новым форматом нужно перекрыть конструктор в наследуемом классе от BaseImage и в нем вызвать методы RegisterILoader, RegisterISaver.

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

Автор: Rififi 25.3.2009, 14:37
v00d00, 
нужно перекрыть конструктор в наследуемом классе от BaseImage и в нем вызвать методы RegisterILoader, RegisterISaver.
слишком сложно.

Например можно создать интерфейс IBaseImage и пронаследоваться от IImageLoader, IImageSaver
+ вынести общий код в абстрактный класс

Фильтры лучше сделать коллекцией - вдруг надо будет применить более одного
img.Filters.Add/Remove(...);
img.Filters.Apply();

фильтры можно также реализовать паттерном Command с возможностью Undo

Автор: v00d00 25.3.2009, 15:17
Цитата(Rififi @ 25.3.2009,  14:37)


Например можно создать интерфейс IBaseImage и пронаследоваться от IImageLoader, IImageSaver
+ вынести общий код в абстрактный класс


Не совсем понятно как будет реализована возможность подключения своих конвертеров. Передавать конвертер в качестве аргумента на методы Load и Save?

Кстати фильтры далеко не самая главная часть системы, так как пишу не графический редактор  smile. 

П.С. может есть готовый шаблон который ложится на проблему с форматами картинки?

Автор: -Mikle- 25.3.2009, 20:30
Цитата(v00d00 @  25.3.2009,  18:17 Найти цитируемый пост)
может есть готовый шаблон который ложится на проблему с форматами картинки?

Ну чем-же вам не нравится как мелкософты сделали???

Код

    Image img = Image.FromFile("............");
    img.Save("........", ImageFormat.JPEG);
    img.Save("........", ImageFormat.BMP);


Вы можете сделать наподобие:
Код

    ImageBase img = ImageBase.Load("..........", ImgFormats.Jpg);
    img.Save("........", ImgFormats.Pcx);

Автор: v00d00 26.3.2009, 00:11
Ну на самом  деле я так и сделал)
Просто чтобы добавить новый формат в класс(который, допустим, напишу не я), придется наследовать его и переопределять конструктор класса ImplementedImage. Т.е. теряется смысл использования всех этих интерфейсов, и данной абстракции в целом. Т.е. можно было бы просто зашить реализацию работы со всеми форматами в один класс и не парится))


А вот как сделать так чтобы существующему типу, можно было бы свободно добавлять новые обработчики графики, при этом не изменяя работы с классом в целом.


П.С. додумался даже до такого

Нужен строитель-одиночка, который будет правильно конструировать новые объекты ImplementedImage. Но все равно придется как-то переопределять класс-строитель. Блин замкнутый круг какой-то))

П.П.С.

На самом деле задача носит чисто образовательный ( может даже развлекательный  smile ) характер. Поэтому хочется позамарачиваться со структурой системы)


Автор: Partizan 26.3.2009, 00:17
v00d00, класс-строитель классически называется фабрикой...

Автор: v00d00 26.3.2009, 00:59
Коротко, информативно, познавательно.
Это спарта? smile 

Автор: mihryak 26.3.2009, 01:10
Цитата(Partizan @  26.3.2009,  01:17 Найти цитируемый пост)
класс-строитель классически называется фабрикой... 

http://dofactory.com/patterns/PatternBuilder.aspx#_self1 тоже есть, вместе с фабрикой относятся к порождающим паттернам

Цитата(v00d00 @  26.3.2009,  01:11 Найти цитируемый пост)
А вот как сделать так чтобы существующему типу, можно было бы свободно добавлять новые обработчики графики, при этом не изменяя работы с классом в целом.

посмотри на http://dofactory.com/patterns/PatternTemplate.aspx#_self1
обработчики можно выставить коллекцией наружу (прямо или, как уже советовали, через add-remove)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)