Помогите выделить классы

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

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


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


Такс, функциональная часть реализованаТеперь нужно выбрать правильную архитектуруВот такая на данный момент схема:Основная идея - написать такой класс для картинки, чтобы пользователь смог в дальнейшем добавлять работу с другими форматами графики не меняя код базового класса.Чтобы добавить реализацию работы с новым форматом нужно перекрыть конструктор в наследуемом классе от BaseImage и в нем вызвать методы RegisterILoader, RegisterISaver.Вот этот момент собственно меня и смущает.Есть идей как реализовать идею независимости от формата так, чтобы не пришлось вручную вызвать регистрацию интерфейсов, и не переопределять конструктор?


v00d00нужно перекрыть конструктор в наследуемом классе от BaseImage и в нем вызвать методы RegisterILoader, RegisterISaver.слишком сложно.Например можно создать интерфейс ********** и пронаследоваться от IImageLoader, IImageSaver+ вынести общий код в абстрактный классФильтры лучше сделать коллекцией - вдруг надо будет применить более одногоimg.Filters.Add/Remove(...);img.Filters.Apply();фильтры можно также реализовать паттерном Command с возможностью Undo


Например можно создать интерфейс ********** и пронаследоваться от IImageLoader, IImageSaver+ вынести общий код в абстрактный класс
Не совсем понятно как будет реализована возможность подключения своих конвертеров. Передавать конвертер в качестве аргумента на методы Load и Save?Кстати фильтры далеко не самая главная часть системы, так как пишу не графический редактор  . П.С. может есть готовый шаблон который ложится на проблему с форматами картинки?


может есть готовый шаблон который ложится на проблему с форматами картинки?
Ну чем-же вам не нравится как мелкософты сделали???
    Image img = Image.FromFile("............");    img.Save("........", ImageFormat.JPEG);    img.Save("........", ImageFormat.BMP);
Вы можете сделать наподобие:
    ImageBase img = ImageBase.Load("..........", ImgFormats.Jpg);    img.Save("........", ImgFormats.Pcx);


Ну на самом  деле я так и сделал)Просто чтобы добавить новый формат в класс(который, допустим, напишу не я), придется наследовать его и переопределять конструктор класса ImplementedImage. Т.е. теряется смысл использования всех этих интерфейсов, и данной абстракции в целом. Т.е. можно было бы просто зашить реализацию работы со всеми форматами в один класс и не парится))А вот как сделать так чтобы существующему типу, можно было бы свободно добавлять новые обработчики графики, при этом не изменяя работы с классом в целом.П.С. додумался даже до такогоНужен строитель-одиночка, который будет правильно конструировать новые объекты ImplementedImage. Но все равно придется как-то переопределять класс-строитель. Блин замкнутый круг какой-то))П.П.С.На самом деле задача носит чисто образовательный ( может даже развлекательный   ) характер. Поэтому хочется позамарачиваться со структурой системы)


v00d00, класс-строитель классически называется фабрикой...


Коротко, информативно, познавательно.Это спарта?  


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