| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .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 4. Базовый класс ImageEffect и производные от него (DropShaddowImageEffect, OuterGlowImageEffect и т.д.) Но лично я, не стал бы заморачиваться с первым и вторым пунктами, а взял бы готовые из System.Drawing. |
| Автор: v00d00 25.3.2009, 14:10 |
| Такс, функциональная часть реализована Теперь нужно выбрать правильную архитектуру Вот такая на данный момент схема: ![]() Основная идея - написать такой класс для картинки, чтобы пользователь смог в дальнейшем добавлять работу с другими форматами графики не меняя код базового класса. Чтобы добавить реализацию работы с новым форматом нужно перекрыть конструктор в наследуемом классе от 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 | ||
Не совсем понятно как будет реализована возможность подключения своих конвертеров. Передавать конвертер в качестве аргумента на методы Load и Save? Кстати фильтры далеко не самая главная часть системы, так как пишу не графический редактор П.С. может есть готовый шаблон который ложится на проблему с форматами картинки? |
| Автор: v00d00 26.3.2009, 00:11 |
| Ну на самом деле я так и сделал) Просто чтобы добавить новый формат в класс(который, допустим, напишу не я), придется наследовать его и переопределять конструктор класса ImplementedImage. Т.е. теряется смысл использования всех этих интерфейсов, и данной абстракции в целом. Т.е. можно было бы просто зашить реализацию работы со всеми форматами в один класс и не парится)) А вот как сделать так чтобы существующему типу, можно было бы свободно добавлять новые обработчики графики, при этом не изменяя работы с классом в целом. П.С. додумался даже до такого Нужен строитель-одиночка, который будет правильно конструировать новые объекты ImplementedImage. Но все равно придется как-то переопределять класс-строитель. Блин замкнутый круг какой-то)) П.П.С. На самом деле задача носит чисто образовательный ( может даже развлекательный |
| Автор: Partizan 26.3.2009, 00:17 |
| v00d00, класс-строитель классически называется фабрикой... |
| Автор: v00d00 26.3.2009, 00:59 |
| Коротко, информативно, познавательно. Это спарта? |
| Автор: mihryak 26.3.2009, 01:10 | ||
http://dofactory.com/patterns/PatternBuilder.aspx#_self1 тоже есть, вместе с фабрикой относятся к порождающим паттернам
посмотри на http://dofactory.com/patterns/PatternTemplate.aspx#_self1 обработчики можно выставить коллекцией наружу (прямо или, как уже советовали, через add-remove) |